ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3J5cHRvL2FwaS1pbnRyby50eHQgYi9Eb2N1bWVudGF0aW9uL2NyeXB0by9hcGktaW50cm8udHh0CmluZGV4IDVhMDNhMjguLmU0MWE3OWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3J5cHRvL2FwaS1pbnRyby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcnlwdG8vYXBpLWludHJvLnR4dApAQCAtMTkzLDYgKzE5Myw3IEBACiAgIEthcnRpa2V5IE1haGVuZHJhIEJoYXR0IChDQVNUNikKICAgSm9uIE9iZXJoZWlkZSAoQVJDNCkKICAgSm91bmkgTWFsaW5lbiAoTWljaGFlbCBNSUMpCisgIE5UVChOaXBwb24gVGVsZWdyYXBoIGFuZCBUZWxlcGhvbmUgQ29ycG9yYXRpb24pIChDYW1lbGxpYSkKIAogU0hBMSBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogICBKZWFuLUZyYW5jb2lzIERpdmUKQEAgLTI0Niw2ICsyNDcsOSBAQAogVklBIFBhZExvY2sgY29udHJpYnV0b3JzOgogICBNaWNoYWwgTHVkdmlnCiAKK0NhbWVsbGlhIGFsZ29yaXRobSBjb250cmlidXRvcnM6CisgIE5UVChOaXBwb24gVGVsZWdyYXBoIGFuZCBUZWxlcGhvbmUgQ29ycG9yYXRpb24pIChDYW1lbGxpYSkKKwogR2VuZXJpYyBzY2F0dGVyd2FsayBjb2RlIGJ5IEFkYW0gSi4gUmljaHRlciA8YWRhbUB5Z2dkcmFzaWwuY29tPgogCiBQbGVhc2Ugc2VuZCBhbnkgY3JlZGl0cyB1cGRhdGVzIG9yIGNvcnJlY3Rpb25zIHRvOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IDJkYzVlNWQuLjRhMWQ4OTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTE4NiwxOCArMTg2LDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoYXQ6CWZpbmRfdHJ5bG9ja19wYWdlCi1XaGVuOglKYW51YXJ5IDIwMDcKLVdoeToJVGhlIGludGVyZmFjZSBubyBsb25nZXIgaGFzIGFueSBjYWxsZXJzIGxlZnQgaW4gdGhlIGtlcm5lbC4gSXQKLQlpcyBhbiBvZGQgaW50ZXJmYWNlIChjb21wYXJlZCB3aXRoIG90aGVyIGZpbmRfKl9wYWdlIGZ1bmN0aW9ucyksIGluCi0JdGhhdCBpdCBkb2VzIG5vdCB0YWtlIGEgcmVmY291bnQgdG8gdGhlIHBhZ2UsIG9ubHkgdGhlIHBhZ2UgbG9jay4KLQlJdCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBmaW5kX2dldF9wYWdlIG9yIGZpbmRfbG9ja19wYWdlIGlmIHBvc3NpYmxlLgotCVRoaXMgZmVhdHVyZSByZW1vdmFsIGNhbiBiZSByZWV2YWx1YXRlZCBpZiB1c2VycyBvZiB0aGUgaW50ZXJmYWNlCi0JY2Fubm90IGNsZWFubHkgdXNlIHNvbWV0aGluZyBlbHNlLgotV2hvOglOaWNrIFBpZ2dpbiA8bnBpZ2dpbkBzdXNlLmRlPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJSW50ZXJydXB0IG9ubHkgU0FfKiBmbGFncwogV2hlbjoJSmFudWFyIDIwMDcKIFdoeToJVGhlIGludGVycnVwdCByZWxhdGVkIFNBXyogZmxhZ3MgYXJlIHJlcGxhY2VkIGJ5IElSUUZfKiB0byBtb3ZlIHRoZW0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKaW5kZXggOWZlZjIxMC4uYzMwZmYxYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKQEAgLTI0Miw2ICsyNDIsMTIgQEAKICAgICBhYzk3X2Nsb2NrCQktIEFDJzk3IGNsb2NrIChkZWZhdWx0ID0gNDgwMDApCiAgICAgYWM5N19xdWlyawkJLSBBQyc5NyB3b3JrYXJvdW5kIGZvciBzdHJhbmdlIGhhcmR3YXJlCiAJCQkgIFNlZSAiQUM5NyBRdWlyayBPcHRpb24iIHNlY3Rpb24gYmVsb3cuCisgICAgYWM5N19jb2RlYwkJLSBXb3JrYXJvdW5kIHRvIHNwZWNpZnkgd2hpY2ggQUMnOTcgY29kZWMgCisJCQkgIGluc3RlYWQgb2YgcHJvYmluZy4gIElmIHRoaXMgd29ya3MgZm9yIHlvdQorCQkJICBmaWxlIGEgYnVnIHdpdGggeW91ciBgbHNwY2kgLXZuYCBvdXRwdXQuCisJCQkgIC0yICAtLSBGb3JjZSBwcm9iaW5nLgorCQkJICAtMSAgLS0gRGVmYXVsdCBiZWhhdmlvci4KKwkJCSAgMC0yIC0tIFVzZSB0aGUgc3BlY2lmaWVkIGNvZGVjLgogICAgIHNwZGlmX2FjbGluawktIFMvUERJRiB0cmFuc2ZlciBvdmVyIEFDLWxpbmsgKGRlZmF1bHQgPSAxKQogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgb25lIGNhcmQgYW5kIGF1dG9wcm9iZS4KQEAgLTc3OSw2ICs3ODUsNyBAQAogCSAgYXN1cy1kaWcJQVNVUyB3aXRoIFNQRElGIG91dAogCSAgYXN1cy1kaWcyCUFTVVMgd2l0aCBTUERJRiBvdXQgKHVzaW5nIEdQSU8yKQogCSAgdW5pd2lsbAkzLWphY2sKKwkgIGZ1aml0c3UJRnVqaXRzdSBMYXB0b3BzIChQaTE1MzYpCiAJICBGMTczNAkJMi1qYWNrCiAJICBsZwkJTEcgbGFwdG9wIChtMSBleHByZXNzIGR1YWwpCiAJICBsZy1sdwkJTEcgTFcyMC9MVzI1IGxhcHRvcApAQCAtODAwLDE0ICs4MDcsMTggQEAKIAlBTEMyNjIKIAkgIGZ1aml0c3UJRnVqaXRzdSBMYXB0b3AKIAkgIGhwLWJwYwlIUCB4dzQ0MDAvNjQwMC84NDAwLzk0MDAgbGFwdG9wcworCSAgaHAtYnBjLWQ3MDAwCUhQIEJQQyBENzAwMAogCSAgYmVucQkJQmVucSBFRDgKKwkgIGhpcHBvCQlIaXBwbyAoQVRJKSB3aXRoIGphY2sgZGV0ZWN0aW9uLCBTb255IFVYLTkwcworCSAgaGlwcG9fMQlIaXBwbyAoQmVucSkgd2l0aCBqYWNrIGRldGVjdGlvbgogCSAgYmFzaWMJCWZpeGVkIHBpbiBhc3NpZ25tZW50IHcvbyBTUERJRgogCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiAJQUxDODgyLzg4NQogCSAgM3N0YWNrLWRpZwkzLWphY2sgd2l0aCBTUERJRiBJL08KLQkgIDZzdGNrLWRpZwk2LWphY2sgZGlnaXRhbCB3aXRoIFNQRElGIEkvTworCSAgNnN0YWNrLWRpZwk2LWphY2sgZGlnaXRhbCB3aXRoIFNQRElGIEkvTwogCSAgYXJpbWEJCUFyaW1hIFc4MjBEaTEKKwkgIG1hY3BybwlNYWNQcm8gc3VwcG9ydAogCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiAJQUxDODgzLzg4OApAQCAtODE3LDYgKzgyOCwxMCBAQAogCSAgM3N0YWNrLTZjaC1kaWcgMy1qYWNrIDYtY2hhbm5lbCB3aXRoIFNQRElGIEkvTwogCSAgNnN0YWNrLWRpZy1kZW1vICA2LWphY2sgZGlnaXRhbCBmb3IgSW50ZWwgZGVtbyBib2FyZAogCSAgYWNlcgkJQWNlciBsYXB0b3BzIChUcmF2ZWxtYXRlIDMwMTJXVE1pLCBBc3BpcmUgNTYwMCwgZXRjKQorCSAgbWVkaW9uCU1lZGlvbiBMYXB0b3BzCisJICB0YXJnYS1kaWcJVGFyZ2EvTVNJCisJICB0YXJnYS0yY2gtZGlnCVRhcmdzL01TSSB3aXRoIDItY2hhbm5lbAorCSAgbGFwdG9wLWVhcGQgICAzLWphY2sgd2l0aCBTUERJRiBJL08gYW5kIEVBUEQgKENsZXZvIE01NDBKRSwgTTU1MEpFKQogCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiAJQUxDODYxLzY2MApAQCAtODI1LDYgKzg0MCwxNiBAQAogCSAgNnN0YWNrLWRpZwk2LWphY2sgd2l0aCBTUERJRiBJL08KIAkgIDNzdGFjay02NjAJMy1qYWNrIChmb3IgQUxDNjYwKQogCSAgdW5pd2lsbC1tMzEJVW5pd2lsbCBNMzEgbGFwdG9wCisJICB0b3NoaWJhCVRvc2hpYmEgbGFwdG9wIHN1cHBvcnQKKwkgIGFzdXMJCUFzdXMgbGFwdG9wIHN1cHBvcnQKKwkgIGFzdXMtbGFwdG9wCUFTVVMgRjIvRjMgbGFwdG9wcworCSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQorCisJQUxDODYxVkQvNjYwVkQKKwkgIDNzdGFjawkzLWphY2sKKwkgIDNzdGFjay1kaWcJMy1qYWNrIHdpdGggU1BESUYgT1VUCisJICA2c3RhY2stZGlnCTYtamFjayB3aXRoIFNQRElGIE9VVAorCSAgM3N0YWNrLTY2MAkzLWphY2sgKGZvciBBTEM2NjBWRCkKIAkgIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKIAogCUNNSTk4ODAKQEAgLTg0NSw2ICs4NzAsNyBAQAogCSAgM3N0YWNrCTMtc3RhY2ssIHNoYXJlZCBzdXJyb3VuZHMKIAkgIGxhcHRvcAkyLWNoYW5uZWwgb25seSAoRlNDIFYyMDYwLCBTYW1zdW5nIE01MCkKIAkgIGxhcHRvcC1lYXBkCTItY2hhbm5lbCB3aXRoIEVBUEQgKFNhbXN1bmcgUjY1LCBBU1VTIEE2SikKKwkgIHVsdHJhCQkyLWNoYW5uZWwgd2l0aCBFQVBEIChTYW1zdW5nIFVsdHJhIHRhYmxldCBQQykKIAogCUFEMTk4OAogCSAgNnN0YWNrCTYtamFjawpAQCAtODU0LDEyICs4ODAsMzEgQEAKIAkgIGxhcHRvcAkzLWphY2sgd2l0aCBocC1qYWNrIGF1dG9tdXRlCiAJICBsYXB0b3AtZGlnCWRpdHRvIHdpdGggU1BESUYKIAkgIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKKwkKKwlDb25leGFudCA1MDQ1CisJICBsYXB0b3AJTGFwdG9wIGNvbmZpZyAKKwkgIHRlc3QJCWZvciB0ZXN0aW5nL2RlYnVnZ2luZyBwdXJwb3NlLCBhbG1vc3QgYWxsIGNvbnRyb2xzCisJCQljYW4gYmUgYWRqdXN0ZWQuICBBcHBlYXJpbmcgb25seSB3aGVuIGNvbXBpbGVkIHdpdGgKKwkJCSRDT05GSUdfU05EX0RFQlVHPXkKKworCUNvbmV4YW50IDUwNDcKKwkgIGxhcHRvcAlCYXNpYyBMYXB0b3AgY29uZmlnIAorCSAgbGFwdG9wLWhwCUxhcHRvcCBjb25maWcgZm9yIHNvbWUgSFAgbW9kZWxzIChzdWJkZXZpY2UgMzBBNSkKKwkgIGxhcHRvcC1lYXBkCUxhcHRvcCBjb25maWcgd2l0aCBFQVBEIHN1cHBvcnQKKwkgIHRlc3QJCWZvciB0ZXN0aW5nL2RlYnVnZ2luZyBwdXJwb3NlLCBhbG1vc3QgYWxsIGNvbnRyb2xzCisJCQljYW4gYmUgYWRqdXN0ZWQuICBBcHBlYXJpbmcgb25seSB3aGVuIGNvbXBpbGVkIHdpdGgKKwkJCSRDT05GSUdfU05EX0RFQlVHPXkKIAogCVNUQUM5MjAwLzkyMDUvOTIyMC85MjIxLzkyNTQKIAkgIHJlZgkJUmVmZXJlbmNlIGJvYXJkCiAJICAzc3RhY2sJRDk0NSAzc3RhY2sKIAkgIDVzdGFjawlEOTQ1IDVzdGFjayArIFNQRElGCiAKKwlTVEFDOTIwMi85MjUwLzkyNTEKKwkgIHJlZgkJUmVmZXJlbmNlIGJvYXJkLCBiYXNlIGNvbmZpZworCSAgbTItMgkJU29tZSBHYXRld2F5IE1YIHNlcmllcyBsYXB0b3BzCisJICBtNgkJU29tZSBHYXRld2F5IE5YIHNlcmllcyBsYXB0b3BzCisKIAlTVEFDOTIyNy85MjI4LzkyMjkvOTI3eAogCSAgcmVmCQlSZWZlcmVuY2UgYm9hcmQKIAkgIDNzdGFjawlEOTY1IDNzdGFjawpAQCAtOTc0LDYgKzEwMTksNyBAQAogICAgIE1vZHVsZSBmb3IgRW52eTI0SFQgKFZUL0lDRTE3MjQpLCBFbnZ5MjRQVCAoVlQxNzIwKSBiYXNlZCBQQ0kgc291bmQgY2FyZHMuCiAJCQkqIE1pZGlNYW4gTSBBdWRpbyBSZXZvbHV0aW9uIDUuMQogCQkJKiBNaWRpTWFuIE0gQXVkaW8gUmV2b2x1dGlvbiA3LjEKKwkJCSogTWlkaU1hbiBNIEF1ZGlvIEF1ZGlvcGhpbGUgMTkyCiAJCQkqIEFNUCBMdGQgQVVESU8yMDAwCiAJCQkqIFRlcnJhVGVjIEF1cmVvbiA1LjEgU2t5CiAJCQkqIFRlcnJhVGVjIEF1cmVvbiA3LjEgU3BhY2UKQEAgLTk5Myw3ICsxMDM5LDcgQEAKIAogICAgIG1vZGVsICAgICAgIC0gVXNlIHRoZSBnaXZlbiBib2FyZCBtb2RlbCwgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAJCSAgcmV2bzUxLCByZXZvNzEsIGFtcDIwMDAsIHByb2RpZ3k3MSwgcHJvZGlneTcxbHQsCi0JCSAgcHJvZGlneTE5MiwgYXVyZW9uNTEsIGF1cmVvbjcxLCB1bml2ZXJzZSwKKwkJICBwcm9kaWd5MTkyLCBhdXJlb241MSwgYXVyZW9uNzEsIHVuaXZlcnNlLCBhcDE5MiwKIAkJICBrOHg4MDAsIHBoYXNlMjIsIHBoYXNlMjgsIG1zMzAwLCBhdjcxMAogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgbXVsdGlwbGUgY2FyZHMgYW5kIGF1dG9wcm9iZS4KQEAgLTEwNDksNiArMTA5NSw5IEBACiAgICAgYnVnZ3lfc2VtYXBob3JlIC0gRW5hYmxlIHdvcmthcm91bmQgZm9yIGhhcmR3YXJlcyB3aXRoIGJ1Z2d5CiAJCSAgICBzZW1hcGhvcmVzIChlLmcuIG9uIHNvbWUgQVNVUyBsYXB0b3BzKQogCQkgICAgKGRlZmF1bHQgb2ZmKQorICAgIHNwZGlmX2FjbGluayAgLSBVc2UgUy9QRElGIG92ZXIgQUMtbGluayBpbnN0ZWFkIG9mIGRpcmVjdCBjb25uZWN0aW9uCisJCSAgICBmcm9tIHRoZSBjb250cm9sbGVyIGNoaXAKKwkJICAgICgwID0gb2ZmLCAxID0gb24sIC0xID0gZGVmYXVsdCkKIAogICAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG9uZSBjaGlwIGFuZCBhdXRvcHJvYmUuCiAKQEAgLTEzNzEsNiArMTQyMCwxMyBAQAogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgbXVsdGlwbGUgY2FyZHMuCiAKKyAgTW9kdWxlIHNuZC1wb3J0bWFuMng0CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTW9kdWxlIGZvciBNaWRpbWFuIFBvcnRtYW4gMng0IHBhcmFsbGVsIHBvcnQgTUlESSBpbnRlcmZhY2UKKworICAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG11bHRpcGxlIGNhcmRzLgorCiAgIE1vZHVsZSBzbmQtcG93ZXJtYWMgKG9uIHBwYyBvbmx5KQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0RvY0Jvb2svYWxzYS1kcml2ZXItYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay9hbHNhLWRyaXZlci1hcGkudG1wbAppbmRleCAxZjNhZTNlLi5jNGQyZTM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay9hbHNhLWRyaXZlci1hcGkudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay9hbHNhLWRyaXZlci1hcGkudG1wbApAQCAtMzYsNyArMzYsNyBAQAogICA8L2Jvb2tpbmZvPgogCiAgIDxjaGFwdGVyPjx0aXRsZT5NYW5hZ2VtZW50IG9mIENhcmRzIGFuZCBEZXZpY2VzPC90aXRsZT4KLSAgICAgPHNlY3QxPjx0aXRsZT5DYXJkIE1hbmFnbWVudDwvdGl0bGU+CisgICAgIDxzZWN0MT48dGl0bGU+Q2FyZCBNYW5hZ2VtZW50PC90aXRsZT4KICFFc291bmQvY29yZS9pbml0LmMKICAgICAgPC9zZWN0MT4KICAgICAgPHNlY3QxPjx0aXRsZT5EZXZpY2UgQ29tcG9uZW50czwvdGl0bGU+CkBAIC01OSw3ICs1OSw3IEBACiAgICAgIDxzZWN0MT48dGl0bGU+UENNIEZvcm1hdCBIZWxwZXJzPC90aXRsZT4KICFFc291bmQvY29yZS9wY21fbWlzYy5jCiAgICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+UENNIE1lbW9yeSBNYW5hZ21lbnQ8L3RpdGxlPgorICAgICA8c2VjdDE+PHRpdGxlPlBDTSBNZW1vcnkgTWFuYWdlbWVudDwvdGl0bGU+CiAhRXNvdW5kL2NvcmUvcGNtX21lbW9yeS5jCiAgICAgIDwvc2VjdDE+CiAgIDwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbAppbmRleCBjY2QwYTk1Li43NGQzYTM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCkBAIC0xMzYwLDggKzEzNjAsNyBAQAogICAgICAgICA8aW5mb3JtYWxleGFtcGxlPgogICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KIDwhW0NEQVRBWwotICBzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX215Y2hpcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisgIHN0YXRpYyBpcnFyZXR1cm5fdCBzbmRfbXljaGlwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiAgIHsKICAgICAgICAgICBzdHJ1Y3QgbXljaGlwICpjaGlwID0gZGV2X2lkOwogICAgICAgICAgIC4uLi4KQEAgLTIxMjcsNyArMjEyNiw3IEBACiAJYWNjZXNzaWJsZSB2aWEgPGNvbnN0YW50PnN1YnN0cmVhbS0mZ3Q7cnVudGltZTwvY29uc3RhbnQ+LgogCVRoaXMgcnVudGltZSBwb2ludGVyIGhvbGRzIHRoZSB2YXJpb3VzIGluZm9ybWF0aW9uOyBpdCBob2xkcwogCXRoZSBjb3B5IG9mIGh3X3BhcmFtcyBhbmQgc3dfcGFyYW1zIGNvbmZpZ3VyYXRpb25zLCB0aGUgYnVmZmVyCi0JcG9pbnRlcnMsIG1tYXAgcmVjb3Jkcywgc3BpbmxvY2tzLCBldGMuICBBbG1vc3QgZXZlcnloaW5nIHlvdQorCXBvaW50ZXJzLCBtbWFwIHJlY29yZHMsIHNwaW5sb2NrcywgZXRjLiAgQWxtb3N0IGV2ZXJ5dGhpbmcgeW91CiAJbmVlZCBmb3IgY29udHJvbGxpbmcgdGhlIFBDTSBjYW4gYmUgZm91bmQgdGhlcmUuCiAJPC9wYXJhPgogCkBAIC0yMzQwLDcgKzIzMzksNyBAQAogCiAJPHBhcmE+CiAJICBXaGVuIHRoZSBQQ00gc3Vic3RyZWFtcyBjYW4gYmUgc3luY2hyb25pemVkICh0eXBpY2FsbHksCi0Jc3luY2hvcmluaXplZCBzdGFydC9zdG9wIG9mIGEgcGxheWJhY2sgYW5kIGEgY2FwdHVyZSBzdHJlYW1zKSwKKwlzeW5jaHJvbml6ZWQgc3RhcnQvc3RvcCBvZiBhIHBsYXliYWNrIGFuZCBhIGNhcHR1cmUgc3RyZWFtcyksCiAJeW91IGNhbiBnaXZlIDxjb25zdGFudD5TTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUPC9jb25zdGFudD4sCiAJdG9vLiAgSW4gdGhpcyBjYXNlLCB5b3UnbGwgbmVlZCB0byBjaGVjayB0aGUgbGlua2VkLWxpc3Qgb2YKIAlQQ00gc3Vic3RyZWFtcyBpbiB0aGUgdHJpZ2dlciBjYWxsYmFjay4gIFRoaXMgd2lsbCBiZQpAQCAtMzA2Miw4ICszMDYxLDcgQEAKIAkgICAgPHRpdGxlPkludGVycnVwdCBIYW5kbGVyIENhc2UgIzE8L3RpdGxlPgogICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nPgogPCFbQ0RBVEFbCi0gIHN0YXRpYyBpcnFyZXR1cm5fdCBzbmRfbXljaGlwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyAgc3RhdGljIGlycXJldHVybl90IHNuZF9teWNoaXBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKICAgewogICAgICAgICAgIHN0cnVjdCBteWNoaXAgKmNoaXAgPSBkZXZfaWQ7CiAgICAgICAgICAgc3Bpbl9sb2NrKCZjaGlwLT5sb2NrKTsKQEAgLTMxMDYsOCArMzEwNCw3IEBACiAJICAgIDx0aXRsZT5JbnRlcnJ1cHQgSGFuZGxlciBDYXNlICMyPC90aXRsZT4KICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KIDwhW0NEQVRBWwotICBzdGF0aWMgaXJxcmV0dXJuX3Qgc25kX215Y2hpcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisgIHN0YXRpYyBpcnFyZXR1cm5fdCBzbmRfbXljaGlwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiAgIHsKICAgICAgICAgICBzdHJ1Y3QgbXljaGlwICpjaGlwID0gZGV2X2lkOwogICAgICAgICAgIHNwaW5fbG9jaygmY2hpcC0+bG9jayk7CkBAIC0zMjQ3LDcgKzMyNDQsNyBAQAogICAgICAgICBZb3UgY2FuIGV2ZW4gZGVmaW5lIHlvdXIgb3duIGNvbnN0cmFpbnQgcnVsZXMuCiAgICAgICAgIEZvciBleGFtcGxlLCBsZXQncyBzdXBwb3NlIG15X2NoaXAgY2FuIG1hbmFnZSBhIHN1YnN0cmVhbSBvZiAxIGNoYW5uZWwKICAgICAgICAgaWYgYW5kIG9ubHkgaWYgdGhlIGZvcm1hdCBpcyBTMTZfTEUsIG90aGVyd2lzZSBpdCBzdXBwb3J0cyBhbnkgZm9ybWF0Ci0gICAgICAgIHNwZWNpZmllZCBpbiB0aGUgPHN0cnVjdG5hbWU+c25kX3BjbV9oYXJkd2FyZTwvc3RydWN0bmFtZT4gc3R1Y3R1cmUgKG9yIGluIGFueQorICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIDxzdHJ1Y3RuYW1lPnNuZF9wY21faGFyZHdhcmU8L3N0cnVjdG5hbWU+IHN0cnVjdHVyZSAob3IgaW4gYW55CiAgICAgICAgIG90aGVyIGNvbnN0cmFpbnRfbGlzdCkuIFlvdSBjYW4gYnVpbGQgYSBydWxlIGxpa2UgdGhpczoKIAogICAgICAgICA8ZXhhbXBsZT4KQEAgLTM2OTEsMTYgKzM2ODgsNiBAQAogICAgICAgICA8L3BhcmE+CiAKICAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgSGVyZSwgdGhlIGNoaXAgaW5zdGFuY2UgaXMgcmV0cmlldmVkIHZpYQotICAgICAgICA8ZnVuY3Rpb24+c25kX2tjb250cm9sX2NoaXAoKTwvZnVuY3Rpb24+IG1hY3JvLiAgVGhpcyBtYWNybwotICAgICAgICBqdXN0IGFjY2Vzc2VzIHRvIGtjb250cm9sLSZndDtwcml2YXRlX2RhdGEuIFRoZQotICAgICAgICBrY29udHJvbC0mZ3Q7cHJpdmF0ZV9kYXRhIGZpZWxkIGlzIAotICAgICAgICBnaXZlbiBhcyB0aGUgYXJndW1lbnQgb2YgPGZ1bmN0aW9uPnNuZF9jdGxfbmV3KCk8L2Z1bmN0aW9uPgotICAgICAgICAoc2VlIHRoZSBsYXRlciBzdWJzZWN0aW9uCi0gICAgICAgIDxsaW5rIGxpbmtlbmQ9ImNvbnRyb2wtaW50ZXJmYWNlLWNvbnN0cnVjdG9yIj48Y2l0ZXRpdGxlPkNvbnN0cnVjdG9yPC9jaXRldGl0bGU+PC9saW5rPikuCi0gICAgICAgIDwvcGFyYT4KLQotICAgICAgICA8cGFyYT4KIAlUaGUgPHN0cnVjdGZpZWxkPnZhbHVlPC9zdHJ1Y3RmaWVsZD4gZmllbGQgaXMgZGVwZW5kaW5nIG9uCiAgICAgICAgIHRoZSB0eXBlIG9mIGNvbnRyb2wgYXMgd2VsbCBhcyBvbiBpbmZvIGNhbGxiYWNrLiAgRm9yIGV4YW1wbGUsCiAJdGhlIHNiIGRyaXZlciB1c2VzIHRoaXMgZmllbGQgdG8gc3RvcmUgdGhlIHJlZ2lzdGVyIG9mZnNldCwKQEAgLTM3ODAsNyArMzc2Nyw3IEBACiAgICAgICAgIDxwYXJhPgogCUxpa2UgPHN0cnVjdGZpZWxkPmdldDwvc3RydWN0ZmllbGQ+IGNhbGxiYWNrLAogCXdoZW4gdGhlIGNvbnRyb2wgaGFzIG1vcmUgdGhhbiBvbmUgZWxlbWVudHMsCi0JYWxsIGVsZW1laHRzIG11c3QgYmUgZXZhbHVhdGVkIGluIHRoaXMgY2FsbGJhY2ssIHRvby4KKwlhbGwgZWxlbWVudHMgbXVzdCBiZSBldmFsdWF0ZWQgaW4gdGhpcyBjYWxsYmFjaywgdG9vLgogICAgICAgICA8L3BhcmE+CiAgICAgICA8L3NlY3Rpb24+CiAKQEAgLTU1NDEsMTIgKzU1MjgsMTIgQEAKICAgI2lmZGVmIENPTkZJR19QTQogICBzdGF0aWMgaW50IHNuZF9teV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHBtX21lc3NhZ2VfdCBzdGF0ZSkKICAgewotICAgICAgICAgIC4uLi4gLyogZG8gdGhpbmdzIGZvciBzdXNwc2VuZCAqLworICAgICAgICAgIC4uLi4gLyogZG8gdGhpbmdzIGZvciBzdXNwZW5kICovCiAgICAgICAgICAgcmV0dXJuIDA7CiAgIH0KICAgc3RhdGljIGludCBzbmRfbXlfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2kpCiAgIHsKLSAgICAgICAgICAuLi4uIC8qIGRvIHRoaW5ncyBmb3Igc3VzcHNlbmQgKi8KKyAgICAgICAgICAuLi4uIC8qIGRvIHRoaW5ncyBmb3Igc3VzcGVuZCAqLwogICAgICAgICAgIHJldHVybiAwOwogICB9CiAgICNlbmRpZgpAQCAtNjExMSw3ICs2MDk4LDcgQEAKIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgogPCEtLSBBY2tub3dsZWRnbWVudHMgIC0tPgogPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIDxjaGFwdGVyIGlkPSJhY2tub3dsZWRtZW50cyI+CisgIDxjaGFwdGVyIGlkPSJhY2tub3dsZWRnbWVudHMiPgogICAgIDx0aXRsZT5BY2tub3dsZWRnbWVudHM8L3RpdGxlPgogICAgIDxwYXJhPgogICAgICAgSSB3b3VsZCBsaWtlIHRvIHRoYW5rIFBoaWwgS2VyciBmb3IgaGlzIGhlbHAgZm9yIGltcHJvdmVtZW50IGFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL2hkYV9jb2RlYy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvaGRhX2NvZGVjLnR4dAppbmRleCAwYmU1N2VkLi40ZWFhZTJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvaGRhX2NvZGVjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvaGRhX2NvZGVjLnR4dApAQCAtMjc3LDExICsyNzcsMTEgQEAKIHNuZF9oZGFfZ2V0X2NvZGVjX25hbWUoKSBzdG9yZXMgdGhlIGNvZGVjIG5hbWUgb24gdGhlIGdpdmVuIHN0cmluZy4KIAogc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoKSBjYW4gYmUgdXNlZCB0byBvYnRhaW4gdGhlIGNvbmZpZ3VyYXRpb24KLWluZm9ybWF0aW9uIG1hdGNoaW5nIHdpdGggdGhlIGRldmljZS4gIERlZmluZSB0aGUgdGFibGUgd2l0aCBzdHJ1Y3QKLWhkYV9ib2FyZF9jb25maWcgZW50cmllcyAoemVyby10ZXJtaW5hdGVkKSwgYW5kIHBhc3MgaXQgdG8gdGhlCi1mdW5jdGlvbi4gIFRoZSBmdW5jdGlvbiBjaGVja3MgdGhlIG1vZGVsbmFtZSBnaXZlbiBhcyBhIG1vZHVsZQotcGFyYW1ldGVyLCBhbmQgUENJIHN1YnN5c3RlbSBJRHMuICBJZiB0aGUgbWF0Y2hpbmcgZW50cnkgaXMgZm91bmQsIGl0Ci1yZXR1cm5zIHRoZSBjb25maWcgZmllbGQgdmFsdWUuCitpbmZvcm1hdGlvbiBtYXRjaGluZyB3aXRoIHRoZSBkZXZpY2UuICBEZWZpbmUgdGhlIG1vZGVsIHN0cmluZyB0YWJsZQorYW5kIHRoZSB0YWJsZSB3aXRoIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGVudHJpZXMgKHplcm8tdGVybWluYXRlZCksCithbmQgcGFzcyBpdCB0byB0aGUgZnVuY3Rpb24uICBUaGUgZnVuY3Rpb24gY2hlY2tzIHRoZSBtb2RlbG5hbWUgZ2l2ZW4KK2FzIGEgbW9kdWxlIHBhcmFtZXRlciwgYW5kIFBDSSBzdWJzeXN0ZW0gSURzLiAgSWYgdGhlIG1hdGNoaW5nIGVudHJ5CitpcyBmb3VuZCwgaXQgcmV0dXJucyB0aGUgY29uZmlnIGZpZWxkIHZhbHVlLgogCiBzbmRfaGRhX2FkZF9uZXdfY3RscygpIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbmQgYWRkIGNvbnRyb2wgZW50cmllcy4KIFBhc3MgdGhlIHplcm8tdGVybWluYXRlZCBhcnJheSBvZiBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldy4gIFRoZSBzYW1lIGFycmF5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL0RBSS50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL0RBSS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjYmZkMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvREFJLnR4dApAQCAtMCwwICsxLDU2IEBACitBU29DIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgdGhyZWUgbWFpbiBEaWdpdGFsIEF1ZGlvIEludGVyZmFjZXMgKERBSSkgZm91bmQgb24KK1NvQyBjb250cm9sbGVycyBhbmQgcG9ydGFibGUgYXVkaW8gQ09ERUNTIHRvZGF5LCBuYW1lbHkgQUM5NywgSTJTIGFuZCBQQ00uCisKKworQUM5NworPT09PQorCisgIEFDOTcgaXMgYSBmaXZlIHdpcmUgaW50ZXJmYWNlIGNvbW1vbmx5IGZvdW5kIG9uIG1hbnkgUEMgc291bmQgY2FyZHMuIEl0IGlzCitub3cgYWxzbyBwb3B1bGFyIGluIG1hbnkgcG9ydGFibGUgZGV2aWNlcy4gVGhpcyBEQUkgaGFzIGEgcmVzZXQgbGluZSBhbmQgdGltZQorbXVsdGlwbGV4ZXMgaXRzIGRhdGEgb24gaXRzIFNEQVRBX09VVCAocGxheWJhY2spIGFuZCBTREFUQV9JTiAoY2FwdHVyZSkgbGluZXMuCitUaGUgYml0IGNsb2NrIChCQ0xLKSBpcyBhbHdheXMgZHJpdmVuIGJ5IHRoZSBDT0RFQyAodXN1YWxseSAxMi4yODhNSHopIGFuZCB0aGUKK2ZyYW1lIChGUkFNRSkgKHVzdWFsbHkgNDhrSHopIGlzIGFsd2F5cyBkcml2ZW4gYnkgdGhlIGNvbnRyb2xsZXIuIEVhY2ggQUM5NworZnJhbWUgaXMgMjF1UyBsb25nIGFuZCBpcyBkaXZpZGVkIGludG8gMTMgdGltZSBzbG90cy4KKworVGhlIEFDOTcgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgYXQgOi0KK2h0dHA6Ly93d3cuaW50ZWwuY29tL2Rlc2lnbi9jaGlwc2V0cy9hdWRpby9hYzk3X3IyMy5wZGYKKworCitJMlMKKz09PQorCisgSTJTIGlzIGEgY29tbW9uIDQgd2lyZSBEQUkgdXNlZCBpbiBIaUZpLCBTVEIgYW5kIHBvcnRhYmxlIGRldmljZXMuIFRoZSBUeCBhbmQKK1J4IGxpbmVzIGFyZSB1c2VkIGZvciBhdWRpbyB0cmFuc21pc2lvbiwgd2hpbHN0IHRoZSBiaXQgY2xvY2sgKEJDTEspIGFuZAorbGVmdC9yaWdodCBjbG9jayAoTFJDKSBzeW5jaHJvbmlzZSB0aGUgbGluay4gSTJTIGlzIGZsZXhpYmxlIGluIHRoYXQgZWl0aGVyIHRoZQorY29udHJvbGxlciBvciBDT0RFQyBjYW4gZHJpdmUgKG1hc3RlcikgdGhlIEJDTEsgYW5kIExSQyBjbG9jayBsaW5lcy4gQml0IGNsb2NrCit1c3VhbGx5IHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIHNhbXBsZSByYXRlIGFuZCB0aGUgbWFzdGVyIHN5c3RlbSBjbG9jaworKFNZU0NMSykuIExSQ0xLIGlzIHRoZSBzYW1lIGFzIHRoZSBzYW1wbGUgcmF0ZS4gQSBmZXcgZGV2aWNlcyBzdXBwb3J0IHNlcGFyYXRlCitBREMgYW5kIERBQyBMUkNMSydzLCB0aGlzIGFsbG93cyBmb3Igc2ltaWx0YW5pb3VzIGNhcHR1cmUgYW5kIHBsYXliYWNrIGF0CitkaWZmZXJlbnQgc2FtcGxlIHJhdGVzLgorCitJMlMgaGFzIHNldmVyYWwgZGlmZmVyZW50IG9wZXJhdGluZyBtb2RlczotCisKKyBvIEkyUyAtIE1TQiBpcyB0cmFuc21pdHRlZCBvbiB0aGUgZmFsbGluZyBlZGdlIG9mIHRoZSBmaXJzdCBCQ0xLIGFmdGVyIExSQworICAgICAgICAgdHJhbnNpdGlvbi4KKworIG8gTGVmdCBKdXN0aWZpZWQgLSBNU0IgaXMgdHJhbnNtaXR0ZWQgb24gdHJhbnNpdGlvbiBvZiBMUkMuCisKKyBvIFJpZ2h0IEp1c3RpZmllZCAtIE1TQiBpcyB0cmFuc21pdHRlZCBzYW1wbGUgc2l6ZSBCQ0xLJ3MgYmVmb3JlIExSQworICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbi4KKworUENNCis9PT0KKworUENNIGlzIGFub3RoZXIgNCB3aXJlIGludGVyZmFjZSwgdmVyeSBzaW1pbGFyIHRvIEkyUywgdGhhdCBjYW4gc3VwcG9ydCBhIG1vcmUKK2ZsZXhpYmxlIHByb3RvY29sLiBJdCBoYXMgYml0IGNsb2NrIChCQ0xLKSBhbmQgc3luYyAoU1lOQykgbGluZXMgdGhhdCBhcmUgdXNlZAordG8gc3luY2hyb25pc2UgdGhlIGxpbmsgd2hpbHN0IHRoZSBUeCBhbmQgUnggbGluZXMgYXJlIHVzZWQgdG8gdHJhbnNtaXQgYW5kCityZWNlaXZlIHRoZSBhdWRpbyBkYXRhLiBCaXQgY2xvY2sgdXN1YWxseSB2YXJpZXMgZGVwZW5kaW5nIG9uIHNhbXBsZSByYXRlCit3aGlsc3Qgc3luYyBydW5zIGF0IHRoZSBzYW1wbGUgcmF0ZS4gUENNIGFsc28gc3VwcG9ydHMgVGltZSBEaXZpc2lvbgorTXVsdGlwbGV4aW5nIChURE0pIGluIHRoYXQgc2V2ZXJhbCBkZXZpY2VzIGNhbiB1c2UgdGhlIGJ1cyBzaW1pbHRhbml1b3NseSAoVGhpcworaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIG5ldHdvcmsgbW9kZSkuCisKK0NvbW1vbiBQQ00gb3BlcmF0aW5nIG1vZGVzOi0KKworIG8gTW9kZSBBIC0gTVNCIGlzIHRyYW5zbWl0dGVkIG9uIGZhbGxpbmcgZWRnZSBvZiBmaXJzdCBCQ0xLIGFmdGVyIEZSQU1FL1NZTkMuCisKKyBvIE1vZGUgQiAtIE1TQiBpcyB0cmFuc21pdHRlZCBvbiByaXNpbmcgZWRnZSBvZiBGUkFNRS9TWU5DLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9jbG9ja2luZy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2Nsb2NraW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM5NjBkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9jbG9ja2luZy50eHQKQEAgLTAsMCArMSw1MSBAQAorQXVkaW8gQ2xvY2tpbmcKKz09PT09PT09PT09PT09CisKK1RoaXMgdGV4dCBkZXNjcmliZXMgdGhlIGF1ZGlvIGNsb2NraW5nIHRlcm1zIGluIEFTb0MgYW5kIGRpZ2l0YWwgYXVkaW8gaW4KK2dlbmVyYWwuIE5vdGU6IEF1ZGlvIGNsb2NraW5nIGNhbiBiZSBjb21wbGV4ICEKKworCitNYXN0ZXIgQ2xvY2sKKy0tLS0tLS0tLS0tLQorCitFdmVyeSBhdWRpbyBzdWJzeXN0ZW0gaXMgZHJpdmVuIGJ5IGEgbWFzdGVyIGNsb2NrIChzb21ldGltZXMgcmVmZXJlZCB0byBhcyBNQ0xLCitvciBTWVNDTEspLiBUaGlzIGF1ZGlvIG1hc3RlciBjbG9jayBjYW4gYmUgZGVyaXZlZCBmcm9tIGEgbnVtYmVyIG9mIHNvdXJjZXMKKyhlLmcuIGNyeXN0YWwsIFBMTCwgQ1BVIGNsb2NrKSBhbmQgaXMgcmVzcG9uc2libGUgZm9yIHByb2R1Y2luZyB0aGUgY29ycmVjdAorYXVkaW8gcGxheWJhY2sgYW5kIGNhcHR1cmUgc2FtcGxlIHJhdGVzLgorCitTb21lIG1hc3RlciBjbG9ja3MgKGUuZy4gUExMJ3MgYW5kIENQVSBiYXNlZCBjbG9ja3MpIGFyZSBjb25maWd1YXJibGUgaW4gdGhhdAordGhlaXIgc3BlZWQgY2FuIGJlIGFsdGVyZWQgYnkgc29mdHdhcmUgKGRlcGVuZGluZyBvbiB0aGUgc3lzdGVtIHVzZSBhbmQgdG8gc2F2ZQorcG93ZXIpLiBPdGhlciBtYXN0ZXIgY2xvY2tzIGFyZSBmaXhlZCBhdCBhdCBzZXQgZnJlcXVlbmN5IChpLmUuIGNyeXN0YWxzKS4KKworCitEQUkgQ2xvY2tzCistLS0tLS0tLS0tCitUaGUgRGlnaXRhbCBBdWRpbyBJbnRlcmZhY2UgaXMgdXN1YWxseSBkcml2ZW4gYnkgYSBCaXQgQ2xvY2sgKG9mdGVuIHJlZmVycmVkIHRvCithcyBCQ0xLKS4gVGhpcyBjbG9jayBpcyB1c2VkIHRvIGRyaXZlIHRoZSBkaWdpdGFsIGF1ZGlvIGRhdGEgYWNyb3NzIHRoZSBsaW5rCitiZXR3ZWVuIHRoZSBjb2RlYyBhbmQgQ1BVLgorCitUaGUgREFJIGFsc28gaGFzIGEgZnJhbWUgY2xvY2sgdG8gc2lnbmFsIHRoZSBzdGFydCBvZiBlYWNoIGF1ZGlvIGZyYW1lLiBUaGlzCitjbG9jayBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgTFJDIChsZWZ0IHJpZ2h0IGNsb2NrKSBvciBGUkFNRS4gVGhpcyBjbG9jaworcnVucyBhdCBleGFjdGx5IHRoZSBzYW1wbGUgcmF0ZSAoTFJDID0gUmF0ZSkuCisKK0JpdCBDbG9jayBjYW4gYmUgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6LQorCitCQ0xLID0gTUNMSyAvIHgKKworIG9yCisKK0JDTEsgPSBMUkMgKiB4CisKKyBvcgorCitCQ0xLID0gTFJDICogQ2hhbm5lbHMgKiBXb3JkIFNpemUKKworVGhpcyByZWxhdGlvbnNoaXAgZGVwZW5kcyBvbiB0aGUgY29kZWMgb3IgU29DIENQVSBpbiBwYXJ0aWN1bGFyLiBJbiBnZW5lcmFsCitpdCdzIGJlc3QgdG8gY29uZmlndXJlIEJDTEsgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSBzcGVlZCAoZGVwZW5kaW5nIG9uIHlvdXIKK3JhdGUsIG51bWJlciBvZiBjaGFubmVscyBhbmQgd29yZHNpemUpIHRvIHNhdmUgb24gcG93ZXIuCisKK0l0J3MgYWxzbyBkZXNpcmVhYmxlIHRvIHVzZSB0aGUgY29kZWMgKGlmIHBvc3NpYmxlKSB0byBkcml2ZSAob3IgbWFzdGVyKSB0aGUKK2F1ZGlvIGNsb2NrcyBhcyBpdCdzIHVzdWFsbHkgZ2l2ZXMgbW9yZSBhY2N1cmF0ZSBzYW1wbGUgcmF0ZXMgdGhhbiB0aGUgQ1BVLgorCisKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9jb2RlYy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2NvZGVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODk4M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9jb2RlYy50eHQKQEAgLTAsMCArMSwxOTcgQEAKK0FTb0MgQ29kZWMgRHJpdmVyCis9PT09PT09PT09PT09PT09PQorCitUaGUgY29kZWMgZHJpdmVyIGlzIGdlbmVyaWMgYW5kIGhhcmR3YXJlIGluZGVwZW5kZW50IGNvZGUgdGhhdCBjb25maWd1cmVzIHRoZQorY29kZWMgdG8gcHJvdmlkZSBhdWRpbyBjYXB0dXJlIGFuZCBwbGF5YmFjay4gSXQgc2hvdWxkIGNvbnRhaW4gbm8gY29kZSB0aGF0IGlzCitzcGVjaWZpYyB0byB0aGUgdGFyZ2V0IHBsYXRmb3JtIG9yIG1hY2hpbmUuIEFsbCBwbGF0Zm9ybSBhbmQgbWFjaGluZSBzcGVjaWZpYworY29kZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHBsYXRmb3JtIGFuZCBtYWNoaW5lIGRyaXZlcnMgcmVzcGVjdGl2ZWx5LgorCitFYWNoIGNvZGVjIGRyaXZlciAqbXVzdCogcHJvdmlkZSB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOi0KKworIDEpIENvZGVjIERBSSBhbmQgUENNIGNvbmZpZ3VyYXRpb24KKyAyKSBDb2RlYyBjb250cm9sIElPIC0gdXNpbmcgSTJDLCAzIFdpcmUoU1BJKSBvciBib3RoIEFQSSdzCisgMykgTWl4ZXJzIGFuZCBhdWRpbyBjb250cm9scworIDQpIENvZGVjIGF1ZGlvIG9wZXJhdGlvbnMKKworT3B0aW9uYWxseSwgY29kZWMgZHJpdmVycyBjYW4gYWxzbyBwcm92aWRlOi0KKworIDUpIERBUE0gZGVzY3JpcHRpb24uCisgNikgREFQTSBldmVudCBoYW5kbGVyLgorIDcpIERBQyBEaWdpdGFsIG11dGUgY29udHJvbC4KKworSXQncyBwcm9iYWJseSBiZXN0IHRvIHVzZSB0aGlzIGd1aWRlIGluIGNvbmp1Y3Rpb24gd2l0aCB0aGUgZXhpc3RpbmcgY29kZWMKK2RyaXZlciBjb2RlIGluIHNvdW5kL3NvYy9jb2RlY3MvCisKK0FTb0MgQ29kZWMgZHJpdmVyIGJyZWFrZG93bgorPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzEgLSBDb2RlYyBEQUkgYW5kIFBDTSBjb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRWFjaCBjb2RlYyBkcml2ZXIgbXVzdCBoYXZlIGEgc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpIHRvIGRlZmluZSBpdCdzIERBSSBhbmQKK1BDTSdzIGNhcGFibGl0aWVzIGFuZCBvcGVyYXRpb25zLiBUaGlzIHN0cnVjdCBpcyBleHBvcnRlZCBzbyB0aGF0IGl0IGNhbiBiZQorcmVnaXN0ZXJlZCB3aXRoIHRoZSBjb3JlIGJ5IHlvdXIgbWFjaGluZSBkcml2ZXIuCisKK2UuZy4KKworc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpIHdtODczMV9kYWkgPSB7CisJLm5hbWUgPSAiV004NzMxIiwKKwkvKiBwbGF5YmFjayBjYXBhYmlsaXRpZXMgKi8KKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzMxX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODczMV9GT1JNQVRTLH0sCisJLyogY2FwdHVyZSBjYXBhYmlsaXRpZXMgKi8KKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkNhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFdNODczMV9SQVRFUywKKwkJLmZvcm1hdHMgPSBXTTg3MzFfRk9STUFUUyx9LAorCS8qIHBjbSBvcGVyYXRpb25zIC0gc2VlIHNlY3Rpb24gNCBiZWxvdyAqLworCS5vcHMgPSB7CisJCS5wcmVwYXJlID0gd204NzMxX3BjbV9wcmVwYXJlLAorCQkuaHdfcGFyYW1zID0gd204NzMxX2h3X3BhcmFtcywKKwkJLnNodXRkb3duID0gd204NzMxX3NodXRkb3duLAorCX0sCisJLyogREFJIG9wZXJhdGlvbnMgLSBzZWUgREFJLnR4dCAqLworCS5kYWlfb3BzID0geworCQkuZGlnaXRhbF9tdXRlID0gd204NzMxX211dGUsCisJCS5zZXRfc3lzY2xrID0gd204NzMxX3NldF9kYWlfc3lzY2xrLAorCQkuc2V0X2ZtdCA9IHdtODczMV9zZXRfZGFpX2ZtdCwKKwl9Cit9OworRVhQT1JUX1NZTUJPTF9HUEwod204NzMxX2RhaSk7CisKKworMiAtIENvZGVjIGNvbnRyb2wgSU8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgY29kZWMgY2FuIHVzdXNhbGx5IGJlIGNvbnRyb2xsZWQgdmlhIGFuIEkyQyBvciBTUEkgc3R5bGUgaW50ZXJmYWNlIChBQzk3Citjb21iaW5lcyBjb250cm9sIHdpdGggZGF0YSBpbiB0aGUgREFJKS4gVGhlIGNvZGVjIGRyaXZlcnMgd2lsbCBoYXZlIHRvIHByb3ZpZGUKK2Z1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSB0aGUgY29kZWMgcmVnaXN0ZXJzIGFsb25nIHdpdGggc3VwcGx5aW5nIGEgcmVnaXN0ZXIKK2NhY2hlOi0KKworCS8qIElPIGNvbnRyb2wgZGF0YSBhbmQgcmVnaXN0ZXIgY2FjaGUgKi8KKyAgICB2b2lkICpjb250cm9sX2RhdGE7IC8qIGNvZGVjIGNvbnRyb2wgKGkyYy8zd2lyZSkgZGF0YSAqLworICAgIHZvaWQgKnJlZ19jYWNoZTsKKworQ29kZWMgcmVhZC93cml0ZSBzaG91bGQgZG8gYW55IGRhdGEgZm9ybWF0dGluZyBhbmQgY2FsbCB0aGUgaGFyZHdhcmUgcmVhZCB3cml0ZQorYmVsb3cgdG8gcGVyZm9ybSB0aGUgSU8uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IHRoZSBjb3JlIGFuZCBhbHNhIHdoZW4KK3BlcmZvcm1pbmcgREFQTSBvciBjaGFuZ2luZyB0aGUgbWl4ZXI6LQorCisgICAgdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKKyAgICBpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCitDb2RlYyBoYXJkd2FyZSBJTyBmdW5jdGlvbnMgLSB1c3VhbGx5IHBvaW50cyB0byBlaXRoZXIgdGhlIEkyQywgU1BJIG9yIEFDOTcKK3JlYWQvd3JpdGU6LQorCisJaHdfd3JpdGVfdCBod193cml0ZTsKKwlod19yZWFkX3QgaHdfcmVhZDsKKworCiszIC0gTWl4ZXJzIGFuZCBhdWRpbyBjb250cm9scworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FsbCB0aGUgY29kZWMgbWl4ZXJzIGFuZCBhdWRpbyBjb250cm9scyBjYW4gYmUgZGVmaW5lZCB1c2luZyB0aGUgY29udmVuaWVuY2UKK21hY3JvcyBkZWZpbmVkIGluIHNvYy5oLgorCisgICAgI2RlZmluZSBTT0NfU0lOR0xFKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpCisKK0RlZmluZXMgYSBzaW5nbGUgY29udHJvbCBhcyBmb2xsb3dzOi0KKworICB4bmFtZSA9IENvbnRyb2wgbmFtZSBlLmcuICJQbGF5YmFjayBWb2x1bWUiCisgIHJlZyA9IGNvZGVjIHJlZ2lzdGVyCisgIHNoaWZ0ID0gY29udHJvbCBiaXQocykgb2Zmc2V0IGluIHJlZ2lzdGVyCisgIG1hc2sgPSBjb250cm9sIGJpdCBzaXplKHMpIGUuZy4gbWFzayBvZiA3ID0gMyBiaXRzCisgIGludmVydCA9IHRoZSBjb250cm9sIGlzIGludmVydGVkCisKK090aGVyIG1hY3JvcyBpbmNsdWRlOi0KKworICAgICNkZWZpbmUgU09DX0RPVUJMRSh4bmFtZSwgcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52ZXJ0KQorCitBIHN0ZXJlbyBjb250cm9sCisKKyAgICAjZGVmaW5lIFNPQ19ET1VCTEVfUih4bmFtZSwgcmVnX2xlZnQsIHJlZ19yaWdodCwgc2hpZnQsIG1hc2ssIGludmVydCkKKworQSBzdGVyZW8gY29udHJvbCBzcGFubmluZyAyIHJlZ2lzdGVycworCisgICAgI2RlZmluZSBTT0NfRU5VTV9TSU5HTEUoeHJlZywgeHNoaWZ0LCB4bWFzaywgeHRleHRzKQorCitEZWZpbmVzIGFuIHNpbmdsZSBlbnVtZXJhdGVkIGNvbnRyb2wgYXMgZm9sbG93czotCisKKyAgIHhyZWcgPSByZWdpc3RlcgorICAgeHNoaWZ0ID0gY29udHJvbCBiaXQocykgb2Zmc2V0IGluIHJlZ2lzdGVyCisgICB4bWFzayA9IGNvbnRyb2wgYml0KHMpIHNpemUKKyAgIHh0ZXh0cyA9IHBvaW50ZXIgdG8gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IGRlc2NyaWJlIGVhY2ggc2V0dGluZworCisgICAjZGVmaW5lIFNPQ19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4dGV4dHMpCisKK0RlZmluZXMgYSBzdGVyZW8gZW51bWVyYXRlZCBjb250cm9sCisKKworNCAtIENvZGVjIEF1ZGlvIE9wZXJhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgY29kZWMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhbHNhIG9wZXJhdGlvbnM6LQorCisvKiBTb0MgYXVkaW8gb3BzICovCitzdHJ1Y3Qgc25kX3NvY19vcHMgeworCWludCAoKnN0YXJ0dXApKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKKwlpbnQgKCpod19wYXJhbXMpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKik7CisJaW50ICgqaHdfZnJlZSkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCWludCAoKnByZXBhcmUpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKK307CisKK1BsZWFzZSByZWZlciB0byB0aGUgYWxzYSBkcml2ZXIgUENNIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCitodHRwOi8vd3d3LmFsc2EtcHJvamVjdC5vcmcvfml3YWkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci9jNDM2Lmh0bQorCisKKzUgLSBEQVBNIGRlc2NyaXB0aW9uLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgRHluYW1pYyBBdWRpbyBQb3dlciBNYW5hZ2VtZW50IGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUgY29kZWMncyBwb3dlcgorY29tcG9uZW50cywgdGhlaXIgcmVsYXRpb25zaGlwcyBhbmQgcmVnaXN0ZXJzIHRvIHRoZSBBU29DIGNvcmUuIFBsZWFzZSByZWFkCitkYXBtLnR4dCBmb3IgZGV0YWlscyBvZiBidWlsZGluZyB0aGUgZGVzY3JpcHRpb24uCisKK1BsZWFzZSBhbHNvIHNlZSB0aGUgZXhhbXBsZXMgaW4gb3RoZXIgY29kZWMgZHJpdmVycy4KKworCis2IC0gREFQTSBldmVudCBoYW5kbGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGZ1bmN0aW9uIGlzIGEgY2FsbGJhY2sgdGhhdCBoYW5kbGVzIGNvZGVjIGRvbWFpbiBQTSBjYWxscyBhbmQgc3lzdGVtCitkb21haW4gUE0gY2FsbHMgKGUuZy4gc3VzcGVuZCBhbmQgcmVzdW1lKS4gSXQncyB1c2VkIHRvIHB1dCB0aGUgY29kZWMgdG8gc2xlZXAKK3doZW4gbm90IGluIHVzZS4KKworUG93ZXIgc3RhdGVzOi0KKworCVNORFJWX0NUTF9QT1dFUl9EMDogLyogZnVsbCBPbiAqLworCS8qIHZyZWYvbWlkLCBjbGsgYW5kIG9zYyBvbiwgYWN0aXZlICovCisKKwlTTkRSVl9DVExfUE9XRVJfRDE6IC8qIHBhcnRpYWwgT24gKi8KKwlTTkRSVl9DVExfUE9XRVJfRDI6IC8qIHBhcnRpYWwgT24gKi8KKworCVNORFJWX0NUTF9QT1dFUl9EM2hvdDogLyogT2ZmLCB3aXRoIHBvd2VyICovCisJLyogZXZlcnl0aGluZyBvZmYgZXhjZXB0IHZyZWYvdm1pZCwgaW5hY3RpdmUgKi8KKworCVNORFJWX0NUTF9QT1dFUl9EM2NvbGQ6IC8qIEV2ZXJ5dGhpbmcgT2ZmLCB3aXRob3V0IHBvd2VyICovCisKKworNyAtIENvZGVjIERBQyBkaWdpdGFsIG11dGUgY29udHJvbC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTW9zdCBjb2RlY3MgaGF2ZSBhIGRpZ2l0YWwgbXV0ZSBiZWZvcmUgdGhlIERBQydzIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWluaW1pc2UKK2FueSBzeXN0ZW0gbm9pc2UuICBUaGUgbXV0ZSBzdG9wcyBhbnkgZGlnaXRhbCBkYXRhIGZyb20gZW50ZXJpbmcgdGhlIERBQy4KKworQSBjYWxsYmFjayBjYW4gYmUgY3JlYXRlZCB0aGF0IGlzIGNhbGxlZCBieSB0aGUgY29yZSBmb3IgZWFjaCBjb2RlYyBEQUkgd2hlbiB0aGUKK211dGUgaXMgYXBwbGllZCBvciBmcmVlZC4KKworaS5lLgorCitzdGF0aWMgaW50IHdtODk3NF9tdXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJdTE2IG11dGVfcmVnID0gd204OTc0X3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg5NzRfREFDKSAmIDB4ZmZiZjsKKwlpZihtdXRlKQorCQl3bTg5NzRfd3JpdGUoY29kZWMsIFdNODk3NF9EQUMsIG11dGVfcmVnIHwgMHg0MCk7CisJZWxzZQorCQl3bTg5NzRfd3JpdGUoY29kZWMsIFdNODk3NF9EQUMsIG11dGVfcmVnKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvZGFwbS50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2RhcG0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTg3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL2RhcG0udHh0CkBAIC0wLDAgKzEsMjk3IEBACitEeW5hbWljIEF1ZGlvIFBvd2VyIE1hbmFnZW1lbnQgZm9yIFBvcnRhYmxlIERldmljZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisxLiBEZXNjcmlwdGlvbgorPT09PT09PT09PT09PT0KKworRHluYW1pYyBBdWRpbyBQb3dlciBNYW5hZ2VtZW50IChEQVBNKSBpcyBkZXNpZ25lZCB0byBhbGxvdyBwb3J0YWJsZSBMaW51eCBkZXZpY2VzCit0byB1c2UgdGhlIG1pbmltdW0gYW1vdW50IG9mIHBvd2VyIHdpdGhpbiB0aGUgYXVkaW8gc3Vic3lzdGVtIGF0IGFsbCB0aW1lcy4gSXQKK2lzIGluZGVwZW5kZW50IG9mIG90aGVyIGtlcm5lbCBQTSBhbmQgYXMgc3VjaCwgY2FuIGVhc2lseSBjby1leGlzdCB3aXRoIHRoZQorb3RoZXIgUE0gc3lzdGVtcy4KKworREFQTSBpcyBhbHNvIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gYWxsIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIGFzIGFsbCBwb3dlcgorc3dpdGNoaW5nIGlzIGRvbmUgd2l0aGluIHRoZSBBU29DIGNvcmUuIE5vIGNvZGUgY2hhbmdlcyBvciByZWNvbXBpbGluZyBhcmUKK3JlcXVpcmVkIGZvciB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucy4gREFQTSBtYWtlcyBwb3dlciBzd2l0Y2hpbmcgZGVzY2lzaW9ucyBiYXNlZAordXBvbiBhbnkgYXVkaW8gc3RyZWFtIChjYXB0dXJlL3BsYXliYWNrKSBhY3Rpdml0eSBhbmQgYXVkaW8gbWl4ZXIgc2V0dGluZ3MKK3dpdGhpbiB0aGUgZGV2aWNlLgorCitEQVBNIHNwYW5zIHRoZSB3aG9sZSBtYWNoaW5lLiBJdCBjb3ZlcnMgcG93ZXIgY29udHJvbCB3aXRoaW4gdGhlIGVudGlyZSBhdWRpbworc3Vic3lzdGVtLCB0aGlzIGluY2x1ZGVzIGludGVybmFsIGNvZGVjIHBvd2VyIGJsb2NrcyBhbmQgbWFjaGluZSBsZXZlbCBwb3dlcgorc3lzdGVtcy4KKworVGhlcmUgYXJlIDQgcG93ZXIgZG9tYWlucyB3aXRoaW4gREFQTQorCisgICAxLiBDb2RlYyBkb21haW4gLSBWUkVGLCBWTUlEIChjb3JlIGNvZGVjIGFuZCBhdWRpbyBwb3dlcikKKyAgICAgIFVzdWFsbHkgY29udHJvbGxlZCBhdCBjb2RlYyBwcm9iZS9yZW1vdmUgYW5kIHN1c3BlbmQvcmVzdW1lLCBhbHRob3VnaAorICAgICAgY2FuIGJlIHNldCBhdCBzdHJlYW0gdGltZSBpZiBwb3dlciBpcyBub3QgbmVlZGVkIGZvciBzaWRldG9uZSwgZXRjLgorCisgICAyLiBQbGF0Zm9ybS9NYWNoaW5lIGRvbWFpbiAtIHBoeXNpY2FsbHkgY29ubmVjdGVkIGlucHV0cyBhbmQgb3V0cHV0cworICAgICAgSXMgcGxhdGZvcm0vbWFjaGluZSBhbmQgdXNlciBhY3Rpb24gc3BlY2lmaWMsIGlzIGNvbmZpZ3VyZWQgYnkgdGhlCisgICAgICBtYWNoaW5lIGRyaXZlciBhbmQgcmVzcG9uZHMgdG8gYXN5bmNocm9ub3VzIGV2ZW50cyBlLmcgd2hlbiBIUAorICAgICAgYXJlIGluc2VydGVkCisKKyAgIDMuIFBhdGggZG9tYWluIC0gYXVkaW8gc3VzYnN5c3RlbSBzaWduYWwgcGF0aHMKKyAgICAgIEF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gbWl4ZXIgYW5kIG11eCBzZXR0aW5ncyBhcmUgY2hhbmdlZCBieSB0aGUgdXNlci4KKyAgICAgIGUuZy4gYWxzYW1peGVyLCBhbWl4ZXIuCisKKyAgIDQuIFN0cmVhbSBkb21haW4gLSBEQUMncyBhbmQgQURDJ3MuCisgICAgICBFbmFibGVkIGFuZCBkaXNhYmxlZCB3aGVuIHN0cmVhbSBwbGF5YmFjay9jYXB0dXJlIGlzIHN0YXJ0ZWQgYW5kCisgICAgICBzdG9wcGVkIHJlc3BlY3RpdmVseS4gZS5nLiBhcGxheSwgYXJlY29yZC4KKworQWxsIERBUE0gcG93ZXIgc3dpdGNoaW5nIGRlc2Npc29ucyBhcmUgbWFkZSBhdXRvbWF0aWNhbGx5IGJ5IGNvbnN1bHRpbmcgYW4gYXVkaW8KK3JvdXRpbmcgbWFwIG9mIHRoZSB3aG9sZSBtYWNoaW5lLiBUaGlzIG1hcCBpcyBzcGVjaWZpYyB0byBlYWNoIG1hY2hpbmUgYW5kCitjb25zaXN0cyBvZiB0aGUgaW50ZXJjb25uZWN0aW9ucyBiZXR3ZWVuIGV2ZXJ5IGF1ZGlvIGNvbXBvbmVudCAoaW5jbHVkaW5nCitpbnRlcm5hbCBjb2RlYyBjb21wb25lbnRzKS4gQWxsIGF1ZGlvIGNvbXBvbmVudHMgdGhhdCBlZmZlY3QgcG93ZXIgYXJlIGNhbGxlZAord2lkZ2V0cyBoZXJlYWZ0ZXIuCisKKworMi4gREFQTSBXaWRnZXRzCis9PT09PT09PT09PT09PT0KKworQXVkaW8gREFQTSB3aWRnZXRzIGZhbGwgaW50byBhIG51bWJlciBvZiB0eXBlczotCisKKyBvIE1peGVyICAgICAgLSBNaXhlcyBzZXZlcmFsIGFuYWxvZyBzaWduYWxzIGludG8gYSBzaW5nbGUgYW5hbG9nIHNpZ25hbC4KKyBvIE11eCAgICAgICAgLSBBbiBhbmFsb2cgc3dpdGNoIHRoYXQgb3V0cHV0cyBvbmx5IDEgb2YgaXQncyBpbnB1dHMuCisgbyBQR0EgICAgICAgIC0gQSBwcm9ncmFtbWFibGUgZ2FpbiBhbXBsaWZpZXIgb3IgYXR0ZW51YXRpb24gd2lkZ2V0LgorIG8gQURDICAgICAgICAtIEFuYWxvZyB0byBEaWdpdGFsIENvbnZlcnRlcgorIG8gREFDICAgICAgICAtIERpZ2l0YWwgdG8gQW5hbG9nIENvbnZlcnRlcgorIG8gU3dpdGNoICAgICAtIEFuIGFuYWxvZyBzd2l0Y2gKKyBvIElucHV0ICAgICAgLSBBIGNvZGVjIGlucHV0IHBpbgorIG8gT3V0cHV0ICAgICAtIEEgY29kZWMgb3V0cHV0IHBpbgorIG8gSGVhZHBob25lICAtIEhlYWRwaG9uZSAoYW5kIG9wdGlvbmFsIEphY2spCisgbyBNaWMgICAgICAgIC0gTWljIChhbmQgb3B0aW9uYWwgSmFjaykKKyBvIExpbmUgICAgICAgLSBMaW5lIElucHV0L091dHB1dCAoYW5kIG9wdGlvbmFsIEphY2spCisgbyBTcGVha2VyICAgIC0gU3BlYWtlcgorIG8gUHJlICAgICAgICAtIFNwZWNpYWwgUFJFIHdpZGdldCAoZXhlYyBiZWZvcmUgYWxsIG90aGVycykKKyBvIFBvc3QgICAgICAgLSBTcGVjaWFsIFBPU1Qgd2lkZ2V0IChleGVjIGFmdGVyIGFsbCBvdGhlcnMpCisKKyhXaWRnZXRzIGFyZSBkZWZpbmVkIGluIGluY2x1ZGUvc291bmQvc29jLWRhcG0uaCkKKworV2lkZ2V0cyBhcmUgdXN1YWxseSBhZGRlZCBpbiB0aGUgY29kZWMgZHJpdmVyIGFuZCB0aGUgbWFjaGluZSBkcml2ZXIuIFRoZXJlIGFyZQorY29udmllbmNlIG1hY3JvcyBkZWZpbmVkIGluIHNvYy1kYXBtLmggdGhhdCBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGJ1aWxkIGEKK2xpc3Qgb2Ygd2lkZ2V0cyBvZiB0aGUgY29kZWNzIGFuZCBtYWNoaW5lcyBEQVBNIHdpZGdldHMuCisKK01vc3Qgd2lkZ2V0cyBoYXZlIGEgbmFtZSwgcmVnaXN0ZXIsIHNoaWZ0IGFuZCBpbnZlcnQuIFNvbWUgd2lkZ2V0cyBoYXZlIGV4dHJhCitwYXJhbWV0ZXJzIGZvciBzdHJlYW0gbmFtZSBhbmQga2NvbnRyb2xzLgorCisKKzIuMSBTdHJlYW0gRG9tYWluIFdpZGdldHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3RyZWFtIFdpZGdldHMgcmVsYXRlIHRvIHRoZSBzdHJlYW0gcG93ZXIgZG9tYWluIGFuZCBvbmx5IGNvbnNpc3Qgb2YgQURDJ3MKKyhhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzKSBhbmQgREFDJ3MgKGRpZ2l0YWwgdG8gYW5hbG9nIGNvbnZlcnRlcnMpLgorCitTdHJlYW0gd2lkZ2V0cyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0Oi0KKworU05EX1NPQ19EQVBNX0RBQyhuYW1lLCBzdHJlYW0gbmFtZSwgcmVnLCBzaGlmdCwgaW52ZXJ0KSwKKworTk9URTogdGhlIHN0cmVhbSBuYW1lIG11c3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgc3RyZWFtIG5hbWUgaW4geW91ciBjb2RlY3MKK3NuZF9zb2NfY29kZWNfZGFpLgorCitlLmcuIHN0cmVhbSB3aWRnZXRzIGZvciBIaUZpIHBsYXliYWNrIGFuZCBjYXB0dXJlCisKK1NORF9TT0NfREFQTV9EQUMoIkhpRmkgREFDIiwgIkhpRmkgUGxheWJhY2siLCBSRUcsIDMsIDEpLAorU05EX1NPQ19EQVBNX0FEQygiSGlGaSBBREMiLCAiSGlGaSBDYXB0dXJlIiwgUkVHLCAyLCAxKSwKKworCisyLjIgUGF0aCBEb21haW4gV2lkZ2V0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUGF0aCBkb21haW4gd2lkZ2V0cyBoYXZlIGEgYWJpbGl0eSB0byBjb250cm9sIG9yIGVmZmVjdCB0aGUgYXVkaW8gc2lnbmFsIG9yCithdWRpbyBwYXRocyB3aXRoaW4gdGhlIGF1ZGlvIHN1YnN5c3RlbS4gVGhleSBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybTotCisKK1NORF9TT0NfREFQTV9QR0EobmFtZSwgcmVnLCBzaGlmdCwgaW52ZXJ0LCBjb250cm9scywgbnVtX2NvbnRyb2xzKQorCitBbnkgd2lkZ2V0IGtjb250cm9scyBjYW4gYmUgc2V0IHVzaW5nIHRoZSBjb250cm9scyBhbmQgbnVtX2NvbnRyb2xzIG1lbWJlcnMuCisKK2UuZy4gTWl4ZXIgd2lkZ2V0ICh0aGUga2NvbnRyb2xzIGFyZSBkZWNsYXJlZCBmaXJzdCkKKworLyogT3V0cHV0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc25kX2tjb250cm9sX25ld190IHdtODczMV9vdXRwdXRfbWl4ZXJfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiTGluZSBCeXBhc3MgU3dpdGNoIiwgV004NzMxX0FQQU5BLCAzLCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiTWljIFNpZGV0b25lIFN3aXRjaCIsIFdNODczMV9BUEFOQSwgNSwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkhpRmkgUGxheWJhY2sgU3dpdGNoIiwgV004NzMxX0FQQU5BLCA0LCAxLCAwKSwKK307CisKK1NORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IE1peGVyIiwgV004NzMxX1BXUiwgNCwgMSwgd204NzMxX291dHB1dF9taXhlcl9jb250cm9scywKKwlBUlJBWV9TSVpFKHdtODczMV9vdXRwdXRfbWl4ZXJfY29udHJvbHMpKSwKKworCisyLjMgUGxhdGZvcm0vTWFjaGluZSBkb21haW4gV2lkZ2V0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFjaGluZSB3aWRnZXRzIGFyZSBkaWZmZXJlbnQgZnJvbSBjb2RlYyB3aWRnZXRzIGluIHRoYXQgdGhleSBkb24ndCBoYXZlIGEKK2NvZGVjIHJlZ2lzdGVyIGJpdCBhc3NvY2lhdGVkIHdpdGggdGhlbS4gQSBtYWNoaW5lIHdpZGdldCBpcyBhc3NpZ25lZCB0byBlYWNoCittYWNoaW5lIGF1ZGlvIGNvbXBvbmVudCAobm9uIGNvZGVjKSB0aGF0IGNhbiBiZSBpbmRlcGVuZGVudGx5IHBvd2VyZWQuIGUuZy4KKworIG8gU3BlYWtlciBBbXAKKyBvIE1pY3JvcGhvbmUgQmlhcworIG8gSmFjayBjb25uZWN0b3JzCisKK0EgbWFjaGluZSB3aWRnZXQgY2FuIGhhdmUgYW4gb3B0aW9uYWwgY2FsbCBiYWNrLgorCitlLmcuIEphY2sgY29ubmVjdG9yIHdpZGdldCBmb3IgYW4gZXh0ZXJuYWwgTWljIHRoYXQgZW5hYmxlcyBNaWMgQmlhcword2hlbiB0aGUgTWljIGlzIGluc2VydGVkOi0KKworc3RhdGljIGludCBzcGl0el9taWNfYmlhcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCogdywgaW50IGV2ZW50KQoreworCWlmKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wMl9kZXZpY2UuZGV2LCBTUElUWl9TQ1AyX01JQ19CSUFTKTsKKwllbHNlCisJCXJlc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3AyX2RldmljZS5kZXYsIFNQSVRaX1NDUDJfTUlDX0JJQVMpOworCisJcmV0dXJuIDA7Cit9CisKK1NORF9TT0NfREFQTV9NSUMoIk1pYyBKYWNrIiwgc3BpdHpfbWljX2JpYXMpLAorCisKKzIuNCBDb2RlYyBEb21haW4KKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlIENvZGVjIHBvd2VyIGRvbWFpbiBoYXMgbm8gd2lkZ2V0cyBhbmQgaXMgaGFuZGxlZCBieSB0aGUgY29kZWNzIERBUE0gZXZlbnQKK2hhbmRsZXIuIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgd2hlbiB0aGUgY29kZWMgcG93ZXJzdGF0ZSBpcyBjaGFuZ2VkIHdydCB0byBhbnkKK3N0cmVhbSBldmVudCBvciBieSBrZXJuZWwgUE0gZXZlbnRzLgorCisKKzIuNSBWaXJ0dWFsIFdpZGdldHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZXRpbWVzIHdpZGdldHMgZXhpc3QgaW4gdGhlIGNvZGVjIG9yIG1hY2hpbmUgYXVkaW8gbWFwIHRoYXQgZG9uJ3QgaGF2ZSBhbnkKK2NvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgYml0IGZvciBwb3dlciBjb250cm9sLiBJbiB0aGlzIGNhc2UgaXQncyBuZWNlc3NhcnkgdG8KK2NyZWF0ZSBhIHZpcnR1YWwgd2lkZ2V0IC0gYSB3aWRnZXQgd2l0aCBubyBjb250cm9sIGJpdHMgZS5nLgorCitTTkRfU09DX0RBUE1fTUlYRVIoIkFDOTcgTWl4ZXIiLCBTTkRfU09DX0RBUE1fTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKK1RoaXMgY2FuIGJlIHVzZWQgdG8gbWVyZ2UgdG8gc2lnbmFsIHBhdGhzIHRvZ2V0aGVyIGluIHNvZnR3YXJlLgorCitBZnRlciBhbGwgdGhlIHdpZGdldHMgaGF2ZSBiZWVuIGRlZmluZWQsIHRoZXkgY2FuIHRoZW4gYmUgYWRkZWQgdG8gdGhlIERBUE0KK3N1YnN5c3RlbSBpbmRpdmlkdWFsbHkgd2l0aCBhIGNhbGwgdG8gc25kX3NvY19kYXBtX25ld19jb250cm9sKCkuCisKKworMy4gQ29kZWMgV2lkZ2V0IEludGVyY29ubmVjdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dpZGdldHMgYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyIHdpdGhpbiB0aGUgY29kZWMgYW5kIG1hY2hpbmUgYnkgYXVkaW8KK3BhdGhzIChjYWxsZWQgaW50ZXJjb25uZWN0aW9ucykuIEVhY2ggaW50ZXJjb25uZWN0aW9uIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlcgordG8gY3JlYXRlIGEgbWFwIG9mIGFsbCBhdWRpbyBwYXRocyBiZXR3ZWVuIHdpZGdldHMuCitUaGlzIGlzIGVhc2llc3Qgd2l0aCBhIGRpYWdyYW0gb2YgdGhlIGNvZGVjIChhbmQgc2NoZW1hdGljIG9mIHRoZSBtYWNoaW5lIGF1ZGlvCitzeXN0ZW0pLCBhcyBpdCByZXF1aXJlcyBqb2luaW5nIHdpZGdldHMgdG9nZXRoZXIgdmlhIHRoZWlyIGF1ZGlvIHNpZ25hbCBwYXRocy4KKworaS5lLiBmcm9tIHRoZSBXTTg3MzEgY29kZWMncyBvdXRwdXQgbWl4ZXIgKHdtODczMS5jKQorCitUaGUgV004NzMxIG91dHB1dCBtaXhlciBoYXMgMyBpbnB1dHMgKHNvdXJjZXMpCisKKyAxLiBMaW5lIEJ5cGFzcyBJbnB1dAorIDIuIERBQyAoSGlGaSBwbGF5YmFjaykKKyAzLiBNaWMgU2lkZXRvbmUgSW5wdXQKKworRWFjaCBpbnB1dCBpbiB0aGlzIGV4YW1wbGUgaGFzIGEga2NvbnRyb2wgYXNzb2NpYXRlZCB3aXRoIGl0IChkZWZpbmVkIGluIGV4YW1wbGUKK2Fib3ZlKSBhbmQgaXMgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQgbWl4ZXIgdmlhIGl0J3Mga2NvbnRyb2wgbmFtZS4gV2UgY2FuIG5vdworY29ubmVjdCB0aGUgZGVzdGluYXRpb24gd2lkZ2V0ICh3cnQgYXVkaW8gc2lnbmFsKSB3aXRoIGl0J3Mgc291cmNlIHdpZGdldHMuCisKKwkvKiBvdXRwdXQgbWl4ZXIgKi8KKwl7Ik91dHB1dCBNaXhlciIsICJMaW5lIEJ5cGFzcyBTd2l0Y2giLCAiTGluZSBJbnB1dCJ9LAorCXsiT3V0cHV0IE1peGVyIiwgIkhpRmkgUGxheWJhY2sgU3dpdGNoIiwgIkRBQyJ9LAorCXsiT3V0cHV0IE1peGVyIiwgIk1pYyBTaWRldG9uZSBTd2l0Y2giLCAiTWljIEJpYXMifSwKKworU28gd2UgaGF2ZSA6LQorCisJRGVzdGluYXRpb24gV2lkZ2V0ICA8PT09IFBhdGggTmFtZSA8PT09IFNvdXJjZSBXaWRnZXQKKworT3I6LQorCisJU2luaywgUGF0aCwgU291cmNlCisKK09yIDotCisKKwkiT3V0cHV0IE1peGVyIiBpcyBjb25uZWN0ZWQgdG8gdGhlICJEQUMiIHZpYSB0aGUgIkhpRmkgUGxheWJhY2sgU3dpdGNoIi4KKworV2hlbiB0aGVyZSBpcyBubyBwYXRoIG5hbWUgY29ubmVjdGluZyB3aWRnZXRzIChlLmcuIGEgZGlyZWN0IGNvbm5lY3Rpb24pIHdlCitwYXNzIE5VTEwgZm9yIHRoZSBwYXRoIG5hbWUuCisKK0ludGVyY29ubmVjdGlvbnMgYXJlIGNyZWF0ZWQgd2l0aCBhIGNhbGwgdG86LQorCitzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dChjb2RlYywgc2luaywgcGF0aCwgc291cmNlKTsKKworRmluYWxseSwgc25kX3NvY19kYXBtX25ld193aWRnZXRzKGNvZGVjKSBtdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgd2lkZ2V0cyBhbmQKK2ludGVyY29ubmVjdGlvbnMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY29yZS4gVGhpcyBjYXVzZXMgdGhlIGNvcmUgdG8KK3NjYW4gdGhlIGNvZGVjIGFuZCBtYWNoaW5lIHNvIHRoYXQgdGhlIGludGVybmFsIERBUE0gc3RhdGUgbWF0Y2hlcyB0aGUKK3BoeXNpY2FsIHN0YXRlIG9mIHRoZSBtYWNoaW5lLgorCisKKzMuMSBNYWNoaW5lIFdpZGdldCBJbnRlcmNvbm5lY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTWFjaGluZSB3aWRnZXQgaW50ZXJjb25uZWN0aW9ucyBhcmUgY3JlYXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgY29kZWMgb25lcyBhbmQKK2RpcmVjdGx5IGNvbm5lY3QgdGhlIGNvZGVjIHBpbnMgdG8gbWFjaGluZSBsZXZlbCB3aWRnZXRzLgorCitlLmcuIGNvbm5lY3RzIHRoZSBzcGVha2VyIG91dCBjb2RlYyBwaW5zIHRvIHRoZSBpbnRlcm5hbCBzcGVha2VyLgorCisJLyogZXh0IHNwZWFrZXIgY29ubmVjdGVkIHRvIGNvZGVjIHBpbnMgTE9VVDIsIFJPVVQyICAqLworCXsiRXh0IFNwayIsIE5VTEwgLCAiUk9VVDIifSwKKwl7IkV4dCBTcGsiLCBOVUxMICwgIkxPVVQyIn0sCisKK1RoaXMgYWxsb3dzIHRoZSBEQVBNIHRvIHBvd2VyIG9uIGFuZCBvZmYgcGlucyB0aGF0IGFyZSBjb25uZWN0ZWQgKGFuZCBpbiB1c2UpCithbmQgcGlucyB0aGF0IGFyZSBOQyByZXNwZWN0aXZlbHkuCisKKworNCBFbmRwb2ludCBXaWRnZXRzCis9PT09PT09PT09PT09PT09PT09CitBbiBlbmRwb2ludCBpcyBhIHN0YXJ0IG9yIGVuZCBwb2ludCAod2lkZ2V0KSBvZiBhbiBhdWRpbyBzaWduYWwgd2l0aGluIHRoZQorbWFjaGluZSBhbmQgaW5jbHVkZXMgdGhlIGNvZGVjLiBlLmcuCisKKyBvIEhlYWRwaG9uZSBKYWNrCisgbyBJbnRlcm5hbCBTcGVha2VyCisgbyBJbnRlcm5hbCBNaWMKKyBvIE1pYyBKYWNrCisgbyBDb2RlYyBQaW5zCisKK1doZW4gYSBjb2RlYyBwaW4gaXMgTkMgaXQgY2FuIGJlIG1hcmtlZCBhcyBub3QgdXNlZCB3aXRoIGEgY2FsbCB0bworCitzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiV2lkZ2V0IE5hbWUiLCAwKTsKKworVGhlIGxhc3QgYXJndW1lbnQgaXMgMCBmb3IgaW5hY3RpdmUgYW5kIDEgZm9yIGFjdGl2ZS4gVGhpcyB3YXkgdGhlIHBpbiBhbmQgaXRzCitpbnB1dCB3aWRnZXQgd2lsbCBuZXZlciBiZSBwb3dlcmVkIHVwIGFuZCBjb25zdW1lIHBvd2VyLgorCitUaGlzIGFsc28gYXBwbGllcyB0byBtYWNoaW5lIHdpZGdldHMuIGUuZy4gaWYgYSBoZWFkcGhvbmUgaXMgY29ubmVjdGVkIHRvIGEKK2phY2sgdGhlbiB0aGUgamFjayBjYW4gYmUgbWFya2VkIGFjdGl2ZS4gSWYgdGhlIGhlYWRwaG9uZSBpcyByZW1vdmVkLCB0aGVuCit0aGUgaGVhZHBob25lIGphY2sgY2FuIGJlIG1hcmtlZCBpbmFjdGl2ZS4KKworCis1IERBUE0gV2lkZ2V0IEV2ZW50cworPT09PT09PT09PT09PT09PT09PT0KKworU29tZSB3aWRnZXRzIGNhbiByZWdpc3RlciB0aGVpciBpbnRlcmVzdCB3aXRoIHRoZSBEQVBNIGNvcmUgaW4gUE0gZXZlbnRzLgorZS5nLiBBIFNwZWFrZXIgd2l0aCBhbiBhbXBsaWZpZXIgcmVnaXN0ZXJzIGEgd2lkZ2V0IHNvIHRoZSBhbXBsaWZpZXIgY2FuIGJlCitwb3dlcmVkIG9ubHkgd2hlbiB0aGUgc3BrIGlzIGluIHVzZS4KKworLyogdHVybiBzcGVha2VyIGFtcGxpZmllciBvbi9vZmYgZGVwZW5kaW5nIG9uIHVzZSAqLworc3RhdGljIGludCBjb3JnaV9hbXBfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCBldmVudCkKK3sKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX0FQTV9PTik7CisJZWxzZQorCQlyZXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9BUE1fT04pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNvcmdpIG1hY2hpbmUgZGFwbSB3aWRnZXRzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204NzMxX2RhcG1fd2lkZ2V0cyA9CisJU05EX1NPQ19EQVBNX1NQSygiRXh0IFNwayIsIGNvcmdpX2FtcF9ldmVudCk7CisKK1BsZWFzZSBzZWUgc29jLWRhcG0uaCBmb3IgYWxsIG90aGVyIHdpZGdldHMgdGhhdCBzdXBwb3J0IGV2ZW50cy4KKworCis1LjEgRXZlbnQgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIGV2ZW50IHR5cGVzIGFyZSBzdXBwb3J0ZWQgYnkgZXZlbnQgd2lkZ2V0cy4KKworLyogZGFwbSBldmVudCB0eXBlcyAqLworI2RlZmluZSBTTkRfU09DX0RBUE1fUFJFX1BNVQkweDEgCS8qIGJlZm9yZSB3aWRnZXQgcG93ZXIgdXAgKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BPU1RfUE1VCTB4MgkJLyogYWZ0ZXIgd2lkZ2V0IHBvd2VyIHVwICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QUkVfUE1ECTB4NCAJLyogYmVmb3JlIHdpZGdldCBwb3dlciBkb3duICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QT1NUX1BNRAkweDgJCS8qIGFmdGVyIHdpZGdldCBwb3dlciBkb3duICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QUkVfUkVHCTB4MTAJLyogYmVmb3JlIGF1ZGlvIHBhdGggc2V0dXAgKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BPU1RfUkVHCTB4MjAJLyogYWZ0ZXIgYXVkaW8gcGF0aCBzZXR1cCAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9tYWNoaW5lLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvbWFjaGluZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiZDIyMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvbWFjaGluZS50eHQKQEAgLTAsMCArMSwxMTMgQEAKK0FTb0MgTWFjaGluZSBEcml2ZXIKKz09PT09PT09PT09PT09PT09PT0KKworVGhlIEFTb0MgbWFjaGluZSAob3IgYm9hcmQpIGRyaXZlciBpcyB0aGUgY29kZSB0aGF0IGdsdWVzIHRvZ2V0aGVyIHRoZSBwbGF0Zm9ybQorYW5kIGNvZGVjIGRyaXZlcnMuCisKK1RoZSBtYWNoaW5lIGRyaXZlciBjYW4gY29udGFpbiBjb2RlYyBhbmQgcGxhdGZvcm0gc3BlY2lmaWMgY29kZS4gSXQgcmVnaXN0ZXJzCit0aGUgYXVkaW8gc3Vic3lzdGVtIHdpdGggdGhlIGtlcm5lbCBhcyBhIHBsYXRmb3JtIGRldmljZSBhbmQgaXMgcmVwcmVzZW50ZWQgYnkKK3RoZSBmb2xsb3dpbmcgc3RydWN0Oi0KKworLyogU29DIG1hY2hpbmUgKi8KK3N0cnVjdCBzbmRfc29jX21hY2hpbmUgeworCWNoYXIgKm5hbWU7CisKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworCS8qIHRoZSBwcmUgYW5kIHBvc3QgUE0gZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGRvIGFueSBQTSB3b3JrIGJlZm9yZSBhbmQKKwkgKiBhZnRlciB0aGUgY29kZWMgYW5kIERBSSdzIGRvIGFueSBQTSB3b3JrLiAqLworCWludCAoKnN1c3BlbmRfcHJlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludCAoKnN1c3BlbmRfcG9zdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpyZXN1bWVfcHJlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwlpbnQgKCpyZXN1bWVfcG9zdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKKwkvKiBtYWNoaW5lIHN0cmVhbSBvcGVyYXRpb25zICovCisJc3RydWN0IHNuZF9zb2Nfb3BzICpvcHM7CisKKwkvKiBDUFUgPC0tPiBDb2RlYyBEQUkgbGlua3MgICovCisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOworCWludCBudW1fbGlua3M7Cit9OworCitwcm9iZSgpL3JlbW92ZSgpCistLS0tLS0tLS0tLS0tLS0tCitwcm9iZS9yZW1vdmUgYXJlIG9wdGlvbmFsLiBEbyBhbnkgbWFjaGluZSBzcGVjaWZpYyBwcm9iZSBoZXJlLgorCisKK3N1c3BlbmQoKS9yZXN1bWUoKQorLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbWFjaGluZSBkcml2ZXIgaGFzIHByZSBhbmQgcG9zdCB2ZXJzaW9ucyBvZiBzdXNwZW5kIGFuZCByZXN1bWUgdG8gdGFrZSBjYXJlCitvZiBhbnkgbWFjaGluZSBhdWRpbyB0YXNrcyB0aGF0IGhhdmUgdG8gYmUgZG9uZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGNvZGVjLCBEQUkncworYW5kIERNQSBpcyBzdXNwZW5kZWQgYW5kIHJlc3VtZWQuIE9wdGlvbmFsLgorCisKK01hY2hpbmUgb3BlcmF0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbWFjaGluZSBzcGVjaWZpYyBhdWRpbyBvcGVyYXRpb25zIGNhbiBiZSBzZXQgaGVyZS4gQWdhaW4gdGhpcyBpcyBvcHRpb25hbC4KKworCitNYWNoaW5lIERBSSBDb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbWFjaGluZSBEQUkgY29uZmlndXJhdGlvbiBnbHVlcyBhbGwgdGhlIGNvZGVjIGFuZCBDUFUgREFJJ3MgdG9nZXRoZXIuIEl0IGNhbgorYWxzbyBiZSB1c2VkIHRvIHNldCB1cCB0aGUgREFJIHN5c3RlbSBjbG9jayBhbmQgZm9yIGFueSBtYWNoaW5lIHJlbGF0ZWQgREFJCitpbml0aWFsaXNhdGlvbiBlLmcuIHRoZSBtYWNoaW5lIGF1ZGlvIG1hcCBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBjb2RlYyBhdWRpbworbWFwLCB1bmNvbm5uZWN0ZWQgY29kZWMgcGlucyBjYW4gYmUgc2V0IGFzIHN1Y2guIFBsZWFzZSBzZWUgY29yZ2kuYywgc3BpdHouYworZm9yIGV4YW1wbGVzLgorCitzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBpcyB1c2VkIHRvIHNldCB1cCBlYWNoIERBSSBpbiB5b3VyIG1hY2hpbmUuIGUuZy4KKworLyogY29yZ2kgZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgY29yZ2lfZGFpID0geworCS5uYW1lID0gIldNODczMSIsCisJLnN0cmVhbV9uYW1lID0gIldNODczMSIsCisJLmNwdV9kYWkgPSAmcHhhX2kyc19kYWksCisJLmNvZGVjX2RhaSA9ICZ3bTg3MzFfZGFpLAorCS5pbml0ID0gY29yZ2lfd204NzMxX2luaXQsCisJLm9wcyA9ICZjb3JnaV9vcHMsCit9OworCitzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHRoZW4gc2V0cyB1cCB0aGUgbWFjaGluZSB3aXRoIGl0J3MgREFJJ3MuIGUuZy4KKworLyogY29yZ2kgYXVkaW8gbWFjaGluZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHNuZF9zb2NfbWFjaGluZV9jb3JnaSA9IHsKKwkubmFtZSA9ICJDb3JnaSIsCisJLmRhaV9saW5rID0gJmNvcmdpX2RhaSwKKwkubnVtX2xpbmtzID0gMSwKK307CisKKworTWFjaGluZSBBdWRpbyBTdWJzeXN0ZW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBtYWNoaW5lIHNvYyBkZXZpY2UgZ2x1ZXMgdGhlIHBsYXRmb3JtLCBtYWNoaW5lIGFuZCBjb2RlYyBkcml2ZXIgdG9nZXRoZXIuCitQcml2YXRlIGRhdGEgY2FuIGFsc28gYmUgc2V0IGhlcmUuIGUuZy4KKworLyogY29yZ2kgYXVkaW8gcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgc3RydWN0IHdtODczMV9zZXR1cF9kYXRhIGNvcmdpX3dtODczMV9zZXR1cCA9IHsKKwkuaTJjX2FkZHJlc3MgPSAweDFiLAorfTsKKworLyogY29yZ2kgYXVkaW8gc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlIGNvcmdpX3NuZF9kZXZkYXRhID0geworCS5tYWNoaW5lID0gJnNuZF9zb2NfbWFjaGluZV9jb3JnaSwKKwkucGxhdGZvcm0gPSAmcHhhMnh4X3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfd204NzMxLAorCS5jb2RlY19kYXRhID0gJmNvcmdpX3dtODczMV9zZXR1cCwKK307CisKKworTWFjaGluZSBQb3dlciBNYXAKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBtYWNoaW5lIGRyaXZlciBjYW4gb3B0aW9uYWxseSBleHRlbmQgdGhlIGNvZGVjIHBvd2VyIG1hcCBhbmQgdG8gYmVjb21lIGFuCithdWRpbyBwb3dlciBtYXAgb2YgdGhlIGF1ZGlvIHN1YnN5c3RlbS4gVGhpcyBhbGxvd3MgZm9yIGF1dG9tYXRpYyBwb3dlciB1cC9kb3duCitvZiBzcGVha2VyL0hQIGFtcGxpZmllcnMsIGV0Yy4gQ29kZWMgcGlucyBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBtYWNoaW5lcyBqYWNrCitzb2NrZXRzIGluIHRoZSBtYWNoaW5lIGluaXQgZnVuY3Rpb24uIFNlZSBzb2MvcHhhL3NwaXR6LmMgYW5kIGRhcG0udHh0IGZvcgorZGV0YWlscy4KKworCitNYWNoaW5lIENvbnRyb2xzCistLS0tLS0tLS0tLS0tLS0tCisKK01hY2hpbmUgc3BlY2lmaWMgYXVkaW8gbWl4ZXIgY29udHJvbHMgY2FuIGJlIGFkZGVkIGluIHRoZSBkYWkgaW5pdCBmdW5jdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL292ZXJ2aWV3LnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2Mvb3ZlcnZpZXcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1M2M1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL292ZXJ2aWV3LnR4dApAQCAtMCwwICsxLDgzIEBACitBTFNBIFNvQyBMYXllcgorPT09PT09PT09PT09PT0KKworVGhlIG92ZXJhbGwgcHJvamVjdCBnb2FsIG9mIHRoZSBBTFNBIFN5c3RlbSBvbiBDaGlwIChBU29DKSBsYXllciBpcyB0byBwcm92aWRlCitiZXR0ZXIgQUxTQSBzdXBwb3J0IGZvciBlbWJlZGRlZCBzeXN0ZW0gb24gY2hpcCBwcm9jZXNvcnMgKGUuZy4gcHhhMnh4LCBhdTF4MDAsCitpTVgsIGV0YykgYW5kIHBvcnRhYmxlIGF1ZGlvIGNvZGVjcy4gQ3VycmVudGx5IHRoZXJlIGlzIHNvbWUgc3VwcG9ydCBpbiB0aGUKK2tlcm5lbCBmb3IgU29DIGF1ZGlvLCBob3dldmVyIGl0IGhhcyBzb21lIGxpbWl0YXRpb25zOi0KKworICAqIEN1cnJlbnRseSwgY29kZWMgZHJpdmVycyBhcmUgb2Z0ZW4gdGlnaHRseSBjb3VwbGVkIHRvIHRoZSB1bmRlcmx5aW5nIFNvQworICAgIGNwdS4gVGhpcyBpcyBub3QgaWRlYWwgYW5kIGxlYWRzIHRvIGNvZGUgZHVwbGljYXRpb24gaS5lLiBMaW51eCBub3cgaGFzIDQKKyAgICBkaWZmZXJlbnQgd204NzMxIGRyaXZlcnMgZm9yIDQgZGlmZmVyZW50IFNvQyBwbGF0Zm9ybXMuCisKKyAgKiBUaGVyZSBpcyBubyBzdGFuZGFyZCBtZXRob2QgdG8gc2lnbmFsIHVzZXIgaW5pdGlhdGVkIGF1ZGlvIGV2ZW50cy4KKyAgICBlLmcuIEhlYWRwaG9uZS9NaWMgaW5zZXJ0aW9uLCBIZWFkcGhvbmUvTWljIGRldGVjdGlvbiBhZnRlciBhbiBpbnNlcnRpb24KKyAgICBldmVudC4gVGhlc2UgYXJlIHF1aXRlIGNvbW1vbiBldmVudHMgb24gcG9ydGFibGUgZGV2aWNlcyBhbmQgb2Z0ZXIgcmVxdWlyZQorICAgIG1hY2hpbmUgc3BlY2lmaWMgY29kZSB0byByZSByb3V0ZSBhdWRpbywgZW5hYmxlIGFtcHMgZXRjIGFmdGVyIHN1Y2ggYW4gZXZlbnQuCisKKyAgKiBDdXJyZW50IGRyaXZlcnMgdGVuZCB0byBwb3dlciB1cCB0aGUgZW50aXJlIGNvZGVjIHdoZW4gcGxheWluZworICAgIChvciByZWNvcmRpbmcpIGF1ZGlvLiBUaGlzIGlzIGZpbmUgZm9yIGEgUEMsIGJ1dCB0ZW5kcyB0byB3YXN0ZSBhIGxvdCBvZgorICAgIHBvd2VyIG9uIHBvcnRhYmxlIGRldmljZXMuIFRoZXJlIGlzIGFsc28gbm8gc3VwcG9ydCBmb3Igc2F2aW5nIHBvd2VyIHZpYQorICAgIGNoYW5naW5nIGNvZGVjIG92ZXJzYW1wbGluZyByYXRlcywgYmlhcyBjdXJyZW50cywgZXRjLgorCisKK0FTb0MgRGVzaWduCis9PT09PT09PT09PQorCitUaGUgQVNvQyBsYXllciBpcyBkZXNpZ25lZCB0byBhZGRyZXNzIHRoZXNlIGlzc3VlcyBhbmQgcHJvdmlkZSB0aGUgZm9sbG93aW5nCitmZWF0dXJlcyA6LQorCisgICogQ29kZWMgaW5kZXBlbmRlbmNlLiBBbGxvd3MgcmV1c2Ugb2YgY29kZWMgZHJpdmVycyBvbiBvdGhlciBwbGF0Zm9ybXMKKyAgICBhbmQgbWFjaGluZXMuCisKKyAgKiBFYXN5IEkyUy9QQ00gYXVkaW8gaW50ZXJmYWNlIHNldHVwIGJldHdlZW4gY29kZWMgYW5kIFNvQy4gRWFjaCBTb0MgaW50ZXJmYWNlCisgICAgYW5kIGNvZGVjIHJlZ2lzdGVycyBpdCdzIGF1ZGlvIGludGVyZmFjZSBjYXBhYmlsaXRpZXMgd2l0aCB0aGUgY29yZSBhbmQgYXJlCisgICAgc3Vic2VxdWVudGx5IG1hdGNoZWQgYW5kIGNvbmZpZ3VyZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaHcgcGFyYW1zIGFyZSBrbm93bi4KKworICAqIER5bmFtaWMgQXVkaW8gUG93ZXIgTWFuYWdlbWVudCAoREFQTSkuIERBUE0gYXV0b21hdGljYWxseSBzZXRzIHRoZSBjb2RlYyB0bworICAgIGl0J3MgbWluaW11bSBwb3dlciBzdGF0ZSBhdCBhbGwgdGltZXMuIFRoaXMgaW5jbHVkZXMgcG93ZXJpbmcgdXAvZG93bgorICAgIGludGVybmFsIHBvd2VyIGJsb2NrcyBkZXBlbmRpbmcgb24gdGhlIGludGVybmFsIGNvZGVjIGF1ZGlvIHJvdXRpbmcgYW5kIGFueQorICAgIGFjdGl2ZSBzdHJlYW1zLgorCisgICogUG9wIGFuZCBjbGljayByZWR1Y3Rpb24uIFBvcHMgYW5kIGNsaWNrcyBjYW4gYmUgcmVkdWNlZCBieSBwb3dlcmluZyB0aGUKKyAgICBjb2RlYyB1cC9kb3duIGluIHRoZSBjb3JyZWN0IHNlcXVlbmNlIChpbmNsdWRpbmcgdXNpbmcgZGlnaXRhbCBtdXRlKS4gQVNvQworICAgIHNpZ25hbHMgdGhlIGNvZGVjIHdoZW4gdG8gY2hhbmdlIHBvd2VyIHN0YXRlcy4KKworICAqIE1hY2hpbmUgc3BlY2lmaWMgY29udHJvbHM6IEFsbG93IG1hY2hpbmVzIHRvIGFkZCBjb250cm9scyB0byB0aGUgc291bmQgY2FyZAorICAgIGUuZy4gdm9sdW1lIGNvbnRyb2wgZm9yIHNwZWFrZXIgYW1wLgorCitUbyBhY2hpZXZlIGFsbCB0aGlzLCBBU29DIGJhc2ljYWxseSBzcGxpdHMgYW4gZW1iZWRkZWQgYXVkaW8gc3lzdGVtIGludG8gMworY29tcG9uZW50cyA6LQorCisgICogQ29kZWMgZHJpdmVyOiBUaGUgY29kZWMgZHJpdmVyIGlzIHBsYXRmb3JtIGluZGVwZW5kZW50IGFuZCBjb250YWlucyBhdWRpbworICAgIGNvbnRyb2xzLCBhdWRpbyBpbnRlcmZhY2UgY2FwYWJpbGl0aWVzLCBjb2RlYyBkYXBtIGRlZmluaXRpb24gYW5kIGNvZGVjIElPCisgICAgZnVuY3Rpb25zLgorCisgICogUGxhdGZvcm0gZHJpdmVyOiBUaGUgcGxhdGZvcm0gZHJpdmVyIGNvbnRhaW5zIHRoZSBhdWRpbyBkbWEgZW5naW5lIGFuZCBhdWRpbworICAgIGludGVyZmFjZSBkcml2ZXJzIChlLmcuIEkyUywgQUM5NywgUENNKSBmb3IgdGhhdCBwbGF0Zm9ybS4KKworICAqIE1hY2hpbmUgZHJpdmVyOiBUaGUgbWFjaGluZSBkcml2ZXIgaGFuZGxlcyBhbnkgbWFjaGluZSBzcGVjaWZpYyBjb250cm9scyBhbmQKKyAgICBhdWRpbyBldmVudHMuIGkuZS4gdHVyaW5nIG9uIGFuIGFtcCBhdCBzdGFydCBvZiBwbGF5YmFjay4KKworCitEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09CisKK1RoZSBkb2N1bWVudGF0aW9uIGlzIHNwaWx0IGludG8gdGhlIGZvbGxvd2luZyBzZWN0aW9uczotCisKK292ZXJ2aWV3LnR4dDogVGhpcyBmaWxlLgorCitjb2RlYy50eHQ6IENvZGVjIGRyaXZlciBpbnRlcm5hbHMuCisKK0RBSS50eHQ6IERlc2NyaXB0aW9uIG9mIERpZ2l0YWwgQXVkaW8gSW50ZXJmYWNlIHN0YW5kYXJkcyBhbmQgaG93IHRvIGNvbmZpZ3VyZQorYSBEQUkgd2l0aGluIHlvdXIgY29kZWMgYW5kIENQVSBEQUkgZHJpdmVycy4KKworZGFwbS50eHQ6IER5bmFtaWMgQXVkaW8gUG93ZXIgTWFuYWdlbWVudAorCitwbGF0Zm9ybS50eHQ6IFBsYXRmb3JtIGF1ZGlvIERNQSBhbmQgREFJLgorCittYWNoaW5lLnR4dDogTWFjaGluZSBkcml2ZXIgaW50ZXJuYWxzLgorCitwb3BfY2xpY2tzLnR4dDogSG93IHRvIG1pbmltaXNlIGF1ZGlvIGFydGlmYWN0cy4KKworY2xvY2tpbmcudHh0OiBBU29DIGNsb2NraW5nIGZvciBiZXN0IHBvd2VyIHBlcmZvcm1hbmNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvcGxhdGZvcm0udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9wbGF0Zm9ybS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1YjE2ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvcGxhdGZvcm0udHh0CkBAIC0wLDAgKzEsNTggQEAKK0FTb0MgUGxhdGZvcm0gRHJpdmVyCis9PT09PT09PT09PT09PT09PT09PQorCitBbiBBU29DIHBsYXRmb3JtIGRyaXZlciBjYW4gYmUgZGl2aWRlZCBpbnRvIGF1ZGlvIERNQSBhbmQgU29DIERBSSBjb25maWd1cmF0aW9uCithbmQgY29udHJvbC4gVGhlIHBsYXRmb3JtIGRyaXZlcnMgb25seSB0YXJnZXQgdGhlIFNvQyBDUFUgYW5kIG11c3QgaGF2ZSBubyBib2FyZAorc3BlY2lmaWMgY29kZS4KKworQXVkaW8gRE1BCis9PT09PT09PT0KKworVGhlIHBsYXRmb3JtIERNQSBkcml2ZXIgb3B0aW9uYWxseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFsc2Egb3BlcmF0aW9uczotCisKKy8qIFNvQyBhdWRpbyBvcHMgKi8KK3N0cnVjdCBzbmRfc29jX29wcyB7CisJaW50ICgqc3RhcnR1cCkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCWludCAoKmh3X3BhcmFtcykoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICosIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqKTsKKwlpbnQgKCpod19mcmVlKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKik7CisJaW50ICgqcHJlcGFyZSkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCWludCAoKnRyaWdnZXIpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqLCBpbnQpOworfTsKKworVGhlIHBsYXRmb3JtIGRyaXZlciBleHBvcnRzIGl0J3MgRE1BIGZ1bmN0aW9uYWlsdHkgdmlhIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtOi0KKworc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0geworCWNoYXIgKm5hbWU7CisKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpKTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkpOworCisJLyogcGNtIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworCWludCAoKnBjbV9uZXcpKHN0cnVjdCBzbmRfY2FyZCAqLCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKiwgc3RydWN0IHNuZF9wY20gKik7CisJdm9pZCAoKnBjbV9mcmVlKShzdHJ1Y3Qgc25kX3BjbSAqKTsKKworCS8qIHBsYXRmb3JtIHN0cmVhbSBvcHMgKi8KKwlzdHJ1Y3Qgc25kX3BjbV9vcHMgKnBjbV9vcHM7Cit9OworCitQbGVhc2UgcmVmZXIgdG8gdGhlIGFsc2EgZHJpdmVyIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb2YgYXVkaW8gRE1BLgoraHR0cDovL3d3dy5hbHNhLXByb2plY3Qub3JnL35pd2FpL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIvYzQzNi5odG0KKworQW4gZXhhbXBsZSBETUEgZHJpdmVyIGlzIHNvYy9weGEvcHhhMnh4LXBjbS5jCisKKworU29DIERBSSBEcml2ZXJzCis9PT09PT09PT09PT09PT0KKworRWFjaCBTb0MgREFJIGRyaXZlciBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBmZWF0dXJlczotCisKKyAxKSBEaWdpdGFsIGF1ZGlvIGludGVyZmFjZSAoREFJKSBkZXNjcmlwdGlvbgorIDIpIERpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAzKSBQQ00ncyBkZXNjcmlwdGlvbgorIDQpIFN5c2NsayBjb25maWd1cmF0aW9uCisgNSkgU3VzcGVuZCBhbmQgcmVzdW1lIChvcHRpb25hbCkKKworUGxlYXNlIHNlZSBjb2RlYy50eHQgZm9yIGEgZGVzY3JpcHRpb24gb2YgaXRlbXMgMSAtIDQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL3BvcHNfY2xpY2tzLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvcG9wc19jbGlja3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjdlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL3BvcHNfY2xpY2tzLnR4dApAQCAtMCwwICsxLDUyIEBACitBdWRpbyBQb3BzIGFuZCBDbGlja3MKKz09PT09PT09PT09PT09PT09PT09PQorCitQb3BzIGFuZCBjbGlja3MgYXJlIHVud2FudGVkIGF1ZGlvIGFydGlmYWN0cyBjYXVzZWQgYnkgdGhlIHBvd2VyaW5nIHVwIGFuZCBkb3duCitvZiBjb21wb25lbnRzIHdpdGhpbiB0aGUgYXVkaW8gc3Vic3lzdGVtLiBUaGlzIGlzIG5vdGljYWJsZSBvbiBQQydzIHdoZW4gYW4KK2F1ZGlvIG1vZHVsZSBpcyBlaXRoZXIgbG9hZGVkIG9yIHVubG9hZGVkIChhdCBtb2R1bGUgbG9hZCB0aW1lIHRoZSBzb3VuZCBjYXJkIGlzCitwb3dlcmVkIHVwIGFuZCBjYXVzZXMgYSBwb3BwaW5nIG5vaXNlIG9uIHRoZSBzcGVha2VycykuCisKK1BvcHMgYW5kIGNsaWNrcyBjYW4gYmUgbW9yZSBmcmVxdWVudCBvbiBwb3J0YWJsZSBzeXN0ZW1zIHdpdGggREFQTS4gVGhpcyBpcworYmVjYXVzZSB0aGUgY29tcG9uZW50cyB3aXRoaW4gdGhlIHN1YnN5c3RlbSBhcmUgYmVpbmcgZHluYW1pY2FsbHkgcG93ZXJlZAorZGVwZW5kaW5nIG9uIHRoZSBhdWRpbyB1c2FnZSBhbmQgdGhpcyBjYW4gc3Vic2VxdWVudGx5IGNhdXNlIGEgc21hbGwgcG9wIG9yCitjbGljayBldmVyeSB0aW1lIGEgY29tcG9uZW50IHBvd2VyIHN0YXRlIGlzIGNoYW5nZWQuCisKKworTWluaW1pc2luZyBQbGF5YmFjayBQb3BzIGFuZCBDbGlja3MKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1BsYXliYWNrIHBvcHMgaW4gcG9ydGFibGUgYXVkaW8gc3Vic3lzdGVtcyBjYW5ub3QgYmUgY29tcGxldGVseSBlbGltaW5hdGVkIGF0bSwKK2hvd2V2ZXIgZnV0dXJlIGF1ZGlvIGNvZGVjIGhhcmR3YXJlIHdpbGwgaGF2ZSBiZXR0ZXIgcG9wIGFuZCBjbGljayBzdXByZXNzaW9uLgorUG9wcyBjYW4gYmUgcmVkdWNlZCB3aXRoaW4gcGxheWJhY2sgYnkgcG93ZXJpbmcgdGhlIGF1ZGlvIGNvbXBvbmVudHMgaW4gYQorc3BlY2lmaWMgb3JkZXIuIFRoaXMgb3JkZXIgaXMgZGlmZmVyZW50IGZvciBzdGFydHVwIGFuZCBzaHV0ZG93biBhbmQgZm9sbG93cworc29tZSBiYXNpYyBydWxlczotCisKKyBTdGFydHVwIE9yZGVyIDotIERBQyAtLT4gTWl4ZXJzIC0tPiBPdXRwdXQgUEdBIC0tPiBEaWdpdGFsIFVubXV0ZQorCisgU2h1dGRvd24gT3JkZXIgOi0gRGlnaXRhbCBNdXRlIC0tPiBPdXRwdXQgUEdBIC0tPiBNaXhlcnMgLS0+IERBQworCitUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY29kZWMgUENNIG91dHB1dCBwYXRoIGZyb20gdGhlIERBQyBpcyB2aWEgYSBtaXhlciBhbmQgdGhlbgorYSBQR0EgKHByb2dyYW1tYWJsZSBnYWluIGFtcGxpZmllcikgYmVmb3JlIGJlaW5nIG91dHB1dCB0byB0aGUgc3BlYWtlcnMuCisKKworTWluaW1pc2luZyBDYXB0dXJlIFBvcHMgYW5kIENsaWNrcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDYXB0dXJlIGFydGlmYWN0cyBhcmUgc29tZXdoYXQgZWFzaWVyIHRvIGdldCByaWQgYXMgd2UgY2FuIGRlbGF5IGFjdGl2YXRpbmcgdGhlCitBREMgdW50aWwgYWxsIHRoZSBwb3BzIGhhdmUgb2NjdXJlZC4gVGhpcyBmb2xsb3dzIHNpbWlsYXIgcG93ZXIgcnVsZXMgdG8KK3BsYXliYWNrIGluIHRoYXQgY29tcG9uZW50cyBhcmUgcG93ZXJlZCBpbiBhIHNlcXVlbmNlIGRlcGVuZGluZyB1cG9uIHN0cmVhbQorc3RhcnR1cCBvciBzaHV0ZG93bi4KKworIFN0YXJ0dXAgT3JkZXIgLSBJbnB1dCBQR0EgLS0+IE1peGVycyAtLT4gQURDCisKKyBTaHV0ZG93biBPcmRlciAtIEFEQyAtLT4gTWl4ZXJzIC0tPiBJbnB1dCBQR0EKKworCitaaXBwZXIgTm9pc2UKKz09PT09PT09PT09PQorQW4gdW53YW50ZWQgemlwcGVyIG5vaXNlIGNhbiBvY2N1ciB3aXRoaW4gdGhlIGF1ZGlvIHBsYXliYWNrIG9yIGNhcHR1cmUgc3RyZWFtCit3aGVuIGEgdm9sdW1lIGNvbnRyb2wgaXMgY2hhbmdlZCBuZWFyIGl0cyBtYXhpbXVtIGdhaW4gdmFsdWUuIFRoZSB6aXBwZXIgbm9pc2UKK2lzIGhlYXJkIHdoZW4gdGhlIGdhaW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UgY2hhbmdlcyB0aGUgbWVhbiBhdWRpbyBzaWduYWwKK2FtcGxpdHVkZSB0b28gcXVpY2tseS4gSXQgY2FuIGJlIG1pbmltaXNlZCBieSBlbmFibGluZyB0aGUgemVybyBjcm9zcyBzZXR0aW5nCitmb3IgZWFjaCB2b2x1bWUgY29udHJvbC4gVGhlIFpDIGZvcmNlcyB0aGUgZ2FpbiBjaGFuZ2UgdG8gb2NjdXIgd2hlbiB0aGUgc2lnbmFsCitjcm9zc2VzIHRoZSB6ZXJvIGFtcGxpdHVkZSBsaW5lLgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAzNzgwNjIzLi5hNmMxZWJkIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMTExNCw3ICsxMTE0LDcgQEAKIERBVklDT00gRkFTVCBFVEhFUk5FVCAoRE1GRSkgTkVUV09SSyBEUklWRVIKIFA6CVRvYmlhcyBSaW5nc3Ryb20KIE06CXRvcmlAdW5oYXBweS5taW5lLm51Ci1MOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKIERPQ0JPT0sgRk9SIERPQ1VNRU5UQVRJT04KQEAgLTIzNjEsNyArMjM2MSw3IEBACiBORVRXT1JLSU5HIFtXSVJFTEVTU10KIFA6CUpvaG4gVy4gTGludmlsbGUKIE06CWxpbnZpbGxlQHR1eGRyaXZlci5jb20KLUw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9saW52aWxsZS93aXJlbGVzcy0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKQEAgLTMwMzcsNiArMzAzNywxMiBAQAogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnCiBTOglNYWludGFpbmVkCiAKK1NPVU5EIC0gU09DIExBWUVSIC8gRFlOQU1JQyBBVURJTyBQT1dFUiBNQU5BR0VNRU5UCitQOglMaWFtIEdpcmR3b29kCitNOglsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20KK0w6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZworUzoJU3VwcG9ydGVkCisKIFNQSSBTVUJTWVNURU0KIFA6CURhdmlkIEJyb3duZWxsCiBNOglkYnJvd25lbGxAdXNlcnMuc291cmNlZm9yZ2UubmV0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvTWFrZWZpbGUKaW5kZXggZGY5NDk5NC4uOGUwOTkyMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL01ha2VmaWxlCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9NYWtlZmlsZQpAQCAtMSwyICsxLDIgQEAKLW9iai15CQkJCSs9IHNldHVwLm8gc3BpLm8gZmxhc2gubworb2JqLXkJCQkJKz0gc2V0dXAubyBmbGFzaC5vCiBvYmotJChDT05GSUdfQk9BUkRfQVRTVEsxMDAyKQkrPSBhdHN0azEwMDIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCmluZGV4IDMyYjM2MWYuLmQ0N2UzOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKQEAgLTgsMTcgKzgsMjQgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDMyYXA3MDAwLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcG9ydG11eC5oPgorCisKKyNkZWZpbmUJU1cyX0RFRkFVTFQJCS8qIE1NQ0kgYW5kIFVBUlRfQSBhdmFpbGFibGUgKi8KIAogc3RydWN0IGV0aF9hZGRyIHsKIAl1OCBhZGRyWzZdOwpAQCAtMjksNiArMzYsMTYgQEAKIHN0YXRpYyBzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBldGhfZGF0YVsyXTsKIGV4dGVybiBzdHJ1Y3QgbGNkY19wbGF0Zm9ybV9kYXRhIGF0c3RrMTAwMF9mYjBfZGF0YTsKIAorc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBzcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkubW9kYWxpYXMJPSAibHR2MzUwcXYiLAorCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKilHUElPX1BJTl9QQSg0KSwKKwkJLm1heF9zcGVlZF9oegk9IDE2MDAwMDAwLAorCQkuYnVzX251bQk9IDAsCisJCS5jaGlwX3NlbGVjdAk9IDEsCisJfSwKK307CisKIC8qCiAgKiBUaGUgbmV4dCB0d28gZnVuY3Rpb25zIHNob3VsZCBnbyBhd2F5IGFzIHRoZSBib290IGxvYWRlciBpcwogICogc3VwcG9zZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbWFjYiBhZGRyZXNzIHJlZ2lzdGVycyB3aXRoIGEgdmFsaWQKQEAgLTg2LDIzICsxMDMsNTMgQEAKIAogdm9pZCBfX2luaXQgc2V0dXBfYm9hcmQodm9pZCkKIHsKLQlhdDMyX21hcF91c2FydCgxLCAwKTsJLyogL2Rldi90dHlTMCAqLwotCWF0MzJfbWFwX3VzYXJ0KDIsIDEpOwkvKiAvZGV2L3R0eVMxICovCi0JYXQzMl9tYXBfdXNhcnQoMywgMik7CS8qIC9kZXYvdHR5UzIgKi8KKyNpZmRlZglTVzJfREVGQVVMVAorCWF0MzJfbWFwX3VzYXJ0KDEsIDApOwkvKiBVU0FSVCAxL0E6IC9kZXYvdHR5UzAsIERCOSAqLworI2Vsc2UKKwlhdDMyX21hcF91c2FydCgwLCAxKTsJLyogVVNBUlQgMC9COiAvZGV2L3R0eVMxLCBJUkRBICovCisjZW5kaWYKKwkvKiBVU0FSVCAyL3VudXNlZDogZXhwYW5zaW9uIGNvbm5lY3RvciAqLworCWF0MzJfbWFwX3VzYXJ0KDMsIDIpOwkvKiBVU0FSVCAzL0M6IC9kZXYvdHR5UzIsIERCOSAqLwogCiAJYXQzMl9zZXR1cF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgYXRzdGsxMDAyX2luaXQodm9pZCkKIHsKKwkvKgorCSAqIEFUU1RLMTAwMCB1c2VzIDMyLWJpdCBTRFJBTSBpbnRlcmZhY2UuIFJlc2VydmUgdGhlCisJICogU0RSQU0tc3BlY2lmaWMgcGlucyBzbyB0aGF0IG5vYm9keSBtZXNzZXMgd2l0aCB0aGVtLgorCSAqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMCkpOwkvKiBEQVRBWzE2XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMSkpOwkvKiBEQVRBWzE3XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMikpOwkvKiBEQVRBWzE4XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMykpOwkvKiBEQVRBWzE5XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNCkpOwkvKiBEQVRBWzIwXQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNSkpOwkvKiBEQVRBWzIxXQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNikpOwkvKiBEQVRBWzIyXQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNykpOwkvKiBEQVRBWzIzXQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoOCkpOwkvKiBEQVRBWzI0XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoOSkpOwkvKiBEQVRBWzI1XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTApKTsJLyogREFUQVsyNl0JKi8KKwlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDExKSk7CS8qIERBVEFbMjddCSovCisJYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMikpOwkvKiBEQVRBWzI4XQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTMpKTsJLyogREFUQVsyOV0JKi8KKwlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDE0KSk7CS8qIERBVEFbMzBdCSovCisJYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxNSkpOwkvKiBEQVRBWzMxXQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMjYpKTsJLyogU0RDUwkJKi8KKwogCWF0MzJfYWRkX3N5c3RlbV9kZXZpY2VzKCk7CiAKKyNpZmRlZglTVzJfREVGQVVMVAogCWF0MzJfYWRkX2RldmljZV91c2FydCgwKTsKKyNlbHNlCiAJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDEpOworI2VuZGlmCiAJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDIpOwogCiAJc2V0X2h3X2FkZHIoYXQzMl9hZGRfZGV2aWNlX2V0aCgwLCAmZXRoX2RhdGFbMF0pKTsKIAorCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHNwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKHNwaV9ib2FyZF9pbmZvKSk7CiAJYXQzMl9hZGRfZGV2aWNlX3NwaSgwKTsKIAlhdDMyX2FkZF9kZXZpY2VfbGNkYygwLCAmYXRzdGsxMDAwX2ZiMF9kYXRhKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL3NwaS5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL3NwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc3MjZjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9zcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBBVFNUSzEwMDAgU1BJIGRldmljZXMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgQXRtZWwgTm9yd2F5Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLQotc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBzcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkubW9kYWxpYXMJPSAibHR2MzUwcXYiLAotCQkubWF4X3NwZWVkX2h6CT0gMTYwMDAwMDAsCi0JCS5idXNfbnVtCT0gMCwKLQkJLmNoaXBfc2VsZWN0CT0gMSwKLQl9LAotfTsKLQotc3RhdGljIGludCBib2FyZF9pbml0X3NwaSh2b2lkKQotewotCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKHNwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKHNwaV9ib2FyZF9pbmZvKSk7Ci0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKGJvYXJkX2luaXRfc3BpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2NwdS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKaW5kZXggMzQyNDUyYi4uMmU3MmZkMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9pcnEuYyBiL2FyY2gvYXZyMzIva2VybmVsL2lycS5jCmluZGV4IDg1NmYzNTQuLmZkMzExMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2lycS5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL2lycS5jCkBAIC01Nyw2ICs1Nyw3IEBACiAJCXNlcV9wcmludGYocCwgIiUzZDogIiwgaSk7CiAJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQogCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9jcHUoY3B1KS5pcnFzW2ldKTsKKwkJc2VxX3ByaW50ZihwLCAiICU4cyIsIGlycV9kZXNjW2ldLmNoaXAtPm5hbWUgPyA6ICItIik7CiAJCXNlcV9wcmludGYocCwgIiAgJXMiLCBhY3Rpb24tPm5hbWUpOwogCQlmb3IgKGFjdGlvbiA9IGFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCiAJCQlzZXFfcHJpbnRmKHAsICIsICVzIiwgYWN0aW9uLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3NldHVwLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9zZXR1cC5jCmluZGV4IGEzNDIxMTYuLmM2NzM0YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC0xNzQsOCArMTc1LDcgQEAKIAkgKiBDb3B5IHRoZSBkYXRhIHNvIHRoZSBib290bWVtIGluaXQgY29kZSBkb2Vzbid0IG5lZWQgdG8gY2FyZQogCSAqIGFib3V0IGl0LgogCSAqLwotCWlmIChtZW1fcmFuZ2VfbmV4dF9mcmVlID49Ci0JICAgIChzaXplb2YobWVtX3JhbmdlX2NhY2hlKSAvIHNpemVvZihtZW1fcmFuZ2VfY2FjaGVbMF0pKSkKKwlpZiAobWVtX3JhbmdlX25leHRfZnJlZSA+PSBBUlJBWV9TSVpFKG1lbV9yYW5nZV9jYWNoZSkpCiAJCXBhbmljKCJQaHlzaWNhbCBtZW1vcnkgbWFwIHRvbyBjb21wbGV4IVxuIik7CiAKIAluZXcgPSAmbWVtX3JhbmdlX2NhY2hlW21lbV9yYW5nZV9uZXh0X2ZyZWUrK107CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2xpYi9saWJnY2MuaCBiL2FyY2gvYXZyMzIvbGliL2xpYmdjYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTA5MWI1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXZyMzIvbGliL2xpYmdjYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgZnVuY3Rpb25zICdib3Jyb3dlZCcgZnJvbSBnY2MtMy40LjMgKi8KLQotI2RlZmluZSBCSVRTX1BFUl9VTklUCTgKLQotdHlwZWRlZgkJIGludCBRSXR5cGUJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFFJKSkpOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVVFJdHlwZQlfX2F0dHJpYnV0ZV9fICgobW9kZSAoUUkpKSk7Ci10eXBlZGVmCQkgaW50IEhJdHlwZQlfX2F0dHJpYnV0ZV9fICgobW9kZSAoSEkpKSk7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVSEl0eXBlCV9fYXR0cmlidXRlX18gKChtb2RlIChISSkpKTsKLXR5cGVkZWYgCSBpbnQgU0l0eXBlCV9fYXR0cmlidXRlX18gKChtb2RlIChTSSkpKTsKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVTSXR5cGUJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNJKSkpOwotdHlwZWRlZgkJIGludCBESXR5cGUJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKERJKSkpOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVURJdHlwZQlfX2F0dHJpYnV0ZV9fICgobW9kZSAoREkpKSk7Ci10eXBlZGVmIAlmbG9hdCBTRnR5cGUJX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNGKSkpOwotdHlwZWRlZgkJZmxvYXQgREZ0eXBlCV9fYXR0cmlidXRlX18gKChtb2RlIChERikpKTsKLXR5cGVkZWYgaW50IHdvcmRfdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoX193b3JkX18pKSk7Ci0KLSNkZWZpbmUgV19UWVBFX1NJWkUgKDQgKiBCSVRTX1BFUl9VTklUKQotI2RlZmluZSBXdHlwZQlTSXR5cGUKLSNkZWZpbmUgVVd0eXBlCVVTSXR5cGUKLSNkZWZpbmUgSFd0eXBlCVNJdHlwZQotI2RlZmluZSBVSFd0eXBlCVVTSXR5cGUKLSNkZWZpbmUgRFd0eXBlCURJdHlwZQotI2RlZmluZSBVRFd0eXBlCVVESXR5cGUKLSNkZWZpbmUgX19OVyhhLGIpCV9fICMjIGEgIyMgc2kgIyMgYgotI2RlZmluZSBfX05EVyhhLGIpCV9fICMjIGEgIyMgZGkgIyMgYgotCi1zdHJ1Y3QgRFdzdHJ1Y3Qge1d0eXBlIGhpZ2gsIGxvdzt9OwotCi10eXBlZGVmIHVuaW9uCi17Ci0gIHN0cnVjdCBEV3N0cnVjdCBzOwotICBEV3R5cGUgbGw7Ci19IERXdW5pb247CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2xpYi9sb25nbG9uZy5oIGIvYXJjaC9hdnIzMi9saWIvbG9uZ2xvbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1ZTM2OS4uMDAwMDAwMAotLS0gYS9hcmNoL2F2cjMyL2xpYi9sb25nbG9uZy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyogbG9uZ2xvbmcuaCAtLSBkZWZpbml0aW9ucyBmb3IgbWl4ZWQgc2l6ZSAzMi82NCBiaXQgYXJpdGhtZXRpYy4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZGVmaW5pdGlvbiBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0Ci0gICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBkZWZpbml0aW9uIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBCb3Jyb3dlZCBmcm9tIGdjYy0zLjQuMyAqLwotCi0jZGVmaW5lIF9fQklUUzQgKFdfVFlQRV9TSVpFIC8gNCkKLSNkZWZpbmUgX19sbF9CICgoVVd0eXBlKSAxIDw8IChXX1RZUEVfU0laRSAvIDIpKQotI2RlZmluZSBfX2xsX2xvd3BhcnQodCkgKChVV3R5cGUpICh0KSAmIChfX2xsX0IgLSAxKSkKLSNkZWZpbmUgX19sbF9oaWdocGFydCh0KSAoKFVXdHlwZSkgKHQpID4+IChXX1RZUEVfU0laRSAvIDIpKQotCi0jZGVmaW5lIGNvdW50X2xlYWRpbmdfemVyb3MoY291bnQsIHgpICgoY291bnQpID0gX19idWlsdGluX2Nseih4KSkKLQotI2RlZmluZSBfX3VkaXZfcXJubmRfYyhxLCByLCBuMSwgbjAsIGQpIFwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBVV3R5cGUgX19kMSwgX19kMCwgX19xMSwgX19xMDsJCQkJCVwKLSAgICBVV3R5cGUgX19yMSwgX19yMCwgX19tOwkJCQkJCVwKLSAgICBfX2QxID0gX19sbF9oaWdocGFydCAoZCk7CQkJCQkJXAotICAgIF9fZDAgPSBfX2xsX2xvd3BhcnQgKGQpOwkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICBfX3IxID0gKG4xKSAlIF9fZDE7CQkJCQkJCVwKLSAgICBfX3ExID0gKG4xKSAvIF9fZDE7CQkJCQkJCVwKLSAgICBfX20gPSAoVVd0eXBlKSBfX3ExICogX19kMDsJCQkJCQlcCi0gICAgX19yMSA9IF9fcjEgKiBfX2xsX0IgfCBfX2xsX2hpZ2hwYXJ0IChuMCk7CQkJCVwKLSAgICBpZiAoX19yMSA8IF9fbSkJCQkJCQkJXAotICAgICAgewkJCQkJCQkJCVwKLQlfX3ExLS0sIF9fcjEgKz0gKGQpOwkJCQkJCVwKLQlpZiAoX19yMSA+PSAoZCkpIC8qIGkuZS4gd2UgZGlkbid0IGdldCBjYXJyeSB3aGVuIGFkZGluZyB0byBfX3IxICovXAotCSAgaWYgKF9fcjEgPCBfX20pCQkJCQkJXAotCSAgICBfX3ExLS0sIF9fcjEgKz0gKGQpOwkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICBfX3IxIC09IF9fbTsJCQkJCQkJXAotCQkJCQkJCQkJXAotICAgIF9fcjAgPSBfX3IxICUgX19kMTsJCQkJCQkJXAotICAgIF9fcTAgPSBfX3IxIC8gX19kMTsJCQkJCQkJXAotICAgIF9fbSA9IChVV3R5cGUpIF9fcTAgKiBfX2QwOwkJCQkJCVwKLSAgICBfX3IwID0gX19yMCAqIF9fbGxfQiB8IF9fbGxfbG93cGFydCAobjApOwkJCQlcCi0gICAgaWYgKF9fcjAgPCBfX20pCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0JX19xMC0tLCBfX3IwICs9IChkKTsJCQkJCQlcCi0JaWYgKF9fcjAgPj0gKGQpKQkJCQkJCVwKLQkgIGlmIChfX3IwIDwgX19tKQkJCQkJCVwKLQkgICAgX19xMC0tLCBfX3IwICs9IChkKTsJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gICAgX19yMCAtPSBfX207CQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICAocSkgPSAoVVd0eXBlKSBfX3ExICogX19sbF9CIHwgX19xMDsJCQkJXAotICAgIChyKSA9IF9fcjA7CQkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgdWRpdl9xcm5uZCBfX3VkaXZfcXJubmRfYwotCi0jZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAotICBkbyB7CQkJCQkJCQkJXAotICAgIFVXdHlwZSBfX3g7CQkJCQkJCQlcCi0gICAgX194ID0gKGFsKSAtIChibCk7CQkJCQkJCVwKLSAgICAoc2gpID0gKGFoKSAtIChiaCkgLSAoX194ID4gKGFsKSk7CQkJCQlcCi0gICAgKHNsKSA9IF9feDsJCQkJCQkJCVwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KQkJCQkJCVwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICBVV3R5cGUgX194MCwgX194MSwgX194MiwgX194MzsJCQkJCVwKLSAgICBVSFd0eXBlIF9fdWwsIF9fdmwsIF9fdWgsIF9fdmg7CQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX191bCA9IF9fbGxfbG93cGFydCAodSk7CQkJCQkJXAotICAgIF9fdWggPSBfX2xsX2hpZ2hwYXJ0ICh1KTsJCQkJCQlcCi0gICAgX192bCA9IF9fbGxfbG93cGFydCAodik7CQkJCQkJXAotICAgIF9fdmggPSBfX2xsX2hpZ2hwYXJ0ICh2KTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX194MCA9IChVV3R5cGUpIF9fdWwgKiBfX3ZsOwkJCQkJXAotICAgIF9feDEgPSAoVVd0eXBlKSBfX3VsICogX192aDsJCQkJCVwKLSAgICBfX3gyID0gKFVXdHlwZSkgX191aCAqIF9fdmw7CQkJCQlcCi0gICAgX194MyA9IChVV3R5cGUpIF9fdWggKiBfX3ZoOwkJCQkJXAotCQkJCQkJCQkJXAotICAgIF9feDEgKz0gX19sbF9oaWdocGFydCAoX194MCk7LyogdGhpcyBjYW4ndCBnaXZlIGNhcnJ5ICovCQlcCi0gICAgX194MSArPSBfX3gyOwkJLyogYnV0IHRoaXMgaW5kZWVkIGNhbiAqLwkJXAotICAgIGlmIChfX3gxIDwgX194MikJCS8qIGRpZCB3ZSBnZXQgaXQ/ICovCQkJXAotICAgICAgX194MyArPSBfX2xsX0I7CQkvKiB5ZXMsIGFkZCBpdCBpbiB0aGUgcHJvcGVyIHBvcy4gICovCVwKLQkJCQkJCQkJCVwKLSAgICAodzEpID0gX194MyArIF9fbGxfaGlnaHBhcnQgKF9feDEpOwkJCQkJXAotICAgICh3MCkgPSBfX2xsX2xvd3BhcnQgKF9feDEpICogX19sbF9CICsgX19sbF9sb3dwYXJ0IChfX3gwKTsJCVwKLSAgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL01ha2VmaWxlCmluZGV4IGY2MmViNjkuLmIyMWJlYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvTWFrZWZpbGUKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9NYWtlZmlsZQpAQCAtMSwyICsxLDIgQEAKLW9iai15CQkJCSs9IGF0MzJhcC5vIGNsb2NrLm8gcGlvLm8gaW50Yy5vIGV4dGludC5vIGhzbWMubworb2JqLXkJCQkJKz0gYXQzMmFwLm8gY2xvY2subyBpbnRjLm8gZXh0aW50Lm8gcGlvLm8gaHNtYy5vCiBvYmotJChDT05GSUdfQ1BVX0FUMzJBUDcwMDApCSs9IGF0MzJhcDcwMDAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYwppbmRleCA0OGY0ZWYzLi5jMWU0NzdlIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYwpAQCAtNDk2LDkgKzQ5NiwxNiBAQAogREVGSU5FX0RFVihwaW8sIDMpOwogREVWX0NMSyhtY2ssIHBpbzMsIHBiYSwgMTMpOwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBpbzRfcmVzb3VyY2VbXSA9IHsKKwlQQk1FTSgweGZmZTAzODAwKSwKKwlJUlEoMTcpLAorfTsKK0RFRklORV9ERVYocGlvLCA0KTsKK0RFVl9DTEsobWNrLCBwaW80LCBwYmEsIDE0KTsKKwogdm9pZCBfX2luaXQgYXQzMl9hZGRfc3lzdGVtX2RldmljZXModm9pZCkKIHsKLQlzeXN0ZW1fbWFuYWdlci5laW1fZmlyc3RfaXJxID0gTlJfSU5URVJOQUxfSVJRUzsKKwlzeXN0ZW1fbWFuYWdlci5laW1fZmlyc3RfaXJxID0gRUlNX0lSUV9CQVNFOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDMyX3NtX2RldmljZSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDMyX2ludGMwX2RldmljZSk7CkBAIC01MDksNiArNTE2LDcgQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBpbzFfZGV2aWNlKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBpbzJfZGV2aWNlKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBpbzNfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBpbzRfZGV2aWNlKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUyMSw3ICs1MjksNyBAQAogfTsKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXRtZWxfdXNhcnQwX3Jlc291cmNlW10gPSB7CiAJUEJNRU0oMHhmZmUwMGMwMCksCi0JSVJRKDcpLAorCUlSUSg2KSwKIH07CiBERUZJTkVfREVWX0RBVEEoYXRtZWxfdXNhcnQsIDApOwogREVWX0NMSyh1c2FydCwgYXRtZWxfdXNhcnQwLCBwYmEsIDQpOwpAQCAtNTgzLDcgKzU5MSw3IEBACiAJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMTcpLCBQRVJJUEhfQiwgMCk7CS8qIFRYRAkqLwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXQzMl91c2FydHNbNF07CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0ZGF0YSBhdDMyX3VzYXJ0c1s0XTsKIAogdm9pZCBfX2luaXQgYXQzMl9tYXBfdXNhcnQodW5zaWduZWQgaW50IGh3X2lkLCB1bnNpZ25lZCBpbnQgbGluZSkKIHsKQEAgLTcyOCwxMiArNzM2LDE5IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIFNQSQogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3BpMF9yZXNvdXJjZVtdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdG1lbF9zcGkwX3Jlc291cmNlW10gPSB7CiAJUEJNRU0oMHhmZmUwMDAwMCksCiAJSVJRKDMpLAogfTsKLURFRklORV9ERVYoc3BpLCAwKTsKLURFVl9DTEsobWNrLCBzcGkwLCBwYmEsIDApOworREVGSU5FX0RFVihhdG1lbF9zcGksIDApOworREVWX0NMSyhzcGlfY2xrLCBhdG1lbF9zcGkwLCBwYmEsIDApOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF0bWVsX3NwaTFfcmVzb3VyY2VbXSA9IHsKKwlQQk1FTSgweGZmZTAwNDAwKSwKKwlJUlEoNCksCit9OworREVGSU5FX0RFVihhdG1lbF9zcGksIDEpOworREVWX0NMSyhzcGlfY2xrLCBhdG1lbF9zcGkxLCBwYmEsIDEpOwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgYXQzMl9hZGRfZGV2aWNlX3NwaSh1bnNpZ25lZCBpbnQgaWQpCiB7CkBAIC03NDEsMTMgKzc1NiwzMyBAQAogCiAJc3dpdGNoIChpZCkgewogCWNhc2UgMDoKLQkJcGRldiA9ICZzcGkwX2RldmljZTsKKwkJcGRldiA9ICZhdG1lbF9zcGkwX2RldmljZTsKIAkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMCksICBQRVJJUEhfQSwgMCk7CS8qIE1JU08JICovCiAJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDEpLCAgUEVSSVBIX0EsIDApOwkvKiBNT1NJCSAqLwogCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgyKSwgIFBFUklQSF9BLCAwKTsJLyogU0NLCSAqLwotCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgzKSwgIFBFUklQSF9BLCAwKTsJLyogTlBDUzAgKi8KLQkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoNCksICBQRVJJUEhfQSwgMCk7CS8qIE5QQ1MxICovCi0JCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDUpLCAgUEVSSVBIX0EsIDApOwkvKiBOUENTMiAqLworCisJCS8qIE5QQ1NbMjowXSAqLworCQlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BBKDMpLAorCQkJCSBBVDMyX0dQSU9GX09VVFBVVCB8IEFUMzJfR1BJT0ZfSElHSCk7CisJCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEEoNCksCisJCQkJIEFUMzJfR1BJT0ZfT1VUUFVUIHwgQVQzMl9HUElPRl9ISUdIKTsKKwkJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQSg1KSwKKwkJCQkgQVQzMl9HUElPRl9PVVRQVVQgfCBBVDMyX0dQSU9GX0hJR0gpOworCQlicmVhazsKKworCWNhc2UgMToKKwkJcGRldiA9ICZhdG1lbF9zcGkxX2RldmljZTsKKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMCksICBQRVJJUEhfQiwgMCk7CS8qIE1JU08gICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDEpLCAgUEVSSVBIX0IsIDApOwkvKiBNT1NJICAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQig1KSwgIFBFUklQSF9CLCAwKTsJLyogU0NLICAgKi8KKworCQkvKiBOUENTWzI6MF0gKi8KKwkJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQigyKSwKKwkJCQkgQVQzMl9HUElPRl9PVVRQVVQgfCBBVDMyX0dQSU9GX0hJR0gpOworCQlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BCKDMpLAorCQkJCSBBVDMyX0dQSU9GX09VVFBVVCB8IEFUMzJfR1BJT0ZfSElHSCk7CisJCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEIoNCksCisJCQkJIEFUMzJfR1BJT0ZfT1VUUFVUIHwgQVQzMl9HUElPRl9ISUdIKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtODYwLDYgKzg5NSw3IEBACiAJJnBpbzFfbWNrLAogCSZwaW8yX21jaywKIAkmcGlvM19tY2ssCisJJnBpbzRfbWNrLAogCSZhdG1lbF91c2FydDBfdXNhcnQsCiAJJmF0bWVsX3VzYXJ0MV91c2FydCwKIAkmYXRtZWxfdXNhcnQyX3VzYXJ0LApAQCAtODY4LDcgKzkwNCw4IEBACiAJJm1hY2IwX3BjbGssCiAJJm1hY2IxX2hjbGssCiAJJm1hY2IxX3BjbGssCi0JJnNwaTBfbWNrLAorCSZhdG1lbF9zcGkwX3NwaV9jbGssCisJJmF0bWVsX3NwaTFfc3BpX2NsaywKIAkmbGNkYzBfaGNsaywKIAkmbGNkYzBfcGl4Y2xrLAogfTsKQEAgLTg4MCw2ICs5MTcsNyBAQAogCWF0MzJfaW5pdF9waW8oJnBpbzFfZGV2aWNlKTsKIAlhdDMyX2luaXRfcGlvKCZwaW8yX2RldmljZSk7CiAJYXQzMl9pbml0X3BpbygmcGlvM19kZXZpY2UpOworCWF0MzJfaW5pdF9waW8oJnBpbzRfZGV2aWNlKTsKIH0KIAogdm9pZCBfX2luaXQgYXQzMl9jbG9ja19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2V4dGludC5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9leHRpbnQuYwppbmRleCBiNTkyNzJlLi40YTYwZWNjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2V4dGludC5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvZXh0aW50LmMKQEAgLTU1LDIwICs1NSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKKwlmbG93X3R5cGUgJj0gSVJRX1RZUEVfU0VOU0VfTUFTSzsKIAlpZiAoZmxvd190eXBlID09IElSUV9UWVBFX05PTkUpCiAJCWZsb3dfdHlwZSA9IElSUV9UWVBFX0xFVkVMX0xPVzsKIAogCWRlc2MgPSAmaXJxX2Rlc2NbaXJxXTsKLQlkZXNjLT5zdGF0dXMgJj0gfihJUlFfVFlQRV9TRU5TRV9NQVNLIHwgSVJRX0xFVkVMKTsKLQlkZXNjLT5zdGF0dXMgfD0gZmxvd190eXBlICYgSVJRX1RZUEVfU0VOU0VfTUFTSzsKLQotCWlmIChmbG93X3R5cGUgJiAoSVJRX1RZUEVfTEVWRUxfTE9XIHwgSVJRX1RZUEVfTEVWRUxfSElHSCkpIHsKLQkJZGVzYy0+c3RhdHVzIHw9IElSUV9MRVZFTDsKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0JfSBlbHNlIHsKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmc20tPmxvY2ssIGZsYWdzKTsKIAogCW1vZGUgPSBzbV9yZWFkbChzbSwgRUlNX01PREUpOwpAQCAtOTcsOSArODgsMTYgQEAKIAkJYnJlYWs7CiAJfQogCi0Jc21fd3JpdGVsKHNtLCBFSU1fTU9ERSwgbW9kZSk7Ci0Jc21fd3JpdGVsKHNtLCBFSU1fRURHRSwgZWRnZSk7Ci0Jc21fd3JpdGVsKHNtLCBFSU1fTEVWRUwsIGxldmVsKTsKKwlpZiAocmV0ID09IDApIHsKKwkJc21fd3JpdGVsKHNtLCBFSU1fTU9ERSwgbW9kZSk7CisJCXNtX3dyaXRlbChzbSwgRUlNX0VER0UsIGVkZ2UpOworCQlzbV93cml0ZWwoc20sIEVJTV9MRVZFTCwgbGV2ZWwpOworCisJCWlmIChmbG93X3R5cGUgJiAoSVJRX1RZUEVfTEVWRUxfTE9XIHwgSVJRX1RZUEVfTEVWRUxfSElHSCkpCisJCQlmbG93X3R5cGUgfD0gSVJRX0xFVkVMOworCQlkZXNjLT5zdGF0dXMgJj0gfihJUlFfVFlQRV9TRU5TRV9NQVNLIHwgSVJRX0xFVkVMKTsKKwkJZGVzYy0+c3RhdHVzIHw9IGZsb3dfdHlwZTsKKwl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbS0+bG9jaywgZmxhZ3MpOwogCkBAIC0xMjIsOCArMTIwLDYgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXR1cywgcGVuZGluZzsKIAl1bnNpZ25lZCBpbnQgaSwgZXh0X2lycTsKIAotCXNwaW5fbG9jaygmc20tPmxvY2spOwotCiAJc3RhdHVzID0gc21fcmVhZGwoc20sIEVJTV9JU1IpOwogCXBlbmRpbmcgPSBzdGF0dXMgJiBzbV9yZWFkbChzbSwgRUlNX0lNUik7CiAKQEAgLTEzMywxMCArMTI5LDExIEBACiAKIAkJZXh0X2lycSA9IGkgKyBzbS0+ZWltX2ZpcnN0X2lycTsKIAkJZXh0X2Rlc2MgPSBpcnFfZGVzYyArIGV4dF9pcnE7Ci0JCWV4dF9kZXNjLT5oYW5kbGVfaXJxKGV4dF9pcnEsIGV4dF9kZXNjKTsKKwkJaWYgKGV4dF9kZXNjLT5zdGF0dXMgJiBJUlFfTEVWRUwpCisJCQloYW5kbGVfbGV2ZWxfaXJxKGV4dF9pcnEsIGV4dF9kZXNjKTsKKwkJZWxzZQorCQkJaGFuZGxlX2VkZ2VfaXJxKGV4dF9pcnEsIGV4dF9kZXNjKTsKIAl9Ci0KLQlzcGluX3VubG9jaygmc20tPmxvY2spOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBlaW1faW5pdCh2b2lkKQpAQCAtMTY4LDggKzE2NSw5IEBACiAJc20tPmVpbV9jaGlwID0gJmVpbV9jaGlwOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgeworCQkvKiBOT1RFIHRoZSBoYW5kbGVyIHdlIHNldCBoZXJlIGlzIGlnbm9yZWQgYnkgdGhlIGRlbXV4ICovCiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihzbS0+ZWltX2ZpcnN0X2lycSArIGksICZlaW1fY2hpcCwKLQkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9jaGlwX2RhdGEoc20tPmVpbV9maXJzdF9pcnEgKyBpLCBzbSk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYwppbmRleCBmMTI4MGVkLi45YmE1NjU0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMKQEAgLTEyLDcgKzEyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9wb3J0bXV4Lmg+CkBAIC0yNiw3ICsyOCw4IEBACiAJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJdTMyIHBpbm11eF9tYXNrOwotCWNoYXIgbmFtZVszMl07CisJdTMyIGdwaW9fbWFzazsKKwljaGFyIG5hbWVbOF07CiB9OwogCiBzdGF0aWMgc3RydWN0IHBpb19kZXZpY2UgcGlvX2RldltNQVhfTlJfUElPX0RFVklDRVNdOwpAQCAtNzYsNiArNzksOSBAQAogCWlmICghKGZsYWdzICYgQVQzMl9HUElPRl9QVUxMVVApKQogCQlwaW9fd3JpdGVsKHBpbywgUFVEUiwgbWFzayk7CiAKKwkvKiBncGlvX3JlcXVlc3QgTk9UIGFsbG93ZWQgKi8KKwlzZXRfYml0KHBpbl9pbmRleCwgJnBpby0+Z3Bpb19tYXNrKTsKKwogCXJldHVybjsKIAogZmFpbDoKQEAgLTk5LDE5ICsxMDUsMjkgQEAKIAkJZ290byBmYWlsOwogCX0KIAotCXBpb193cml0ZWwocGlvLCBQVUVSLCBtYXNrKTsKLQlpZiAoZmxhZ3MgJiBBVDMyX0dQSU9GX0hJR0gpCi0JCXBpb193cml0ZWwocGlvLCBTT0RSLCBtYXNrKTsKLQllbHNlCi0JCXBpb193cml0ZWwocGlvLCBDT0RSLCBtYXNrKTsKLQlpZiAoZmxhZ3MgJiBBVDMyX0dQSU9GX09VVFBVVCkKKwlpZiAoZmxhZ3MgJiBBVDMyX0dQSU9GX09VVFBVVCkgeworCQlpZiAoZmxhZ3MgJiBBVDMyX0dQSU9GX0hJR0gpCisJCQlwaW9fd3JpdGVsKHBpbywgU09EUiwgbWFzayk7CisJCWVsc2UKKwkJCXBpb193cml0ZWwocGlvLCBDT0RSLCBtYXNrKTsKKwkJcGlvX3dyaXRlbChwaW8sIFBVRFIsIG1hc2spOwogCQlwaW9fd3JpdGVsKHBpbywgT0VSLCBtYXNrKTsKLQllbHNlCisJfSBlbHNlIHsKKwkJaWYgKGZsYWdzICYgQVQzMl9HUElPRl9QVUxMVVApCisJCQlwaW9fd3JpdGVsKHBpbywgUFVFUiwgbWFzayk7CisJCWVsc2UKKwkJCXBpb193cml0ZWwocGlvLCBQVURSLCBtYXNrKTsKKwkJaWYgKGZsYWdzICYgQVQzMl9HUElPRl9ERUdMSVRDSCkKKwkJCXBpb193cml0ZWwocGlvLCBJRkVSLCBtYXNrKTsKKwkJZWxzZQorCQkJcGlvX3dyaXRlbChwaW8sIElGRFIsIG1hc2spOwogCQlwaW9fd3JpdGVsKHBpbywgT0RSLCBtYXNrKTsKKwl9CiAKIAlwaW9fd3JpdGVsKHBpbywgUEVSLCBtYXNrKTsKLQlpZiAoIShmbGFncyAmIEFUMzJfR1BJT0ZfUFVMTFVQKSkKLQkJcGlvX3dyaXRlbChwaW8sIFBVRFIsIG1hc2spOworCisJLyogZ3Bpb19yZXF1ZXN0IG5vdyBhbGxvd2VkICovCisJY2xlYXJfYml0KHBpbl9pbmRleCwgJnBpby0+Z3Bpb19tYXNrKTsKIAogCXJldHVybjsKIApAQCAtMTE5LDIwICsxMzUsMjIwIEBACiAJZHVtcF9zdGFjaygpOwogfQogCisvKiBSZXNlcnZlIGEgcGluLCBwcmV2ZW50aW5nIGFueW9uZSBlbHNlIGZyb20gY2hhbmdpbmcgaXRzIGNvbmZpZ3VyYXRpb24uICovCit2b2lkIF9faW5pdCBhdDMyX3Jlc2VydmVfcGluKHVuc2lnbmVkIGludCBwaW4pCit7CisJc3RydWN0IHBpb19kZXZpY2UgKnBpbzsKKwl1bnNpZ25lZCBpbnQgcGluX2luZGV4ID0gcGluICYgMHgxZjsKKworCXBpbyA9IGdwaW9fdG9fcGlvKHBpbik7CisJaWYgKHVubGlrZWx5KCFwaW8pKSB7CisJCXByaW50aygicGlvOiBpbnZhbGlkIHBpbiAldVxuIiwgcGluKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICh1bmxpa2VseSh0ZXN0X2FuZF9zZXRfYml0KHBpbl9pbmRleCwgJnBpby0+cGlubXV4X21hc2spKSkgeworCQlwcmludGsoIiVzOiBwaW4gJXUgaXMgYnVzeVxuIiwgcGlvLT5uYW1lLCBwaW5faW5kZXgpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuOworCitmYWlsOgorCWR1bXBfc3RhY2soKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdQSU8gQVBJICovCisKK2ludCBncGlvX3JlcXVlc3QodW5zaWduZWQgaW50IGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQoreworCXN0cnVjdCBwaW9fZGV2aWNlICpwaW87CisJdW5zaWduZWQgaW50IHBpbjsKKworCXBpbyA9IGdwaW9fdG9fcGlvKGdwaW8pOworCWlmICghcGlvKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBpbiA9IGdwaW8gJiAweDFmOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KHBpbiwgJnBpby0+Z3Bpb19tYXNrKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChncGlvX3JlcXVlc3QpOworCit2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlzdHJ1Y3QgcGlvX2RldmljZSAqcGlvOworCXVuc2lnbmVkIGludCBwaW47CisKKwlwaW8gPSBncGlvX3RvX3BpbyhncGlvKTsKKwlpZiAoIXBpbykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJncGlvOiBhdHRlbXB0ZWQgdG8gZnJlZSBpbnZhbGlkIHBpbiAldVxuIiwgZ3Bpbyk7CisJCXJldHVybjsKKwl9CisKKwlwaW4gPSBncGlvICYgMHgxZjsKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChwaW4sICZwaW8tPmdwaW9fbWFzaykpCisJCXByaW50ayhLRVJOX0VSUiAiZ3BpbzogZnJlZWluZyBmcmVlIG9yIG5vbi1ncGlvIHBpbiAlcy0ldVxuIiwKKwkJICAgICAgIHBpby0+bmFtZSwgcGluKTsKK30KK0VYUE9SVF9TWU1CT0woZ3Bpb19mcmVlKTsKKworaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCBwaW9fZGV2aWNlICpwaW87CisJdW5zaWduZWQgaW50IHBpbjsKKworCXBpbyA9IGdwaW9fdG9fcGlvKGdwaW8pOworCWlmICghcGlvKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBpbiA9IGdwaW8gJiAweDFmOworCXBpb193cml0ZWwocGlvLCBPRFIsIDEgPDwgcGluKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9pbnB1dCk7CisKK2ludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgaW50IGdwaW8pCit7CisJc3RydWN0IHBpb19kZXZpY2UgKnBpbzsKKwl1bnNpZ25lZCBpbnQgcGluOworCisJcGlvID0gZ3Bpb190b19waW8oZ3Bpbyk7CisJaWYgKCFwaW8pCisJCXJldHVybiAtRU5PREVWOworCisJcGluID0gZ3BpbyAmIDB4MWY7CisJcGlvX3dyaXRlbChwaW8sIE9FUiwgMSA8PCBwaW4pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX291dHB1dCk7CisKK2ludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlzdHJ1Y3QgcGlvX2RldmljZSAqcGlvID0gJnBpb19kZXZbZ3BpbyA+PiA1XTsKKworCXJldHVybiAocGlvX3JlYWRsKHBpbywgUERTUikgPj4gKGdwaW8gJiAweDFmKSkgJiAxOworfQorRVhQT1JUX1NZTUJPTChncGlvX2dldF92YWx1ZSk7CisKK3ZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgaW50IGdwaW8sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcGlvX2RldmljZSAqcGlvID0gJnBpb19kZXZbZ3BpbyA+PiA1XTsKKwl1MzIgbWFzazsKKworCW1hc2sgPSAxIDw8IChncGlvICYgMHgxZik7CisJaWYgKHZhbHVlKQorCQlwaW9fd3JpdGVsKHBpbywgU09EUiwgbWFzayk7CisJZWxzZQorCQlwaW9fd3JpdGVsKHBpbywgQ09EUiwgbWFzayk7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fc2V0X3ZhbHVlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdQSU8gSVJRIHN1cHBvcnQgKi8KKworc3RhdGljIHZvaWQgZ3Bpb19pcnFfbWFzayh1bnNpZ25lZCBpcnEpCit7CisJdW5zaWduZWQJCWdwaW8gPSBpcnFfdG9fZ3BpbyhpcnEpOworCXN0cnVjdCBwaW9fZGV2aWNlCSpwaW8gPSAmcGlvX2RldltncGlvID4+IDVdOworCisJcGlvX3dyaXRlbChwaW8sIElEUiwgMSA8PCAoZ3BpbyAmIDB4MWYpKTsKK30KKworc3RhdGljIHZvaWQgZ3Bpb19pcnFfdW5tYXNrKHVuc2lnbmVkIGlycSkKK3sKKwl1bnNpZ25lZAkJZ3BpbyA9IGlycV90b19ncGlvKGlycSk7CisJc3RydWN0IHBpb19kZXZpY2UJKnBpbyA9ICZwaW9fZGV2W2dwaW8gPj4gNV07CisKKwlwaW9fd3JpdGVsKHBpbywgSUVSLCAxIDw8IChncGlvICYgMHgxZikpOworfQorCitzdGF0aWMgaW50IGdwaW9faXJxX3R5cGUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0eXBlKQoreworCWlmICh0eXBlICE9IElSUV9UWVBFX0VER0VfQk9USCAmJiB0eXBlICE9IElSUV9UWVBFX05PTkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZ3Bpb19pcnFjaGlwID0geworCS5uYW1lCQk9ICJncGlvIiwKKwkubWFzawkJPSBncGlvX2lycV9tYXNrLAorCS51bm1hc2sJCT0gZ3Bpb19pcnFfdW5tYXNrLAorCS5zZXRfdHlwZQk9IGdwaW9faXJxX3R5cGUsCit9OworCitzdGF0aWMgdm9pZCBncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBwaW9fZGV2aWNlCSpwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXVuc2lnbmVkCQlncGlvX2lycTsKKworCWdwaW9faXJxID0gKHVuc2lnbmVkKSBnZXRfaXJxX2RhdGEoaXJxKTsKKwlmb3IgKDs7KSB7CisJCXUzMgkJaXNyOworCQlzdHJ1Y3QgaXJxX2Rlc2MJKmQ7CisKKwkJLyogYWNrIHBlbmRpbmcgR1BJTyBpbnRlcnJ1cHRzICovCisJCWlzciA9IHBpb19yZWFkbChwaW8sIElTUikgJiBwaW9fcmVhZGwocGlvLCBJTVIpOworCQlpZiAoIWlzcikKKwkJCWJyZWFrOworCQlkbyB7CisJCQlpbnQgaTsKKworCQkJaSA9IGZmcyhpc3IpIC0gMTsKKwkJCWlzciAmPSB+KDEgPDwgaSk7CisKKwkJCWkgKz0gZ3Bpb19pcnE7CisJCQlkID0gJmlycV9kZXNjW2ldOworCisJCQlkLT5oYW5kbGVfaXJxKGksIGQpOworCQl9IHdoaWxlIChpc3IpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0CitncGlvX2lycV9zZXR1cChzdHJ1Y3QgcGlvX2RldmljZSAqcGlvLCBpbnQgaXJxLCBpbnQgZ3Bpb19pcnEpCit7CisJdW5zaWduZWQJaTsKKworCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgcGlvKTsKKwlzZXRfaXJxX2RhdGEoaXJxLCAodm9pZCAqKSBncGlvX2lycSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKywgZ3Bpb19pcnErKykgeworCQlzZXRfaXJxX2NoaXBfZGF0YShncGlvX2lycSwgcGlvKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGdwaW9faXJxLCAmZ3Bpb19pcnFjaGlwLAorCQkJCWhhbmRsZV9zaW1wbGVfaXJxKTsKKwl9CisKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsIGdwaW9faXJxX2hhbmRsZXIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogc3RhdGljIGludCBfX2luaXQgcGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHBpb19kZXZpY2UgKnBpbyA9IE5VTEw7CisJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaW50IGdwaW9faXJxX2Jhc2UgPSBHUElPX0lSUV9CQVNFICsgcGRldi0+aWQgKiAzMjsKIAogCUJVR19PTihwZGV2LT5pZCA+PSBNQVhfTlJfUElPX0RFVklDRVMpOwogCXBpbyA9ICZwaW9fZGV2W3BkZXYtPmlkXTsKIAlCVUdfT04oIXBpby0+cmVncyk7CiAKLQkvKiBUT0RPOiBJbnRlcnJ1cHRzICovCisJZ3Bpb19pcnFfc2V0dXAocGlvLCBpcnEsIGdwaW9faXJxX2Jhc2UpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGlvKTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdG1lbCBQb3J0IE11bHRpcGxleGVyIGF0IDB4JXAgKGlycSAlZClcbiIsCi0JICAgICAgIHBpby0+bmFtZSwgcGlvLT5yZWdzLCBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhc2UgMHglcCwgaXJxICVkIGNoYWlucyAlZC4uJWRcbiIsCisJICAgICAgIHBpby0+bmFtZSwgcGlvLT5yZWdzLCBpcnEsIGdwaW9faXJxX2Jhc2UsIGdwaW9faXJxX2Jhc2UgKyAzMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0OCw3ICszNjQsNyBAQAogewogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBpb19kcml2ZXIpOwogfQotc3Vic3lzX2luaXRjYWxsKHBpb19pbml0KTsKK3Bvc3Rjb3JlX2luaXRjYWxsKHBpb19pbml0KTsKIAogdm9pZCBfX2luaXQgYXQzMl9pbml0X3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpAQCAtMTg0LDYgKzQwMCwxMyBAQAogCXBpby0+cGRldiA9IHBkZXY7CiAJcGlvLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVncy0+ZW5kIC0gcmVncy0+c3RhcnQgKyAxKTsKIAotCXBpb193cml0ZWwocGlvLCBPRFIsIH4wVUwpOwotCXBpb193cml0ZWwocGlvLCBQRVIsIH4wVUwpOworCS8qCisJICogcmVxdWVzdF9ncGlvKCkgaXMgb25seSB2YWxpZCBmb3IgcGlucyB0aGF0IGhhdmUgYmVlbgorCSAqIGV4cGxpY2l0bHkgY29uZmlndXJlZCBhcyBHUElPIGFuZCBub3QgcHJldmlvdXNseSByZXF1ZXN0ZWQKKwkgKi8KKwlwaW8tPmdwaW9fbWFzayA9IH4wVUw7CisKKwkvKiBzdGFydCB3aXRoIGlycXMgZGlzYWJsZWQgYW5kIGFja2VkICovCisJcGlvX3dyaXRlbChwaW8sIElEUiwgfjBVTCk7CisJKHZvaWQpIHBpb19yZWFkbChwaW8sIElTUik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21tL2NhY2hlLmMgYi9hcmNoL2F2cjMyL21tL2NhY2hlLmMKaW5kZXggNDUwNTE1Yi4uZmIxM2Y3MiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS9jYWNoZS5jCisrKyBiL2FyY2gvYXZyMzIvbW0vY2FjaGUuYwpAQCAtMjIsMTggKzIyLDM0IEBACiAKIHZvaWQgaW52YWxpZGF0ZV9kY2FjaGVfcmVnaW9uKHZvaWQgKnN0YXJ0LCBzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHYsIGJlZ2luLCBlbmQsIGxpbmVzejsKKwl1bnNpZ25lZCBsb25nIHYsIGJlZ2luLCBlbmQsIGxpbmVzeiwgbWFzazsKKwlpbnQgZmx1c2ggPSAwOwogCiAJbGluZXN6ID0gYm9vdF9jcHVfZGF0YS5kY2FjaGUubGluZXN6OworCW1hc2sgPSBsaW5lc3ogLSAxOwogCi0JLy9wcmludGsoImludmFsaWRhdGUgZGNhY2hlOiAlcCArICV1XG4iLCBzdGFydCwgc2l6ZSk7CisJLyogd2hlbiBmaXJzdCBhbmQvb3IgbGFzdCBjYWNoZWxpbmVzIGFyZSBzaGFyZWQsIGZsdXNoIHRoZW0KKwkgKiBpbnN0ZWFkIG9mIGludmFsaWRhdGluZyAuLi4gbmV2ZXIgZGlzY2FyZCB2YWxpZCBkYXRhIQorCSAqLworCWJlZ2luID0gKHVuc2lnbmVkIGxvbmcpc3RhcnQ7CisJZW5kID0gYmVnaW4gKyBzaXplIC0gMTsKIAotCS8qIFlvdSBhc2tlZCBmb3IgaXQsIHlvdSBnb3QgaXQgKi8KLQliZWdpbiA9ICh1bnNpZ25lZCBsb25nKXN0YXJ0ICYgfihsaW5lc3ogLSAxKTsKLQllbmQgPSAoKHVuc2lnbmVkIGxvbmcpc3RhcnQgKyBzaXplICsgbGluZXN6IC0gMSkgJiB+KGxpbmVzeiAtIDEpOworCWlmIChiZWdpbiAmIG1hc2spIHsKKwkJZmx1c2hfZGNhY2hlX2xpbmUoc3RhcnQpOworCQliZWdpbiArPSBsaW5lc3o7CisJCWZsdXNoID0gMTsKKwl9CisJaWYgKChlbmQgJiBtYXNrKSAhPSBtYXNrKSB7CisJCWZsdXNoX2RjYWNoZV9saW5lKCh2b2lkICopZW5kKTsKKwkJZW5kIC09IGxpbmVzejsKKwkJZmx1c2ggPSAxOworCX0KIAotCWZvciAodiA9IGJlZ2luOyB2IDwgZW5kOyB2ICs9IGxpbmVzeikKKwkvKiByZW1haW5pbmcgY2FjaGVsaW5lcyBvbmx5IG5lZWQgaW52YWxpZGF0aW9uICovCisJZm9yICh2ID0gYmVnaW47IHYgPD0gZW5kOyB2ICs9IGxpbmVzeikKIAkJaW52YWxpZGF0ZV9kY2FjaGVfbGluZSgodm9pZCAqKXYpOworCWlmIChmbHVzaCkKKwkJZmx1c2hfd3JpdGVfYnVmZmVyKCk7CiB9CiAKIHZvaWQgY2xlYW5fZGNhY2hlX3JlZ2lvbih2b2lkICpzdGFydCwgc2l6ZV90IHNpemUpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCmluZGV4IDQ1YTg2ODUuLjBiMjlkNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCkBAIC0xMiw3ICsxMiw3IEBACiAvKiBGU0VDID0gMTBeLTE1IE5TRUMgPSAxMF4tOSAqLwogI2RlZmluZSBGU0VDX1BFUl9OU0VDCTEwMDAwMDAKIAotc3RhdGljIHZvaWQgKmhwZXRfcHRyOworc3RhdGljIHZvaWQgX19pb21lbSAqaHBldF9wdHI7CiAKIHN0YXRpYyBjeWNsZV90IHJlYWRfaHBldCh2b2lkKQogewpAQCAtNDAsOCArNDAsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGNhbGN1bGF0ZSB0aGUgaHBldCBhZGRyZXNzOiAqLwotCWhwZXRfYmFzZSA9Ci0JCSh2b2lkIF9faW9tZW0qKWlvcmVtYXBfbm9jYWNoZShocGV0X2FkZHJlc3MsIEhQRVRfTU1BUF9TSVpFKTsKKwlocGV0X2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoaHBldF9hZGRyZXNzLCBIUEVUX01NQVBfU0laRSk7CiAJaHBldF9wdHIgPSBocGV0X2Jhc2UgKyBIUEVUX0NPVU5URVI7CiAKIAkvKiBjYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeTogKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKaW5kZXggNTU5MmZhNi4uYmE4ZDMwMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTEyNiw3ICsxMjYsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY19tb2RpZnkodW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgaW9fYXBpYyAqaW9fYXBpYyA9IGlvX2FwaWNfYmFzZShhcGljKTsKKwl2b2xhdGlsZSBzdHJ1Y3QgaW9fYXBpYyBfX2lvbWVtICppb19hcGljID0gaW9fYXBpY19iYXNlKGFwaWMpOwogCWlmIChzaXNfYXBpY19idWcpCiAJCXdyaXRlbChyZWcsICZpb19hcGljLT5pbmRleCk7CiAJd3JpdGVsKHZhbHVlLCAmaW9fYXBpYy0+ZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vcGFnZWF0dHIuYyBiL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jCmluZGV4IGFkOTE1MjguLmUyMjNiMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jCisrKyBiL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIAlsaXN0X3JlcGxhY2VfaW5pdCgmZGZfbGlzdCwgJmwpOwogCXNwaW5fdW5sb2NrX2lycSgmY3BhX2xvY2spOwogCWlmICghY3B1X2hhc19jbGZsdXNoKQotCQlmbHVzaF9tYXAoMCk7CisJCWZsdXNoX21hcChOVUxMKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGcsIG5leHQsICZsLCBscnUpIHsKIAkJaWYgKGNwdV9oYXNfY2xmbHVzaCkKIAkJCWZsdXNoX21hcChwYWdlX2FkZHJlc3MocGcpKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvY3Jhc2guYyBiL2FyY2gvaWE2NC9rZXJuZWwvY3Jhc2guYwppbmRleCA5ZDkyMDk3Li4zN2JiMTZmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2NyYXNoLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9jcmFzaC5jCkBAIC01Miw3ICs1Miw3IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGVsZl9wcnN0YXR1cywgZWxmX3Byc3RhdHVzKTsKIAogdm9pZAotY3Jhc2hfc2F2ZV90aGlzX2NwdSgpCitjcmFzaF9zYXZlX3RoaXNfY3B1KHZvaWQpCiB7CiAJdm9pZCAqYnVmOwogCXVuc2lnbmVkIGxvbmcgY2ZtLCBzb2YsIHNvbDsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMgYi9hcmNoL2lhNjQva2VybmVsL3NtcC5jCmluZGV4IGY0YzdmNzcuLjU1ZGRkODAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYwpAQCAtMjIxLDEzICsyMjEsMTMgQEAKIAogI2lmZGVmIENPTkZJR19LRVhFQwogdm9pZAota2R1bXBfc21wX3NlbmRfc3RvcCgpCitrZHVtcF9zbXBfc2VuZF9zdG9wKHZvaWQpCiB7CiAgCXNlbmRfSVBJX2FsbGJ1dHNlbGYoSVBJX0tEVU1QX0NQVV9TVE9QKTsKIH0KIAogdm9pZAota2R1bXBfc21wX3NlbmRfaW5pdCgpCitrZHVtcF9zbXBfc2VuZF9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGNwdSwgc2VsZl9jcHU7CiAJc2VsZl9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCmluZGV4IGI0MzQ2NmIuLjY3ZDYxN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCkBAIC0xNDksNyArMTQ5LDggQEAKIHN0YXRpYyB2b2lkIGludmFsaWRhdGVfdGNlX2NhY2hlKHN0cnVjdCBjYmVfaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nICpwdGUsCiAJCWxvbmcgbl9wdGVzKQogewotCXVuc2lnbmVkIGxvbmcgKnJlZywgdmFsOworCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqcmVnOworCXVuc2lnbmVkIGxvbmcgdmFsOwogCWxvbmcgbjsKIAogCXJlZyA9IGlvbW11LT54bGF0ZV9yZWdzICsgSU9DX0lPUFRfQ2FjaGVJbnZkOwpAQCAtNTkyLDcgKzU5Myw3IEBACiAJLyogSW5pdCBiYXNlIGZpZWxkcyAqLwogCWkgPSBjYmVfbnJfaW9tbXVzKys7CiAJaW9tbXUgPSAmaW9tbXVzW2ldOwotCWlvbW11LT5zdGFiID0gMDsKKwlpb21tdS0+c3RhYiA9IE5VTEw7CiAJaW9tbXUtPm5pZCA9IG5pZDsKIAlzbnByaW50Zihpb21tdS0+bmFtZSwgc2l6ZW9mKGlvbW11LT5uYW1lKSwgImlvbW11JWQiLCBpKTsKIAlJTklUX0xJU1RfSEVBRCgmaW9tbXUtPndpbmRvd3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsZWIvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9wY2kuYwppbmRleCA4NjdmODNhLi45OGRlODM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9wY2kuYwpAQCAtNjUsMTMgKzY1LDEzIEBACiAKIHN0YXRpYyBpbmxpbmUgdTE2IGNlbGxlYl9mYWtlX2NvbmZpZ19yZWFkdyh2b2lkICphZGRyKQogewotCXUxNiAqcCA9IGFkZHI7CisJX19sZTE2ICpwID0gYWRkcjsKIAlyZXR1cm4gbGUxNl90b19jcHUoKnApOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBjZWxsZWJfZmFrZV9jb25maWdfcmVhZGwodm9pZCAqYWRkcikKIHsKLQl1MzIgKnAgPSBhZGRyOworCV9fbGUzMiAqcCA9IGFkZHI7CiAJcmV0dXJuIGxlMzJfdG9fY3B1KCpwKTsKIH0KIApAQCAtODMsMTYgKzgzLDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjZWxsZWJfZmFrZV9jb25maWdfd3JpdGV3KHUzMiB2YWwsIHZvaWQgKmFkZHIpCiB7Ci0JdTE2IHZhbDE2OwotCXUxNiAqcCA9IGFkZHI7CisJX19sZTE2IHZhbDE2OworCV9fbGUxNiAqcCA9IGFkZHI7CiAJdmFsMTYgPSBjcHVfdG9fbGUxNih2YWwpOwogCSpwID0gdmFsMTY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjZWxsZWJfZmFrZV9jb25maWdfd3JpdGVsKHUzMiB2YWwsIHZvaWQgKmFkZHIpCiB7Ci0JdTMyIHZhbDMyOwotCXUzMiAqcCA9IGFkZHI7CisJX19sZTMyIHZhbDMyOworCV9fbGUzMiAqcCA9IGFkZHI7CiAJdmFsMzIgPSBjcHVfdG9fbGUzMih2YWwpOwogCSpwID0gdmFsMzI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9zY2NfZXBjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsZWIvc2NjX2VwY2kuYwppbmRleCAwZWRiYzBjLi5jMTFiMzljIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9zY2NfZXBjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL3NjY19lcGNpLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICNpZiAwIC8qIHRlc3QgY29kZSBmb3IgZXBjaSBkdW1teSByZWFkICovCiBzdGF0aWMgdm9pZCBjZWxsZWJfZXBjaV9kdW1teV9yZWFkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jdm9pZCAqZXBjaV9iYXNlOworCXZvaWQgX19pb21lbSAqZXBjaV9iYXNlOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CiAJdTMyIHZhbDsKQEAgLTU4LDcgKzU4LDcgQEAKIAlpZiAoIWhvc2UpCiAJCXJldHVybjsKIAotCWVwY2lfYmFzZSA9ICh2b2lkICopaG9zZS0+Y2ZnX2FkZHI7CisJZXBjaV9iYXNlID0gaG9zZS0+Y2ZnX2FkZHI7CiAKIAl2YWwgPSBpbl9iZTMyKGVwY2lfYmFzZSArIFNDQ19FUENJX1dBVFJQKTsKIAlpb3N5bmMoKTsKQEAgLTcxLDE4ICs3MSwxOCBAQAogCQkJCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCiB7CiAJdm9pZCBfX2lvbWVtICphZGRyOwotCWFkZHIgPSAodm9pZCAqKWhvc2UtPmNmZ19hZGRyICsgUENJX0NPTU1BTkQ7CisJYWRkciA9IGhvc2UtPmNmZ19hZGRyICsgUENJX0NPTU1BTkQ7CiAJb3V0X2JlMzIoYWRkciwgaW5fYmUzMihhZGRyKSB8IChQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQgPDwgMTYpKTsKIH0KIAogc3RhdGljIGludCBjZWxsZWJfZXBjaV9jaGVja19hYm9ydChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyKQorCQkJCSAgIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAl2b2lkIF9faW9tZW0gKnJlZywgKmVwY2lfYmFzZTsKIAl1MzIgdmFsOwogCiAJaW9iKCk7Ci0JZXBjaV9iYXNlID0gKHZvaWQgKilob3NlLT5jZmdfYWRkcjsKKwllcGNpX2Jhc2UgPSBob3NlLT5jZmdfYWRkcjsKIAogCXJlZyA9IGVwY2lfYmFzZSArIFBDSV9DT01NQU5EOwogCXZhbCA9IGluX2JlMzIocmVnKTsKQEAgLTEwOCwyMyArMTA4LDIzIEBACiAJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2VsbGViX2VwY2lfbWFrZV9jb25maWdfYWRkcihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCitzdGF0aWMgdm9pZCBfX2lvbWVtICpjZWxsZWJfZXBjaV9tYWtlX2NvbmZpZ19hZGRyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUpCiB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOworCXZvaWQgX19pb21lbSAqYWRkcjsKIAlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gaG9zZS0+YnVzOwogCiAJaWYgKGJ1cy0+c2VsZikKLQkJYWRkciA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmNmZ19kYXRhICsKKwkJYWRkciA9IGhvc2UtPmNmZ19kYXRhICsKIAkJICAgICAgICgoKGJ1cy0+bnVtYmVyICYgMHhmZikgPDwgMTYpCiAJCSAgICAgICAgfCAoKGRldmZuICYgMHhmZikgPDwgOCkKIAkJICAgICAgICB8ICh3aGVyZSAmIDB4ZmYpCiAJCSAgICAgICAgfCAweDAxMDAwMDAwKTsKIAllbHNlCi0JCWFkZHIgPSAodW5zaWduZWQgbG9uZylob3NlLT5jZmdfZGF0YSArCisJCWFkZHIgPSBob3NlLT5jZmdfZGF0YSArCiAJCSAgICAgICAoKChkZXZmbiAmIDB4ZmYpIDw8IDgpIHwgKHdoZXJlICYgMHhmZikpOwogCi0JcHJfZGVidWcoIkVQQ0k6IGNvbmZpZ19hZGRyID0gMHglMDE2bHhcbiIsIGFkZHIpOworCXByX2RlYnVnKCJFUENJOiBjb25maWdfYWRkciA9IDB4JXBcbiIsIGFkZHIpOwogCiAJcmV0dXJuIGFkZHI7CiB9CkBAIC0xMzIsNyArMTMyLDcgQEAKIHN0YXRpYyBpbnQgY2VsbGViX2VwY2lfcmVhZF9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywKIAkJCXVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICogdmFsKQogewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIApAQCAtMTQ4LDE3ICsxNDgsMTcgQEAKIAlpZiAoYnVzLT5udW1iZXIgPT0gaG9zZS0+Zmlyc3RfYnVzbm8gJiYgZGV2Zm4gPT0gMCkgewogCQkvKiBFUENJIGNvbnRyb2xsZXIgc2VsZiAqLwogCi0JCWFkZHIgPSAodW5zaWduZWQgbG9uZylob3NlLT5jZmdfYWRkciArIHdoZXJlOworCQlhZGRyID0gaG9zZS0+Y2ZnX2FkZHIgKyB3aGVyZTsKIAogCQlzd2l0Y2ggKHNpemUpIHsKIAkJY2FzZSAxOgotCQkJKnZhbCA9IGluXzgoKHU4ICopYWRkcik7CisJCQkqdmFsID0gaW5fOChhZGRyKTsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQkqdmFsID0gaW5fYmUxNigodTE2ICopYWRkcik7CisJCQkqdmFsID0gaW5fYmUxNihhZGRyKTsKIAkJCWJyZWFrOwogCQljYXNlIDQ6Ci0JCQkqdmFsID0gaW5fYmUzMigodTMyICopYWRkcik7CisJCQkqdmFsID0gaW5fYmUzMihhZGRyKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKQEAgLTE3MSwxMyArMTcxLDEzIEBACiAKIAkJc3dpdGNoIChzaXplKSB7CiAJCWNhc2UgMToKLQkJCSp2YWwgPSBpbl84KCh1OCAqKWFkZHIpOworCQkJKnZhbCA9IGluXzgoYWRkcik7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJKnZhbCA9IGluX2xlMTYoKHUxNiAqKWFkZHIpOworCQkJKnZhbCA9IGluX2xlMTYoYWRkcik7CiAJCQlicmVhazsKIAkJY2FzZSA0OgotCQkJKnZhbCA9IGluX2xlMzIoKHUzMiAqKWFkZHIpOworCQkJKnZhbCA9IGluX2xlMzIoYWRkcik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CkBAIC0xODgsMTMgKzE4OCwxMyBAQAogCQkgImFkZHI9MHglbHgsIGRldmZuPTB4JXgsIHdoZXJlPTB4JXgsIHNpemU9MHgleCwgdmFsPTB4JXhcbiIsCiAJCSBhZGRyLCBkZXZmbiwgd2hlcmUsIHNpemUsICp2YWwpOwogCi0JcmV0dXJuIGNlbGxlYl9lcGNpX2NoZWNrX2Fib3J0KGhvc2UsIDApOworCXJldHVybiBjZWxsZWJfZXBjaV9jaGVja19hYm9ydChob3NlLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBjZWxsZWJfZXBjaV93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywKIAkJCXVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKIHsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CisJdm9pZCBfX2lvbWVtICphZGRyOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CiAKQEAgLTIxMCwxNyArMjEwLDE3IEBACiAJaWYgKGJ1cy0+bnVtYmVyID09IGhvc2UtPmZpcnN0X2J1c25vICYmIGRldmZuID09IDApIHsKIAkJLyogRVBDSSBjb250cm9sbGVyIHNlbGYgKi8KIAotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+Y2ZnX2FkZHIgKyB3aGVyZTsKKwkJYWRkciA9IGhvc2UtPmNmZ19hZGRyICsgd2hlcmU7CiAKIAkJc3dpdGNoIChzaXplKSB7CiAJCWNhc2UgMToKLQkJCW91dF84KCh1OCAqKWFkZHIsIHZhbCk7CisJCQlvdXRfOChhZGRyLCB2YWwpOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKLQkJCW91dF9iZTE2KCh1MTYgKilhZGRyLCB2YWwpOworCQkJb3V0X2JlMTYoYWRkciwgdmFsKTsKIAkJCWJyZWFrOwogCQljYXNlIDQ6Ci0JCQlvdXRfYmUzMigodTMyICopYWRkciwgdmFsKTsKKwkJCW91dF9iZTMyKGFkZHIsIHZhbCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CkBAIC0yMzMsMTMgKzIzMywxMyBAQAogCiAJCXN3aXRjaCAoc2l6ZSkgewogCQljYXNlIDE6Ci0JCQlvdXRfOCgodTggKilhZGRyLCB2YWwpOworCQkJb3V0XzgoYWRkciwgdmFsKTsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQlvdXRfbGUxNigodTE2ICopYWRkciwgdmFsKTsKKwkJCW91dF9sZTE2KGFkZHIsIHZhbCk7CiAJCQlicmVhazsKIAkJY2FzZSA0OgotCQkJb3V0X2xlMzIoKHUzMiAqKWFkZHIsIHZhbCk7CisJCQlvdXRfbGUzMihhZGRyLCB2YWwpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJdm9pZCBfX2lvbWVtICpyZWcsICplcGNpX2Jhc2U7CiAJaW50IGh3cmVzID0gMDsKIAotCWVwY2lfYmFzZSA9ICh2b2lkICopaG9zZS0+Y2ZnX2FkZHI7CisJZXBjaV9iYXNlID0gaG9zZS0+Y2ZnX2FkZHI7CiAKIAkvKiBQQ0kgY29yZSByZXNldChJbnRlcm5hbCBidXMgYW5kIFBDSSBjbG9jaykgKi8KIAlyZWcgPSBlcGNpX2Jhc2UgKyBTQ0NfRVBDSV9DS0NUUkw7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCmluZGV4IGUxZjUxZDQuLjExN2M5YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jCkBAIC03NSw3ICs3NSw3IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnk7CiAKIC8qIFRvIGJlIHJlcGxhY2VkIGJ5IFJUQVMgd2hlbiBhdmFpbGFibGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgKmJyaXFfU1BPUjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pb21lbSAqYnJpcV9TUE9SOwogCiAjaWZkZWYgQ09ORklHX1NNUAogZXh0ZXJuIHN0cnVjdCBzbXBfb3BzX3QgY2hycF9zbXBfb3BzOwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJfSBlbHNlIGlmIChtYWNoaW5lICYmIHN0cm5jbXAobWFjaGluZSwgIlRvdGFsSW1wYWN0LEJSSVEtMSIsIDE4KSA9PSAwKSB7CiAJCV9jaHJwX3R5cGUgPSBfQ0hSUF9icmlxOwogCQkvKiBNYXAgdGhlIFNQT1IgcmVnaXN0ZXIgb24gYnJpcSBhbmQgY2hhbmdlIHRoZSByZXN0YXJ0IGhvb2sgKi8KLQkJYnJpcV9TUE9SID0gKHVuc2lnbmVkIGludCAqKWlvcmVtYXAoMHhmZjAwMDBlOCwgNCk7CisJCWJyaXFfU1BPUiA9IGlvcmVtYXAoMHhmZjAwMDBlOCwgNCk7CiAJCXBwY19tZC5yZXN0YXJ0ID0gYnJpcV9yZXN0YXJ0OwogCX0gZWxzZSB7CiAJCS8qIExldCdzIGFzc3VtZSBpdCBpcyBhbiBJQk0gY2hycCBpZiBhbGwgZWxzZSBmYWlscyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwppbmRleCBiYjE3MjgzLi42MzFjMzAwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwpAQCAtMTk0LDYgKzE5NCw3IEBACiAKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX2FsbG9jX2lvX2lycSk7CiAKIGludCBwczNfZnJlZV9pb19pcnEodW5zaWduZWQgaW50IHZpcnEpCiB7CkBAIC0yMDksNiArMjEwLDcgQEAKIAogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfZnJlZV9pb19pcnEpOwogCiAvKioKICAqIHBzM19hbGxvY19ldmVudF9pcnEgLSBBbGxvY2F0ZSBhIHZpcnEgZm9yIHVzZSB3aXRoIGEgc3lzdGVtIGV2ZW50LgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCmluZGV4IGJjZTYxMzYuLmE5ZjdlNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKQEAgLTU3LDYgKzU3LDcgQEAKIAlkdW1wX21taW9fcmVnaW9uKHIpOwogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfbW1pb19yZWdpb25fY3JlYXRlKTsKIAogaW50IHBzM19mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCiB7CkBAIC03Miw2ICs3Myw3IEBACiAJci0+bHBhcl9hZGRyID0gMDsKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX2ZyZWVfbW1pb19yZWdpb24pOwogCiBzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKl9kZXYsCiAJc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9zcHUtZGlzLmMgYi9hcmNoL3Bvd2VycGMveG1vbi9zcHUtZGlzLmMKaW5kZXggZWU5MjljNi4uZTVmODk4MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24vc3B1LWRpcy5jCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3NwdS1kaXMuYwpAQCAtODUsNyArODUsNyBAQAogICBpZiAoKGluZGV4ID0gc3B1X2Rpc2Fzc2VtYmxlX3RhYmxlW29wY29kZSAmIDB4N2ZmXSkgIT0gMCkKICAgICByZXR1cm4gaW5kZXg7CiAKLSAgcmV0dXJuIDA7CisgIHJldHVybiBOVUxMOwogfQogCiAvKiBQcmludCBhIFNwdSBpbnN0cnVjdGlvbi4gICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvZGVmY29uZmlnIGIvYXJjaC9zMzkwL2RlZmNvbmZpZwppbmRleCA3YzYyMWI4Li4xNDA2NDAwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9kZWZjb25maWcKQEAgLTE3OSw2ICsxNzksOCBAQAogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX0tFWT15CitDT05GSUdfSVVDVj1tCitDT05GSUdfQUZJVUNWPW0KIENPTkZJR19JTkVUPXkKIENPTkZJR19JUF9NVUxUSUNBU1Q9eQogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKQEAgLTUwOCw3ICs1MTAsNiBAQAogIwogQ09ORklHX0xDUz1tCiBDT05GSUdfQ1RDPW0KLUNPTkZJR19JVUNWPW0KICMgQ09ORklHX05FVElVQ1YgaXMgbm90IHNldAogIyBDT05GSUdfU01TR0lVQ1YgaXMgbm90IHNldAogIyBDT05GSUdfQ0xBVyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9jcnlwdG8vS2NvbmZpZyBiL2NyeXB0by9LY29uZmlnCmluZGV4IDkxOGI0ZDguLjA4NmZjZWMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9LY29uZmlnCisrKyBiL2NyeXB0by9LY29uZmlnCkBAIC0xNDksNiArMTQ5LDE1IEBACiAJICBDQkM6IENpcGhlciBCbG9jayBDaGFpbmluZyBtb2RlCiAJICBUaGlzIGJsb2NrIGNpcGhlciBhbGdvcml0aG0gaXMgcmVxdWlyZWQgZm9yIElQU2VjLgogCitjb25maWcgQ1JZUFRPX1BDQkMKKwl0cmlzdGF0ZSAiUENCQyBzdXBwb3J0IgorCXNlbGVjdCBDUllQVE9fQkxLQ0lQSEVSCisJc2VsZWN0IENSWVBUT19NQU5BR0VSCisJZGVmYXVsdCBtCisJaGVscAorCSAgUENCQzogUHJvcGFnYXRpbmcgQ2lwaGVyIEJsb2NrIENoYWluaW5nIG1vZGUKKwkgIFRoaXMgYmxvY2sgY2lwaGVyIGFsZ29yaXRobSBpcyByZXF1aXJlZCBmb3IgUnhSUEMuCisKIGNvbmZpZyBDUllQVE9fTFJXCiAJdHJpc3RhdGUgIkxSVyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCkBAIC0xNjgsNiArMTc3LDEzIEBACiAJaGVscAogCSAgREVTIGNpcGhlciBhbGdvcml0aG0gKEZJUFMgNDYtMiksIGFuZCBUcmlwbGUgREVTIEVERSAoRklQUyA0Ni0zKS4KIAorY29uZmlnIENSWVBUT19GQ1JZUFQKKwl0cmlzdGF0ZSAiRkNyeXB0IGNpcGhlciBhbGdvcml0aG0iCisJc2VsZWN0IENSWVBUT19BTEdBUEkKKwlzZWxlY3QgQ1JZUFRPX0JMS0NJUEhFUgorCWhlbHAKKwkgIEZDcnlwdCBhbGdvcml0aG0gdXNlZCBieSBSeFJQQy4KKwogY29uZmlnIENSWVBUT19CTE9XRklTSAogCXRyaXN0YXRlICJCbG93ZmlzaCBjaXBoZXIgYWxnb3JpdGhtIgogCXNlbGVjdCBDUllQVE9fQUxHQVBJCkBAIC00MDksNiArNDI1LDIxIEBACiAJICBTZWUgQ2FzdGFnbm9saTkzLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGxpYi9saWJjcmMzMmMuCiAgICAgICAgICAgTW9kdWxlIHdpbGwgYmUgY3JjMzJjLgogCitjb25maWcgQ1JZUFRPX0NBTUVMTElBCisJdHJpc3RhdGUgIkNhbWVsbGlhIGNpcGhlciBhbGdvcml0aG1zIgorCWRlcGVuZHMgb24gQ1JZUFRPCisJc2VsZWN0IENSWVBUT19BTEdBUEkKKwloZWxwCisJICBDYW1lbGxpYSBjaXBoZXIgYWxnb3JpdGhtcyBtb2R1bGUuCisKKwkgIENhbWVsbGlhIGlzIGEgc3ltbWV0cmljIGtleSBibG9jayBjaXBoZXIgZGV2ZWxvcGVkIGpvaW50bHkKKwkgIGF0IE5UVCBhbmQgTWl0c3ViaXNoaSBFbGVjdHJpYyBDb3Jwb3JhdGlvbi4KKworCSAgVGhlIENhbWVsbGlhIHNwZWNpZmllcyB0aHJlZSBrZXkgc2l6ZXM6IDEyOCwgMTkyIGFuZCAyNTYgYml0cy4KKworCSAgU2VlIGFsc286CisJICA8aHR0cHM6Ly9pbmZvLmlzbC5udHQuY28uanAvY3J5cHQvZW5nL2NhbWVsbGlhL2luZGV4X3MuaHRtbD4KKwogY29uZmlnIENSWVBUT19URVNUCiAJdHJpc3RhdGUgIlRlc3RpbmcgbW9kdWxlIgogCWRlcGVuZHMgb24gbQpkaWZmIC0tZ2l0IGEvY3J5cHRvL01ha2VmaWxlIGIvY3J5cHRvL01ha2VmaWxlCmluZGV4IDYwZTNkMjQuLjEyZjkzZjUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9NYWtlZmlsZQorKysgYi9jcnlwdG8vTWFrZWZpbGUKQEAgLTI3LDEzICsyNywxNiBAQAogb2JqLSQoQ09ORklHX0NSWVBUT19HRjEyOE1VTCkgKz0gZ2YxMjhtdWwubwogb2JqLSQoQ09ORklHX0NSWVBUT19FQ0IpICs9IGVjYi5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0NCQykgKz0gY2JjLm8KK29iai0kKENPTkZJR19DUllQVE9fUENCQykgKz0gcGNiYy5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0xSVykgKz0gbHJ3Lm8KIG9iai0kKENPTkZJR19DUllQVE9fREVTKSArPSBkZXMubworb2JqLSQoQ09ORklHX0NSWVBUT19GQ1JZUFQpICs9IGZjcnlwdC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0JMT1dGSVNIKSArPSBibG93ZmlzaC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1RXT0ZJU0gpICs9IHR3b2Zpc2gubwogb2JqLSQoQ09ORklHX0NSWVBUT19UV09GSVNIX0NPTU1PTikgKz0gdHdvZmlzaF9jb21tb24ubwogb2JqLSQoQ09ORklHX0NSWVBUT19TRVJQRU5UKSArPSBzZXJwZW50Lm8KIG9iai0kKENPTkZJR19DUllQVE9fQUVTKSArPSBhZXMubworb2JqLSQoQ09ORklHX0NSWVBUT19DQU1FTExJQSkgKz0gY2FtZWxsaWEubwogb2JqLSQoQ09ORklHX0NSWVBUT19DQVNUNSkgKz0gY2FzdDUubwogb2JqLSQoQ09ORklHX0NSWVBUT19DQVNUNikgKz0gY2FzdDYubwogb2JqLSQoQ09ORklHX0NSWVBUT19BUkM0KSArPSBhcmM0Lm8KZGlmZiAtLWdpdCBhL2NyeXB0by9hbGdhcGkuYyBiL2NyeXB0by9hbGdhcGkuYwppbmRleCBjOTE1MzAwLi5mN2QyMTg1IDEwMDY0NAotLS0gYS9jcnlwdG8vYWxnYXBpLmMKKysrIGIvY3J5cHRvL2FsZ2FwaS5jCkBAIC0zNzcsNyArMzc3LDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19kcm9wX3NwYXduKTsKIAotc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19zcGF3bl90Zm0oc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24pCitzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX3NwYXduX3RmbShzdHJ1Y3QgY3J5cHRvX3NwYXduICpzcGF3biwgdTMyIHR5cGUsCisJCQkJICAgIHUzMiBtYXNrKQogewogCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CiAJc3RydWN0IGNyeXB0b19hbGcgKmFsZzI7CkBAIC0zOTYsMTAgKzM5NywxOCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKIAl9CiAKLQl0Zm0gPSBfX2NyeXB0b19hbGxvY190Zm0oYWxnLCAwKTsKLQlpZiAoSVNfRVJSKHRmbSkpCi0JCWNyeXB0b19tb2RfcHV0KGFsZyk7CisJdGZtID0gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAodW5saWtlbHkoKGFsZy0+Y3JhX2ZsYWdzIF4gdHlwZSkgJiBtYXNrKSkKKwkJZ290byBvdXRfcHV0X2FsZzsKIAorCXRmbSA9IF9fY3J5cHRvX2FsbG9jX3RmbShhbGcsIHR5cGUsIG1hc2spOworCWlmIChJU19FUlIodGZtKSkKKwkJZ290byBvdXRfcHV0X2FsZzsKKworCXJldHVybiB0Zm07CisKK291dF9wdXRfYWxnOgorCWNyeXB0b19tb2RfcHV0KGFsZyk7CiAJcmV0dXJuIHRmbTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19zcGF3bl90Zm0pOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FwaS5jIGIvY3J5cHRvL2FwaS5jCmluZGV4IDhjNDQ2ODcuLjU1YWY4YmIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hcGkuYworKysgYi9jcnlwdG8vYXBpLmMKQEAgLTIxMiwzMSArMjEyLDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fYWxnX21vZF9sb29rdXApOwogCi1zdGF0aWMgaW50IGNyeXB0b19pbml0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKK3N0YXRpYyBpbnQgY3J5cHRvX2luaXRfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiB0eXBlLCB1MzIgbWFzaykKIHsKLQl0Zm0tPmNydF9mbGFncyA9IGZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfTUFTSzsKLQlmbGFncyAmPSB+Q1JZUFRPX1RGTV9SRVFfTUFTSzsKLQkKLQlzd2l0Y2ggKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSkgewotCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKLQkJcmV0dXJuIGNyeXB0b19pbml0X2NpcGhlcl9mbGFncyh0Zm0sIGZsYWdzKTsKLQkJCi0JY2FzZSBDUllQVE9fQUxHX1RZUEVfRElHRVNUOgotCQlyZXR1cm4gY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHRmbSwgZmxhZ3MpOwotCQkKLQljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKLQkJcmV0dXJuIGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHRmbSwgZmxhZ3MpOwotCX0KLQkKLQlyZXR1cm4gMDsKLX0KKwljb25zdCBzdHJ1Y3QgY3J5cHRvX3R5cGUgKnR5cGVfb2JqID0gdGZtLT5fX2NydF9hbGctPmNyYV90eXBlOwogCi1zdGF0aWMgaW50IGNyeXB0b19pbml0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCWNvbnN0IHN0cnVjdCBjcnlwdG9fdHlwZSAqdHlwZSA9IHRmbS0+X19jcnRfYWxnLT5jcmFfdHlwZTsKLQotCWlmICh0eXBlKQotCQlyZXR1cm4gdHlwZS0+aW5pdCh0Zm0pOworCWlmICh0eXBlX29iaikKKwkJcmV0dXJuIHR5cGVfb2JqLT5pbml0KHRmbSwgdHlwZSwgbWFzayk7CiAKIAlzd2l0Y2ggKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSkgewogCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKQEAgLTI4NSwyOSArMjY2LDI5IEBACiAJfQogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0b19jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsIGludCBmbGFncykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRvX2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZywgdTMyIHR5cGUsIHUzMiBtYXNrKQogewotCWNvbnN0IHN0cnVjdCBjcnlwdG9fdHlwZSAqdHlwZSA9IGFsZy0+Y3JhX3R5cGU7CisJY29uc3Qgc3RydWN0IGNyeXB0b190eXBlICp0eXBlX29iaiA9IGFsZy0+Y3JhX3R5cGU7CiAJdW5zaWduZWQgaW50IGxlbjsKIAogCWxlbiA9IGFsZy0+Y3JhX2FsaWdubWFzayAmIH4oY3J5cHRvX3RmbV9jdHhfYWxpZ25tZW50KCkgLSAxKTsKLQlpZiAodHlwZSkKLQkJcmV0dXJuIGxlbiArIHR5cGUtPmN0eHNpemUoYWxnKTsKKwlpZiAodHlwZV9vYmopCisJCXJldHVybiBsZW4gKyB0eXBlX29iai0+Y3R4c2l6ZShhbGcsIHR5cGUsIG1hc2spOwogCiAJc3dpdGNoIChhbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLKSB7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAKIAljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6Ci0JCWxlbiArPSBjcnlwdG9fY2lwaGVyX2N0eHNpemUoYWxnLCBmbGFncyk7CisJCWxlbiArPSBjcnlwdG9fY2lwaGVyX2N0eHNpemUoYWxnKTsKIAkJYnJlYWs7CiAJCQogCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVDoKLQkJbGVuICs9IGNyeXB0b19kaWdlc3RfY3R4c2l6ZShhbGcsIGZsYWdzKTsKKwkJbGVuICs9IGNyeXB0b19kaWdlc3RfY3R4c2l6ZShhbGcpOwogCQlicmVhazsKIAkJCiAJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1M6Ci0JCWxlbiArPSBjcnlwdG9fY29tcHJlc3NfY3R4c2l6ZShhbGcsIGZsYWdzKTsKKwkJbGVuICs9IGNyeXB0b19jb21wcmVzc19jdHhzaXplKGFsZyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzIyLDI0ICszMDMsMjEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19zaG9vdF9hbGcpOwogCi1zdHJ1Y3QgY3J5cHRvX3RmbSAqX19jcnlwdG9fYWxsb2NfdGZtKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsIHUzMiBmbGFncykKK3N0cnVjdCBjcnlwdG9fdGZtICpfX2NyeXB0b19hbGxvY190Zm0oc3RydWN0IGNyeXB0b19hbGcgKmFsZywgdTMyIHR5cGUsCisJCQkJICAgICAgdTMyIG1hc2spCiB7CiAJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHRmbV9zaXplOwogCWludCBlcnIgPSAtRU5PTUVNOwogCi0JdGZtX3NpemUgPSBzaXplb2YoKnRmbSkgKyBjcnlwdG9fY3R4c2l6ZShhbGcsIGZsYWdzKTsKKwl0Zm1fc2l6ZSA9IHNpemVvZigqdGZtKSArIGNyeXB0b19jdHhzaXplKGFsZywgdHlwZSwgbWFzayk7CiAJdGZtID0ga3phbGxvYyh0Zm1fc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRmbSA9PSBOVUxMKQogCQlnb3RvIG91dF9lcnI7CiAKIAl0Zm0tPl9fY3J0X2FsZyA9IGFsZzsKIAotCWVyciA9IGNyeXB0b19pbml0X2ZsYWdzKHRmbSwgZmxhZ3MpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2ZyZWVfdGZtOwotCQkKLQllcnIgPSBjcnlwdG9faW5pdF9vcHModGZtKTsKKwllcnIgPSBjcnlwdG9faW5pdF9vcHModGZtLCB0eXBlLCBtYXNrKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlX3RmbTsKIApAQCAtMzYyLDMxICszNDAsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19jcnlwdG9fYWxsb2NfdGZtKTsKIAotc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19hbGxvY190Zm0oY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQotewotCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBOVUxMOwotCWludCBlcnI7Ci0KLQlkbyB7Ci0JCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7Ci0KLQkJYWxnID0gY3J5cHRvX2FsZ19tb2RfbG9va3VwKG5hbWUsIDAsIENSWVBUT19BTEdfQVNZTkMpOwotCQllcnIgPSBQVFJfRVJSKGFsZyk7Ci0JCWlmIChJU19FUlIoYWxnKSkKLQkJCWNvbnRpbnVlOwotCi0JCXRmbSA9IF9fY3J5cHRvX2FsbG9jX3RmbShhbGcsIGZsYWdzKTsKLQkJZXJyID0gMDsKLQkJaWYgKElTX0VSUih0Zm0pKSB7Ci0JCQljcnlwdG9fbW9kX3B1dChhbGcpOwotCQkJZXJyID0gUFRSX0VSUih0Zm0pOwotCQkJdGZtID0gTlVMTDsKLQkJfQotCX0gd2hpbGUgKGVyciA9PSAtRUFHQUlOICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7Ci0KLQlyZXR1cm4gdGZtOwotfQotCiAvKgogICoJY3J5cHRvX2FsbG9jX2Jhc2UgLSBMb2NhdGUgYWxnb3JpdGhtIGFuZCBhbGxvY2F0ZSB0cmFuc2Zvcm0KICAqCUBhbGdfbmFtZTogTmFtZSBvZiBhbGdvcml0aG0KQEAgLTQyMCw3ICszNzMsNyBAQAogCQkJZ290byBlcnI7CiAJCX0KIAotCQl0Zm0gPSBfX2NyeXB0b19hbGxvY190Zm0oYWxnLCAwKTsKKwkJdGZtID0gX19jcnlwdG9fYWxsb2NfdGZtKGFsZywgdHlwZSwgbWFzayk7CiAJCWlmICghSVNfRVJSKHRmbSkpCiAJCQlyZXR1cm4gdGZtOwogCkBAIC00NjYsNyArNDE5LDYgQEAKIAlrZnJlZSh0Zm0pOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fYWxsb2NfdGZtKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19mcmVlX3RmbSk7CiAKIGludCBjcnlwdG9faGFzX2FsZyhjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCmRpZmYgLS1naXQgYS9jcnlwdG8vYmxrY2lwaGVyLmMgYi9jcnlwdG8vYmxrY2lwaGVyLmMKaW5kZXggNmU5MzAwNGYuLmI1YmVmZTggMTAwNjQ0Ci0tLSBhL2NyeXB0by9ibGtjaXBoZXIuYworKysgYi9jcnlwdG8vYmxrY2lwaGVyLmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CkBAIC0zMTMsNiArMzE0LDkgQEAKIAlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtID0gZGVzYy0+dGZtOwogCXVuc2lnbmVkIGludCBhbGlnbm1hc2sgPSBjcnlwdG9fYmxrY2lwaGVyX2FsaWdubWFzayh0Zm0pOwogCisJaWYgKFdBUk5fT05fT05DRShpbl9pcnEoKSkpCisJCXJldHVybiAtRURFQURMSzsKKwogCXdhbGstPm5ieXRlcyA9IHdhbGstPnRvdGFsOwogCWlmICh1bmxpa2VseSghd2Fsay0+dG90YWwpKQogCQlyZXR1cm4gMDsKQEAgLTM0NSw3ICszNDksOCBAQAogCXJldHVybiBjaXBoZXItPnNldGtleSh0Zm0sIGtleSwga2V5bGVuKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdG9fYmxrY2lwaGVyX2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRvX2Jsa2NpcGhlcl9jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsIHUzMiB0eXBlLAorCQkJCQkgICAgIHUzMiBtYXNrKQogewogCXN0cnVjdCBibGtjaXBoZXJfYWxnICpjaXBoZXIgPSAmYWxnLT5jcmFfYmxrY2lwaGVyOwogCXVuc2lnbmVkIGludCBsZW4gPSBhbGctPmNyYV9jdHhzaXplOwpAQCAtMzU4LDcgKzM2Myw3IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBjcnlwdG9faW5pdF9ibGtjaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCitzdGF0aWMgaW50IGNyeXB0b19pbml0X2Jsa2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIHR5cGUsIHUzMiBtYXNrKQogewogCXN0cnVjdCBibGtjaXBoZXJfdGZtICpjcnQgPSAmdGZtLT5jcnRfYmxrY2lwaGVyOwogCXN0cnVjdCBibGtjaXBoZXJfYWxnICphbGcgPSAmdGZtLT5fX2NydF9hbGctPmNyYV9ibGtjaXBoZXI7CmRpZmYgLS1naXQgYS9jcnlwdG8vY2FtZWxsaWEuYyBiL2NyeXB0by9jYW1lbGxpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NzdlY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vY2FtZWxsaWEuYwpAQCAtMCwwICsxLDE4MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYKKyAqIE5UVCAoTmlwcG9uIFRlbGVncmFwaCBhbmQgVGVsZXBob25lIENvcnBvcmF0aW9uKS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKgorICogQWxnb3JpdGhtIFNwZWNpZmljYXRpb24KKyAqICBodHRwOi8vaW5mby5pc2wubnR0LmNvLmpwL2NyeXB0L2VuZy9jYW1lbGxpYS9zcGVjaWZpY2F0aW9ucy5odG1sCisgKi8KKworLyoKKyAqCisgKiBOT1RFIC0tLSBOT1RFIC0tLSBOT1RFIC0tLSBOT1RFCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCBhbGwgbWVtb3J5IGFkZHJlc3NlcyBwYXNzZWQKKyAqIGFzIHBhcmFtZXRlcnMgYXJlIGZvdXItYnl0ZSBhbGlnbmVkLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKworI2RlZmluZSBDQU1FTExJQV9NSU5fS0VZX1NJWkUgICAgICAgIDE2CisjZGVmaW5lIENBTUVMTElBX01BWF9LRVlfU0laRSAgICAgICAgMzIKKyNkZWZpbmUgQ0FNRUxMSUFfQkxPQ0tfU0laRSAxNgorI2RlZmluZSBDQU1FTExJQV9UQUJMRV9CWVRFX0xFTiAyNzIKKyNkZWZpbmUgQ0FNRUxMSUFfVEFCTEVfV09SRF9MRU4gKENBTUVMTElBX1RBQkxFX0JZVEVfTEVOIC8gNCkKKwordHlwZWRlZiB1MzIgS0VZX1RBQkxFX1RZUEVbQ0FNRUxMSUFfVEFCTEVfV09SRF9MRU5dOworCisKKy8qIGtleSBjb25zdGFudHMgKi8KKworI2RlZmluZSBDQU1FTExJQV9TSUdNQTFMICgweEEwOUU2NjdGTCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUExUiAoMHgzQkNDOTA4QkwpCisjZGVmaW5lIENBTUVMTElBX1NJR01BMkwgKDB4QjY3QUU4NThMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTJSICgweDRDQUE3M0IyTCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUEzTCAoMHhDNkVGMzcyRkwpCisjZGVmaW5lIENBTUVMTElBX1NJR01BM1IgKDB4RTk0RjgyQkVMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTRMICgweDU0RkY1M0E1TCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUE0UiAoMHhGMUQzNkYxQ0wpCisjZGVmaW5lIENBTUVMTElBX1NJR01BNUwgKDB4MTBFNTI3RkFMKQorI2RlZmluZSBDQU1FTExJQV9TSUdNQTVSICgweERFNjgyRDFETCkKKyNkZWZpbmUgQ0FNRUxMSUFfU0lHTUE2TCAoMHhCMDU2ODhDMkwpCisjZGVmaW5lIENBTUVMTElBX1NJR01BNlIgKDB4QjNFNkMxRkRMKQorCitzdHJ1Y3QgY2FtZWxsaWFfY3R4IHsKKwlpbnQga2V5X2xlbmd0aDsKKwlLRVlfVEFCTEVfVFlQRSBrZXlfdGFibGU7Cit9OworCisKKy8qCisgKiAgbWFjcm9zCisgKi8KKworCisjIGRlZmluZSBHRVRVMzIocHQpICgoKHUzMikocHQpWzBdIDw8IDI0KQlcCisJCSAgICAgXiAoKHUzMikocHQpWzFdIDw8IDE2KQlcCisJCSAgICAgXiAoKHUzMikocHQpWzJdIDw8ICA4KQlcCisJCSAgICAgXiAoKHUzMikocHQpWzNdKSkKKworI2RlZmluZSBDT1BZNFdPUkQoZHN0LCBzcmMpCQkJXAorICAgIGRvIHsJCQkJCVwKKwkoZHN0KVswXT0oc3JjKVswXTsJCQlcCisJKGRzdClbMV09KHNyYylbMV07CQkJXAorCShkc3QpWzJdPShzcmMpWzJdOwkJCVwKKwkoZHN0KVszXT0oc3JjKVszXTsJCQlcCisgICAgfXdoaWxlKDApCisKKyNkZWZpbmUgU1dBUDRXT1JEKHdvcmQpCQkJCVwKKyAgICBkbyB7CQkJCQlcCisJQ0FNRUxMSUFfU1dBUDQoKHdvcmQpWzBdKTsJCVwKKwlDQU1FTExJQV9TV0FQNCgod29yZClbMV0pOwkJXAorCUNBTUVMTElBX1NXQVA0KCh3b3JkKVsyXSk7CQlcCisJQ0FNRUxMSUFfU1dBUDQoKHdvcmQpWzNdKTsJCVwKKyAgICB9d2hpbGUoMCkKKworI2RlZmluZSBYT1I0V09SRChhLCBiKS8qIGEgPSBhIF4gYiAqLwkJXAorICAgIGRvIHsJCQkJCVwKKwkoYSlbMF1ePShiKVswXTsJCQkJXAorCShhKVsxXV49KGIpWzFdOwkJCQlcCisJKGEpWzJdXj0oYilbMl07CQkJCVwKKwkoYSlbM11ePShiKVszXTsJCQkJXAorICAgIH13aGlsZSgwKQorCisjZGVmaW5lIFhPUjRXT1JEMihhLCBiLCBjKS8qIGEgPSBiIF4gYyAqLwlcCisgICAgZG8gewkJCQkJXAorCShhKVswXT0oYilbMF1eKGMpWzBdOwkJCVwKKwkoYSlbMV09KGIpWzFdXihjKVsxXTsJCQlcCisJKGEpWzJdPShiKVsyXV4oYylbMl07CQkJXAorCShhKVszXT0oYilbM11eKGMpWzNdOwkJCVwKKyAgICB9d2hpbGUoMCkKKworI2RlZmluZSBDQU1FTExJQV9TVUJLRVlfTChJTkRFWCkgKHN1YmtleVsoSU5ERVgpKjJdKQorI2RlZmluZSBDQU1FTExJQV9TVUJLRVlfUihJTkRFWCkgKHN1YmtleVsoSU5ERVgpKjIgKyAxXSkKKworLyogcm90YXRpb24gcmlnaHQgc2hpZnQgMWJ5dGUgKi8KKyNkZWZpbmUgQ0FNRUxMSUFfUlI4KHgpICgoKHgpID4+IDgpICsgKCh4KSA8PCAyNCkpCisvKiByb3RhdGlvbiBsZWZ0IHNoaWZ0IDFiaXQgKi8KKyNkZWZpbmUgQ0FNRUxMSUFfUkwxKHgpICgoKHgpIDw8IDEpICsgKCh4KSA+PiAzMSkpCisvKiByb3RhdGlvbiBsZWZ0IHNoaWZ0IDFieXRlICovCisjZGVmaW5lIENBTUVMTElBX1JMOCh4KSAoKCh4KSA8PCA4KSArICgoeCkgPj4gMjQpKQorCisjZGVmaW5lIENBTUVMTElBX1JPTERRKGxsLCBsciwgcmwsIHJyLCB3MCwgdzEsIGJpdHMpCVwKKyAgICBkbyB7CQkJCQkJXAorCXcwID0gbGw7CQkJCQlcCisJbGwgPSAobGwgPDwgYml0cykgKyAobHIgPj4gKDMyIC0gYml0cykpOwlcCisJbHIgPSAobHIgPDwgYml0cykgKyAocmwgPj4gKDMyIC0gYml0cykpOwlcCisJcmwgPSAocmwgPDwgYml0cykgKyAocnIgPj4gKDMyIC0gYml0cykpOwlcCisJcnIgPSAocnIgPDwgYml0cykgKyAodzAgPj4gKDMyIC0gYml0cykpOwlcCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIENBTUVMTElBX1JPTERRbzMyKGxsLCBsciwgcmwsIHJyLCB3MCwgdzEsIGJpdHMpCVwKKyAgICBkbyB7CQkJCQkJXAorCXcwID0gbGw7CQkJCQlcCisJdzEgPSBscjsJCQkJCVwKKwlsbCA9IChsciA8PCAoYml0cyAtIDMyKSkgKyAocmwgPj4gKDY0IC0gYml0cykpOwlcCisJbHIgPSAocmwgPDwgKGJpdHMgLSAzMikpICsgKHJyID4+ICg2NCAtIGJpdHMpKTsJXAorCXJsID0gKHJyIDw8IChiaXRzIC0gMzIpKSArICh3MCA+PiAoNjQgLSBiaXRzKSk7CVwKKwlyciA9ICh3MCA8PCAoYml0cyAtIDMyKSkgKyAodzEgPj4gKDY0IC0gYml0cykpOwlcCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIENBTUVMTElBX1NQMTExMChJTkRFWCkgKGNhbWVsbGlhX3NwMTExMFsoSU5ERVgpXSkKKyNkZWZpbmUgQ0FNRUxMSUFfU1AwMjIyKElOREVYKSAoY2FtZWxsaWFfc3AwMjIyWyhJTkRFWCldKQorI2RlZmluZSBDQU1FTExJQV9TUDMwMzMoSU5ERVgpIChjYW1lbGxpYV9zcDMwMzNbKElOREVYKV0pCisjZGVmaW5lIENBTUVMTElBX1NQNDQwNChJTkRFWCkgKGNhbWVsbGlhX3NwNDQwNFsoSU5ERVgpXSkKKworI2RlZmluZSBDQU1FTExJQV9GKHhsLCB4ciwga2wsIGtyLCB5bCwgeXIsIGlsLCBpciwgdDAsIHQxKQlcCisgICAgZG8gewkJCQkJCQlcCisJaWwgPSB4bCBeIGtsOwkJCQkJCVwKKwlpciA9IHhyIF4ga3I7CQkJCQkJXAorCXQwID0gaWwgPj4gMTY7CQkJCQkJXAorCXQxID0gaXIgPj4gMTY7CQkJCQkJXAorCXlsID0gQ0FNRUxMSUFfU1AxMTEwKGlyICYgMHhmZikJCQkJXAorCSAgICBeIENBTUVMTElBX1NQMDIyMigodDEgPj4gOCkgJiAweGZmKQkJCVwKKwkgICAgXiBDQU1FTExJQV9TUDMwMzModDEgJiAweGZmKQkJCVwKKwkgICAgXiBDQU1FTExJQV9TUDQ0MDQoKGlyID4+IDgpICYgMHhmZik7CQlcCisJeXIgPSBDQU1FTExJQV9TUDExMTAoKHQwID4+IDgpICYgMHhmZikJCQlcCisJICAgIF4gQ0FNRUxMSUFfU1AwMjIyKHQwICYgMHhmZikJCQlcCisJICAgIF4gQ0FNRUxMSUFfU1AzMDMzKChpbCA+PiA4KSAmIDB4ZmYpCQkJXAorCSAgICBeIENBTUVMTElBX1NQNDQwNChpbCAmIDB4ZmYpOwkJCVwKKwl5bCBePSB5cjsJCQkJCQlcCisJeXIgPSBDQU1FTExJQV9SUjgoeXIpOwkJCQkJXAorCXlyIF49IHlsOwkJCQkJCVwKKyAgICB9IHdoaWxlKDApCisKKworLyoKKyAqIGZvciBzcGVlZCB1cAorICoKKyAqLworI2RlZmluZSBDQU1FTExJQV9GTFMobGwsIGxyLCBybCwgcnIsIGtsbCwga2xyLCBrcmwsIGtyciwgdDAsIHQxLCB0MiwgdDMpIFwKKyAgICBkbyB7CQkJCQkJCQlcCisJdDAgPSBrbGw7CQkJCQkJCVwKKwl0MiA9IGtycjsJCQkJCQkJXAorCXQwICY9IGxsOwkJCQkJCQlcCisJdDIgfD0gcnI7CQkJCQkJCVwKKwlybCBePSB0MjsJCQkJCQkJXAorCWxyIF49IENBTUVMTElBX1JMMSh0MCk7CQkJCQkJXAorCXQzID0ga3JsOwkJCQkJCQlcCisJdDEgPSBrbHI7CQkJCQkJCVwKKwl0MyAmPSBybDsJCQkJCQkJXAorCXQxIHw9IGxyOwkJCQkJCQlcCisJbGwgXj0gdDE7CQkJCQkJCVwKKwlyciBePSBDQU1FTExJQV9STDEodDMpOwkJCQkJCVwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQ0FNRUxMSUFfUk9VTkRTTSh4bCwgeHIsIGtsLCBrciwgeWwsIHlyLCBpbCwgaXIsIHQwLCB0MSkJXAorICAgIGRvIHsJCQkJCQkJCVwKKwlpciA9ICBDQU1FTExJQV9TUDExMTAoeHIgJiAweGZmKTsJCQkJXAorCWlsID0gIENBTUVMTElBX1NQMTExMCgoeGw+PjI0KSAmIDB4ZmYpOwkJCQlcCisJaXIgXj0gQ0FNRUxMSUFfU1AwMjIyKCh4cj4+MjQpICYgMHhmZik7CQkJCVwKKwlpbCBePSBDQU1FTExJQV9TUDAyMjIoKHhsPj4xNikgJiAweGZmKTsJCQkJXAorCWlyIF49IENBTUVMTElBX1NQMzAzMygoeHI+PjE2KSAmIDB4ZmYpOwkJCQlcCisJaWwgXj0gQ0FNRUxMSUFfU1AzMDMzKCh4bD4+OCkgJiAweGZmKTsJCQkJXAorCWlyIF49IENBTUVMTElBX1NQNDQwNCgoeHI+PjgpICYgMHhmZik7CQkJCVwKKwlpbCBePSBDQU1FTExJQV9TUDQ0MDQoeGwgJiAweGZmKTsJCQkJXAorCWlsIF49IGtsOwkJCQkJCQlcCisJaXIgXj0gaWwgXiBrcjsJCQkJCQkJXAorCXlsIF49IGlyOwkJCQkJCQlcCisJeXIgXj0gQ0FNRUxMSUFfUlI4KGlsKSBeIGlyOwkJCQkJXAorICAgIH0gd2hpbGUoMCkKKworLyoqCisgKiBTdHVmZiByZWxhdGVkIHRvIHRoZSBDYW1lbGxpYSBrZXkgc2NoZWR1bGUKKyAqLworI2RlZmluZSBTVUJMKHgpIHN1YkxbKHgpXQorI2RlZmluZSBTVUJSKHgpIHN1YlJbKHgpXQorCisKK3N0YXRpYyBjb25zdCB1MzIgY2FtZWxsaWFfc3AxMTEwWzI1Nl0gPSB7CisJMHg3MDcwNzAwMCwweDgyODI4MjAwLDB4MmMyYzJjMDAsMHhlY2VjZWMwMCwKKwkweGIzYjNiMzAwLDB4MjcyNzI3MDAsMHhjMGMwYzAwMCwweGU1ZTVlNTAwLAorCTB4ZTRlNGU0MDAsMHg4NTg1ODUwMCwweDU3NTc1NzAwLDB4MzUzNTM1MDAsCisJMHhlYWVhZWEwMCwweDBjMGMwYzAwLDB4YWVhZWFlMDAsMHg0MTQxNDEwMCwKKwkweDIzMjMyMzAwLDB4ZWZlZmVmMDAsMHg2YjZiNmIwMCwweDkzOTM5MzAwLAorCTB4NDU0NTQ1MDAsMHgxOTE5MTkwMCwweGE1YTVhNTAwLDB4MjEyMTIxMDAsCisJMHhlZGVkZWQwMCwweDBlMGUwZTAwLDB4NGY0ZjRmMDAsMHg0ZTRlNGUwMCwKKwkweDFkMWQxZDAwLDB4NjU2NTY1MDAsMHg5MjkyOTIwMCwweGJkYmRiZDAwLAorCTB4ODY4Njg2MDAsMHhiOGI4YjgwMCwweGFmYWZhZjAwLDB4OGY4ZjhmMDAsCisJMHg3YzdjN2MwMCwweGViZWJlYjAwLDB4MWYxZjFmMDAsMHhjZWNlY2UwMCwKKwkweDNlM2UzZTAwLDB4MzAzMDMwMDAsMHhkY2RjZGMwMCwweDVmNWY1ZjAwLAorCTB4NWU1ZTVlMDAsMHhjNWM1YzUwMCwweDBiMGIwYjAwLDB4MWExYTFhMDAsCisJMHhhNmE2YTYwMCwweGUxZTFlMTAwLDB4MzkzOTM5MDAsMHhjYWNhY2EwMCwKKwkweGQ1ZDVkNTAwLDB4NDc0NzQ3MDAsMHg1ZDVkNWQwMCwweDNkM2QzZDAwLAorCTB4ZDlkOWQ5MDAsMHgwMTAxMDEwMCwweDVhNWE1YTAwLDB4ZDZkNmQ2MDAsCisJMHg1MTUxNTEwMCwweDU2NTY1NjAwLDB4NmM2YzZjMDAsMHg0ZDRkNGQwMCwKKwkweDhiOGI4YjAwLDB4MGQwZDBkMDAsMHg5YTlhOWEwMCwweDY2NjY2NjAwLAorCTB4ZmJmYmZiMDAsMHhjY2NjY2MwMCwweGIwYjBiMDAwLDB4MmQyZDJkMDAsCisJMHg3NDc0NzQwMCwweDEyMTIxMjAwLDB4MmIyYjJiMDAsMHgyMDIwMjAwMCwKKwkweGYwZjBmMDAwLDB4YjFiMWIxMDAsMHg4NDg0ODQwMCwweDk5OTk5OTAwLAorCTB4ZGZkZmRmMDAsMHg0YzRjNGMwMCwweGNiY2JjYjAwLDB4YzJjMmMyMDAsCisJMHgzNDM0MzQwMCwweDdlN2U3ZTAwLDB4NzY3Njc2MDAsMHgwNTA1MDUwMCwKKwkweDZkNmQ2ZDAwLDB4YjdiN2I3MDAsMHhhOWE5YTkwMCwweDMxMzEzMTAwLAorCTB4ZDFkMWQxMDAsMHgxNzE3MTcwMCwweDA0MDQwNDAwLDB4ZDdkN2Q3MDAsCisJMHgxNDE0MTQwMCwweDU4NTg1ODAwLDB4M2EzYTNhMDAsMHg2MTYxNjEwMCwKKwkweGRlZGVkZTAwLDB4MWIxYjFiMDAsMHgxMTExMTEwMCwweDFjMWMxYzAwLAorCTB4MzIzMjMyMDAsMHgwZjBmMGYwMCwweDljOWM5YzAwLDB4MTYxNjE2MDAsCisJMHg1MzUzNTMwMCwweDE4MTgxODAwLDB4ZjJmMmYyMDAsMHgyMjIyMjIwMCwKKwkweGZlZmVmZTAwLDB4NDQ0NDQ0MDAsMHhjZmNmY2YwMCwweGIyYjJiMjAwLAorCTB4YzNjM2MzMDAsMHhiNWI1YjUwMCwweDdhN2E3YTAwLDB4OTE5MTkxMDAsCisJMHgyNDI0MjQwMCwweDA4MDgwODAwLDB4ZThlOGU4MDAsMHhhOGE4YTgwMCwKKwkweDYwNjA2MDAwLDB4ZmNmY2ZjMDAsMHg2OTY5NjkwMCwweDUwNTA1MDAwLAorCTB4YWFhYWFhMDAsMHhkMGQwZDAwMCwweGEwYTBhMDAwLDB4N2Q3ZDdkMDAsCisJMHhhMWExYTEwMCwweDg5ODk4OTAwLDB4NjI2MjYyMDAsMHg5Nzk3OTcwMCwKKwkweDU0NTQ1NDAwLDB4NWI1YjViMDAsMHgxZTFlMWUwMCwweDk1OTU5NTAwLAorCTB4ZTBlMGUwMDAsMHhmZmZmZmYwMCwweDY0NjQ2NDAwLDB4ZDJkMmQyMDAsCisJMHgxMDEwMTAwMCwweGM0YzRjNDAwLDB4MDAwMDAwMDAsMHg0ODQ4NDgwMCwKKwkweGEzYTNhMzAwLDB4ZjdmN2Y3MDAsMHg3NTc1NzUwMCwweGRiZGJkYjAwLAorCTB4OGE4YThhMDAsMHgwMzAzMDMwMCwweGU2ZTZlNjAwLDB4ZGFkYWRhMDAsCisJMHgwOTA5MDkwMCwweDNmM2YzZjAwLDB4ZGRkZGRkMDAsMHg5NDk0OTQwMCwKKwkweDg3ODc4NzAwLDB4NWM1YzVjMDAsMHg4MzgzODMwMCwweDAyMDIwMjAwLAorCTB4Y2RjZGNkMDAsMHg0YTRhNGEwMCwweDkwOTA5MDAwLDB4MzMzMzMzMDAsCisJMHg3MzczNzMwMCwweDY3Njc2NzAwLDB4ZjZmNmY2MDAsMHhmM2YzZjMwMCwKKwkweDlkOWQ5ZDAwLDB4N2Y3ZjdmMDAsMHhiZmJmYmYwMCwweGUyZTJlMjAwLAorCTB4NTI1MjUyMDAsMHg5YjliOWIwMCwweGQ4ZDhkODAwLDB4MjYyNjI2MDAsCisJMHhjOGM4YzgwMCwweDM3MzczNzAwLDB4YzZjNmM2MDAsMHgzYjNiM2IwMCwKKwkweDgxODE4MTAwLDB4OTY5Njk2MDAsMHg2ZjZmNmYwMCwweDRiNGI0YjAwLAorCTB4MTMxMzEzMDAsMHhiZWJlYmUwMCwweDYzNjM2MzAwLDB4MmUyZTJlMDAsCisJMHhlOWU5ZTkwMCwweDc5Nzk3OTAwLDB4YTdhN2E3MDAsMHg4YzhjOGMwMCwKKwkweDlmOWY5ZjAwLDB4NmU2ZTZlMDAsMHhiY2JjYmMwMCwweDhlOGU4ZTAwLAorCTB4MjkyOTI5MDAsMHhmNWY1ZjUwMCwweGY5ZjlmOTAwLDB4YjZiNmI2MDAsCisJMHgyZjJmMmYwMCwweGZkZmRmZDAwLDB4YjRiNGI0MDAsMHg1OTU5NTkwMCwKKwkweDc4Nzg3ODAwLDB4OTg5ODk4MDAsMHgwNjA2MDYwMCwweDZhNmE2YTAwLAorCTB4ZTdlN2U3MDAsMHg0NjQ2NDYwMCwweDcxNzE3MTAwLDB4YmFiYWJhMDAsCisJMHhkNGQ0ZDQwMCwweDI1MjUyNTAwLDB4YWJhYmFiMDAsMHg0MjQyNDIwMCwKKwkweDg4ODg4ODAwLDB4YTJhMmEyMDAsMHg4ZDhkOGQwMCwweGZhZmFmYTAwLAorCTB4NzI3MjcyMDAsMHgwNzA3MDcwMCwweGI5YjliOTAwLDB4NTU1NTU1MDAsCisJMHhmOGY4ZjgwMCwweGVlZWVlZTAwLDB4YWNhY2FjMDAsMHgwYTBhMGEwMCwKKwkweDM2MzYzNjAwLDB4NDk0OTQ5MDAsMHgyYTJhMmEwMCwweDY4Njg2ODAwLAorCTB4M2MzYzNjMDAsMHgzODM4MzgwMCwweGYxZjFmMTAwLDB4YTRhNGE0MDAsCisJMHg0MDQwNDAwMCwweDI4MjgyODAwLDB4ZDNkM2QzMDAsMHg3YjdiN2IwMCwKKwkweGJiYmJiYjAwLDB4YzljOWM5MDAsMHg0MzQzNDMwMCwweGMxYzFjMTAwLAorCTB4MTUxNTE1MDAsMHhlM2UzZTMwMCwweGFkYWRhZDAwLDB4ZjRmNGY0MDAsCisJMHg3Nzc3NzcwMCwweGM3YzdjNzAwLDB4ODA4MDgwMDAsMHg5ZTllOWUwMCwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgY2FtZWxsaWFfc3AwMjIyWzI1Nl0gPSB7CisJMHgwMGUwZTBlMCwweDAwMDUwNTA1LDB4MDA1ODU4NTgsMHgwMGQ5ZDlkOSwKKwkweDAwNjc2NzY3LDB4MDA0ZTRlNGUsMHgwMDgxODE4MSwweDAwY2JjYmNiLAorCTB4MDBjOWM5YzksMHgwMDBiMGIwYiwweDAwYWVhZWFlLDB4MDA2YTZhNmEsCisJMHgwMGQ1ZDVkNSwweDAwMTgxODE4LDB4MDA1ZDVkNWQsMHgwMDgyODI4MiwKKwkweDAwNDY0NjQ2LDB4MDBkZmRmZGYsMHgwMGQ2ZDZkNiwweDAwMjcyNzI3LAorCTB4MDA4YThhOGEsMHgwMDMyMzIzMiwweDAwNGI0YjRiLDB4MDA0MjQyNDIsCisJMHgwMGRiZGJkYiwweDAwMWMxYzFjLDB4MDA5ZTllOWUsMHgwMDljOWM5YywKKwkweDAwM2EzYTNhLDB4MDBjYWNhY2EsMHgwMDI1MjUyNSwweDAwN2I3YjdiLAorCTB4MDAwZDBkMGQsMHgwMDcxNzE3MSwweDAwNWY1ZjVmLDB4MDAxZjFmMWYsCisJMHgwMGY4ZjhmOCwweDAwZDdkN2Q3LDB4MDAzZTNlM2UsMHgwMDlkOWQ5ZCwKKwkweDAwN2M3YzdjLDB4MDA2MDYwNjAsMHgwMGI5YjliOSwweDAwYmViZWJlLAorCTB4MDBiY2JjYmMsMHgwMDhiOGI4YiwweDAwMTYxNjE2LDB4MDAzNDM0MzQsCisJMHgwMDRkNGQ0ZCwweDAwYzNjM2MzLDB4MDA3MjcyNzIsMHgwMDk1OTU5NSwKKwkweDAwYWJhYmFiLDB4MDA4ZThlOGUsMHgwMGJhYmFiYSwweDAwN2E3YTdhLAorCTB4MDBiM2IzYjMsMHgwMDAyMDIwMiwweDAwYjRiNGI0LDB4MDBhZGFkYWQsCisJMHgwMGEyYTJhMiwweDAwYWNhY2FjLDB4MDBkOGQ4ZDgsMHgwMDlhOWE5YSwKKwkweDAwMTcxNzE3LDB4MDAxYTFhMWEsMHgwMDM1MzUzNSwweDAwY2NjY2NjLAorCTB4MDBmN2Y3ZjcsMHgwMDk5OTk5OSwweDAwNjE2MTYxLDB4MDA1YTVhNWEsCisJMHgwMGU4ZThlOCwweDAwMjQyNDI0LDB4MDA1NjU2NTYsMHgwMDQwNDA0MCwKKwkweDAwZTFlMWUxLDB4MDA2MzYzNjMsMHgwMDA5MDkwOSwweDAwMzMzMzMzLAorCTB4MDBiZmJmYmYsMHgwMDk4OTg5OCwweDAwOTc5Nzk3LDB4MDA4NTg1ODUsCisJMHgwMDY4Njg2OCwweDAwZmNmY2ZjLDB4MDBlY2VjZWMsMHgwMDBhMGEwYSwKKwkweDAwZGFkYWRhLDB4MDA2ZjZmNmYsMHgwMDUzNTM1MywweDAwNjI2MjYyLAorCTB4MDBhM2EzYTMsMHgwMDJlMmUyZSwweDAwMDgwODA4LDB4MDBhZmFmYWYsCisJMHgwMDI4MjgyOCwweDAwYjBiMGIwLDB4MDA3NDc0NzQsMHgwMGMyYzJjMiwKKwkweDAwYmRiZGJkLDB4MDAzNjM2MzYsMHgwMDIyMjIyMiwweDAwMzgzODM4LAorCTB4MDA2NDY0NjQsMHgwMDFlMWUxZSwweDAwMzkzOTM5LDB4MDAyYzJjMmMsCisJMHgwMGE2YTZhNiwweDAwMzAzMDMwLDB4MDBlNWU1ZTUsMHgwMDQ0NDQ0NCwKKwkweDAwZmRmZGZkLDB4MDA4ODg4ODgsMHgwMDlmOWY5ZiwweDAwNjU2NTY1LAorCTB4MDA4Nzg3ODcsMHgwMDZiNmI2YiwweDAwZjRmNGY0LDB4MDAyMzIzMjMsCisJMHgwMDQ4NDg0OCwweDAwMTAxMDEwLDB4MDBkMWQxZDEsMHgwMDUxNTE1MSwKKwkweDAwYzBjMGMwLDB4MDBmOWY5ZjksMHgwMGQyZDJkMiwweDAwYTBhMGEwLAorCTB4MDA1NTU1NTUsMHgwMGExYTFhMSwweDAwNDE0MTQxLDB4MDBmYWZhZmEsCisJMHgwMDQzNDM0MywweDAwMTMxMzEzLDB4MDBjNGM0YzQsMHgwMDJmMmYyZiwKKwkweDAwYThhOGE4LDB4MDBiNmI2YjYsMHgwMDNjM2MzYywweDAwMmIyYjJiLAorCTB4MDBjMWMxYzEsMHgwMGZmZmZmZiwweDAwYzhjOGM4LDB4MDBhNWE1YTUsCisJMHgwMDIwMjAyMCwweDAwODk4OTg5LDB4MDAwMDAwMDAsMHgwMDkwOTA5MCwKKwkweDAwNDc0NzQ3LDB4MDBlZmVmZWYsMHgwMGVhZWFlYSwweDAwYjdiN2I3LAorCTB4MDAxNTE1MTUsMHgwMDA2MDYwNiwweDAwY2RjZGNkLDB4MDBiNWI1YjUsCisJMHgwMDEyMTIxMiwweDAwN2U3ZTdlLDB4MDBiYmJiYmIsMHgwMDI5MjkyOSwKKwkweDAwMGYwZjBmLDB4MDBiOGI4YjgsMHgwMDA3MDcwNywweDAwMDQwNDA0LAorCTB4MDA5YjliOWIsMHgwMDk0OTQ5NCwweDAwMjEyMTIxLDB4MDA2NjY2NjYsCisJMHgwMGU2ZTZlNiwweDAwY2VjZWNlLDB4MDBlZGVkZWQsMHgwMGU3ZTdlNywKKwkweDAwM2IzYjNiLDB4MDBmZWZlZmUsMHgwMDdmN2Y3ZiwweDAwYzVjNWM1LAorCTB4MDBhNGE0YTQsMHgwMDM3MzczNywweDAwYjFiMWIxLDB4MDA0YzRjNGMsCisJMHgwMDkxOTE5MSwweDAwNmU2ZTZlLDB4MDA4ZDhkOGQsMHgwMDc2NzY3NiwKKwkweDAwMDMwMzAzLDB4MDAyZDJkMmQsMHgwMGRlZGVkZSwweDAwOTY5Njk2LAorCTB4MDAyNjI2MjYsMHgwMDdkN2Q3ZCwweDAwYzZjNmM2LDB4MDA1YzVjNWMsCisJMHgwMGQzZDNkMywweDAwZjJmMmYyLDB4MDA0ZjRmNGYsMHgwMDE5MTkxOSwKKwkweDAwM2YzZjNmLDB4MDBkY2RjZGMsMHgwMDc5Nzk3OSwweDAwMWQxZDFkLAorCTB4MDA1MjUyNTIsMHgwMGViZWJlYiwweDAwZjNmM2YzLDB4MDA2ZDZkNmQsCisJMHgwMDVlNWU1ZSwweDAwZmJmYmZiLDB4MDA2OTY5NjksMHgwMGIyYjJiMiwKKwkweDAwZjBmMGYwLDB4MDAzMTMxMzEsMHgwMDBjMGMwYywweDAwZDRkNGQ0LAorCTB4MDBjZmNmY2YsMHgwMDhjOGM4YywweDAwZTJlMmUyLDB4MDA3NTc1NzUsCisJMHgwMGE5YTlhOSwweDAwNGE0YTRhLDB4MDA1NzU3NTcsMHgwMDg0ODQ4NCwKKwkweDAwMTExMTExLDB4MDA0NTQ1NDUsMHgwMDFiMWIxYiwweDAwZjVmNWY1LAorCTB4MDBlNGU0ZTQsMHgwMDBlMGUwZSwweDAwNzM3MzczLDB4MDBhYWFhYWEsCisJMHgwMGYxZjFmMSwweDAwZGRkZGRkLDB4MDA1OTU5NTksMHgwMDE0MTQxNCwKKwkweDAwNmM2YzZjLDB4MDA5MjkyOTIsMHgwMDU0NTQ1NCwweDAwZDBkMGQwLAorCTB4MDA3ODc4NzgsMHgwMDcwNzA3MCwweDAwZTNlM2UzLDB4MDA0OTQ5NDksCisJMHgwMDgwODA4MCwweDAwNTA1MDUwLDB4MDBhN2E3YTcsMHgwMGY2ZjZmNiwKKwkweDAwNzc3Nzc3LDB4MDA5MzkzOTMsMHgwMDg2ODY4NiwweDAwODM4MzgzLAorCTB4MDAyYTJhMmEsMHgwMGM3YzdjNywweDAwNWI1YjViLDB4MDBlOWU5ZTksCisJMHgwMGVlZWVlZSwweDAwOGY4ZjhmLDB4MDAwMTAxMDEsMHgwMDNkM2QzZCwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgY2FtZWxsaWFfc3AzMDMzWzI1Nl0gPSB7CisJMHgzODAwMzgzOCwweDQxMDA0MTQxLDB4MTYwMDE2MTYsMHg3NjAwNzY3NiwKKwkweGQ5MDBkOWQ5LDB4OTMwMDkzOTMsMHg2MDAwNjA2MCwweGYyMDBmMmYyLAorCTB4NzIwMDcyNzIsMHhjMjAwYzJjMiwweGFiMDBhYmFiLDB4OWEwMDlhOWEsCisJMHg3NTAwNzU3NSwweDA2MDAwNjA2LDB4NTcwMDU3NTcsMHhhMDAwYTBhMCwKKwkweDkxMDA5MTkxLDB4ZjcwMGY3ZjcsMHhiNTAwYjViNSwweGM5MDBjOWM5LAorCTB4YTIwMGEyYTIsMHg4YzAwOGM4YywweGQyMDBkMmQyLDB4OTAwMDkwOTAsCisJMHhmNjAwZjZmNiwweDA3MDAwNzA3LDB4YTcwMGE3YTcsMHgyNzAwMjcyNywKKwkweDhlMDA4ZThlLDB4YjIwMGIyYjIsMHg0OTAwNDk0OSwweGRlMDBkZWRlLAorCTB4NDMwMDQzNDMsMHg1YzAwNWM1YywweGQ3MDBkN2Q3LDB4YzcwMGM3YzcsCisJMHgzZTAwM2UzZSwweGY1MDBmNWY1LDB4OGYwMDhmOGYsMHg2NzAwNjc2NywKKwkweDFmMDAxZjFmLDB4MTgwMDE4MTgsMHg2ZTAwNmU2ZSwweGFmMDBhZmFmLAorCTB4MmYwMDJmMmYsMHhlMjAwZTJlMiwweDg1MDA4NTg1LDB4MGQwMDBkMGQsCisJMHg1MzAwNTM1MywweGYwMDBmMGYwLDB4OWMwMDljOWMsMHg2NTAwNjU2NSwKKwkweGVhMDBlYWVhLDB4YTMwMGEzYTMsMHhhZTAwYWVhZSwweDllMDA5ZTllLAorCTB4ZWMwMGVjZWMsMHg4MDAwODA4MCwweDJkMDAyZDJkLDB4NmIwMDZiNmIsCisJMHhhODAwYThhOCwweDJiMDAyYjJiLDB4MzYwMDM2MzYsMHhhNjAwYTZhNiwKKwkweGM1MDBjNWM1LDB4ODYwMDg2ODYsMHg0ZDAwNGQ0ZCwweDMzMDAzMzMzLAorCTB4ZmQwMGZkZmQsMHg2NjAwNjY2NiwweDU4MDA1ODU4LDB4OTYwMDk2OTYsCisJMHgzYTAwM2EzYSwweDA5MDAwOTA5LDB4OTUwMDk1OTUsMHgxMDAwMTAxMCwKKwkweDc4MDA3ODc4LDB4ZDgwMGQ4ZDgsMHg0MjAwNDI0MiwweGNjMDBjY2NjLAorCTB4ZWYwMGVmZWYsMHgyNjAwMjYyNiwweGU1MDBlNWU1LDB4NjEwMDYxNjEsCisJMHgxYTAwMWExYSwweDNmMDAzZjNmLDB4M2IwMDNiM2IsMHg4MjAwODI4MiwKKwkweGI2MDBiNmI2LDB4ZGIwMGRiZGIsMHhkNDAwZDRkNCwweDk4MDA5ODk4LAorCTB4ZTgwMGU4ZTgsMHg4YjAwOGI4YiwweDAyMDAwMjAyLDB4ZWIwMGViZWIsCisJMHgwYTAwMGEwYSwweDJjMDAyYzJjLDB4MWQwMDFkMWQsMHhiMDAwYjBiMCwKKwkweDZmMDA2ZjZmLDB4OGQwMDhkOGQsMHg4ODAwODg4OCwweDBlMDAwZTBlLAorCTB4MTkwMDE5MTksMHg4NzAwODc4NywweDRlMDA0ZTRlLDB4MGIwMDBiMGIsCisJMHhhOTAwYTlhOSwweDBjMDAwYzBjLDB4NzkwMDc5NzksMHgxMTAwMTExMSwKKwkweDdmMDA3ZjdmLDB4MjIwMDIyMjIsMHhlNzAwZTdlNywweDU5MDA1OTU5LAorCTB4ZTEwMGUxZTEsMHhkYTAwZGFkYSwweDNkMDAzZDNkLDB4YzgwMGM4YzgsCisJMHgxMjAwMTIxMiwweDA0MDAwNDA0LDB4NzQwMDc0NzQsMHg1NDAwNTQ1NCwKKwkweDMwMDAzMDMwLDB4N2UwMDdlN2UsMHhiNDAwYjRiNCwweDI4MDAyODI4LAorCTB4NTUwMDU1NTUsMHg2ODAwNjg2OCwweDUwMDA1MDUwLDB4YmUwMGJlYmUsCisJMHhkMDAwZDBkMCwweGM0MDBjNGM0LDB4MzEwMDMxMzEsMHhjYjAwY2JjYiwKKwkweDJhMDAyYTJhLDB4YWQwMGFkYWQsMHgwZjAwMGYwZiwweGNhMDBjYWNhLAorCTB4NzAwMDcwNzAsMHhmZjAwZmZmZiwweDMyMDAzMjMyLDB4NjkwMDY5NjksCisJMHgwODAwMDgwOCwweDYyMDA2MjYyLDB4MDAwMDAwMDAsMHgyNDAwMjQyNCwKKwkweGQxMDBkMWQxLDB4ZmIwMGZiZmIsMHhiYTAwYmFiYSwweGVkMDBlZGVkLAorCTB4NDUwMDQ1NDUsMHg4MTAwODE4MSwweDczMDA3MzczLDB4NmQwMDZkNmQsCisJMHg4NDAwODQ4NCwweDlmMDA5ZjlmLDB4ZWUwMGVlZWUsMHg0YTAwNGE0YSwKKwkweGMzMDBjM2MzLDB4MmUwMDJlMmUsMHhjMTAwYzFjMSwweDAxMDAwMTAxLAorCTB4ZTYwMGU2ZTYsMHgyNTAwMjUyNSwweDQ4MDA0ODQ4LDB4OTkwMDk5OTksCisJMHhiOTAwYjliOSwweGIzMDBiM2IzLDB4N2IwMDdiN2IsMHhmOTAwZjlmOSwKKwkweGNlMDBjZWNlLDB4YmYwMGJmYmYsMHhkZjAwZGZkZiwweDcxMDA3MTcxLAorCTB4MjkwMDI5MjksMHhjZDAwY2RjZCwweDZjMDA2YzZjLDB4MTMwMDEzMTMsCisJMHg2NDAwNjQ2NCwweDliMDA5YjliLDB4NjMwMDYzNjMsMHg5ZDAwOWQ5ZCwKKwkweGMwMDBjMGMwLDB4NGIwMDRiNGIsMHhiNzAwYjdiNywweGE1MDBhNWE1LAorCTB4ODkwMDg5ODksMHg1ZjAwNWY1ZiwweGIxMDBiMWIxLDB4MTcwMDE3MTcsCisJMHhmNDAwZjRmNCwweGJjMDBiY2JjLDB4ZDMwMGQzZDMsMHg0NjAwNDY0NiwKKwkweGNmMDBjZmNmLDB4MzcwMDM3MzcsMHg1ZTAwNWU1ZSwweDQ3MDA0NzQ3LAorCTB4OTQwMDk0OTQsMHhmYTAwZmFmYSwweGZjMDBmY2ZjLDB4NWIwMDViNWIsCisJMHg5NzAwOTc5NywweGZlMDBmZWZlLDB4NWEwMDVhNWEsMHhhYzAwYWNhYywKKwkweDNjMDAzYzNjLDB4NGMwMDRjNGMsMHgwMzAwMDMwMywweDM1MDAzNTM1LAorCTB4ZjMwMGYzZjMsMHgyMzAwMjMyMywweGI4MDBiOGI4LDB4NWQwMDVkNWQsCisJMHg2YTAwNmE2YSwweDkyMDA5MjkyLDB4ZDUwMGQ1ZDUsMHgyMTAwMjEyMSwKKwkweDQ0MDA0NDQ0LDB4NTEwMDUxNTEsMHhjNjAwYzZjNiwweDdkMDA3ZDdkLAorCTB4MzkwMDM5MzksMHg4MzAwODM4MywweGRjMDBkY2RjLDB4YWEwMGFhYWEsCisJMHg3YzAwN2M3YywweDc3MDA3Nzc3LDB4NTYwMDU2NTYsMHgwNTAwMDUwNSwKKwkweDFiMDAxYjFiLDB4YTQwMGE0YTQsMHgxNTAwMTUxNSwweDM0MDAzNDM0LAorCTB4MWUwMDFlMWUsMHgxYzAwMWMxYywweGY4MDBmOGY4LDB4NTIwMDUyNTIsCisJMHgyMDAwMjAyMCwweDE0MDAxNDE0LDB4ZTkwMGU5ZTksMHhiZDAwYmRiZCwKKwkweGRkMDBkZGRkLDB4ZTQwMGU0ZTQsMHhhMTAwYTFhMSwweGUwMDBlMGUwLAorCTB4OGEwMDhhOGEsMHhmMTAwZjFmMSwweGQ2MDBkNmQ2LDB4N2EwMDdhN2EsCisJMHhiYjAwYmJiYiwweGUzMDBlM2UzLDB4NDAwMDQwNDAsMHg0ZjAwNGY0ZiwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgY2FtZWxsaWFfc3A0NDA0WzI1Nl0gPSB7CisJMHg3MDcwMDA3MCwweDJjMmMwMDJjLDB4YjNiMzAwYjMsMHhjMGMwMDBjMCwKKwkweGU0ZTQwMGU0LDB4NTc1NzAwNTcsMHhlYWVhMDBlYSwweGFlYWUwMGFlLAorCTB4MjMyMzAwMjMsMHg2YjZiMDA2YiwweDQ1NDUwMDQ1LDB4YTVhNTAwYTUsCisJMHhlZGVkMDBlZCwweDRmNGYwMDRmLDB4MWQxZDAwMWQsMHg5MjkyMDA5MiwKKwkweDg2ODYwMDg2LDB4YWZhZjAwYWYsMHg3YzdjMDA3YywweDFmMWYwMDFmLAorCTB4M2UzZTAwM2UsMHhkY2RjMDBkYywweDVlNWUwMDVlLDB4MGIwYjAwMGIsCisJMHhhNmE2MDBhNiwweDM5MzkwMDM5LDB4ZDVkNTAwZDUsMHg1ZDVkMDA1ZCwKKwkweGQ5ZDkwMGQ5LDB4NWE1YTAwNWEsMHg1MTUxMDA1MSwweDZjNmMwMDZjLAorCTB4OGI4YjAwOGIsMHg5YTlhMDA5YSwweGZiZmIwMGZiLDB4YjBiMDAwYjAsCisJMHg3NDc0MDA3NCwweDJiMmIwMDJiLDB4ZjBmMDAwZjAsMHg4NDg0MDA4NCwKKwkweGRmZGYwMGRmLDB4Y2JjYjAwY2IsMHgzNDM0MDAzNCwweDc2NzYwMDc2LAorCTB4NmQ2ZDAwNmQsMHhhOWE5MDBhOSwweGQxZDEwMGQxLDB4MDQwNDAwMDQsCisJMHgxNDE0MDAxNCwweDNhM2EwMDNhLDB4ZGVkZTAwZGUsMHgxMTExMDAxMSwKKwkweDMyMzIwMDMyLDB4OWM5YzAwOWMsMHg1MzUzMDA1MywweGYyZjIwMGYyLAorCTB4ZmVmZTAwZmUsMHhjZmNmMDBjZiwweGMzYzMwMGMzLDB4N2E3YTAwN2EsCisJMHgyNDI0MDAyNCwweGU4ZTgwMGU4LDB4NjA2MDAwNjAsMHg2OTY5MDA2OSwKKwkweGFhYWEwMGFhLDB4YTBhMDAwYTAsMHhhMWExMDBhMSwweDYyNjIwMDYyLAorCTB4NTQ1NDAwNTQsMHgxZTFlMDAxZSwweGUwZTAwMGUwLDB4NjQ2NDAwNjQsCisJMHgxMDEwMDAxMCwweDAwMDAwMDAwLDB4YTNhMzAwYTMsMHg3NTc1MDA3NSwKKwkweDhhOGEwMDhhLDB4ZTZlNjAwZTYsMHgwOTA5MDAwOSwweGRkZGQwMGRkLAorCTB4ODc4NzAwODcsMHg4MzgzMDA4MywweGNkY2QwMGNkLDB4OTA5MDAwOTAsCisJMHg3MzczMDA3MywweGY2ZjYwMGY2LDB4OWQ5ZDAwOWQsMHhiZmJmMDBiZiwKKwkweDUyNTIwMDUyLDB4ZDhkODAwZDgsMHhjOGM4MDBjOCwweGM2YzYwMGM2LAorCTB4ODE4MTAwODEsMHg2ZjZmMDA2ZiwweDEzMTMwMDEzLDB4NjM2MzAwNjMsCisJMHhlOWU5MDBlOSwweGE3YTcwMGE3LDB4OWY5ZjAwOWYsMHhiY2JjMDBiYywKKwkweDI5MjkwMDI5LDB4ZjlmOTAwZjksMHgyZjJmMDAyZiwweGI0YjQwMGI0LAorCTB4Nzg3ODAwNzgsMHgwNjA2MDAwNiwweGU3ZTcwMGU3LDB4NzE3MTAwNzEsCisJMHhkNGQ0MDBkNCwweGFiYWIwMGFiLDB4ODg4ODAwODgsMHg4ZDhkMDA4ZCwKKwkweDcyNzIwMDcyLDB4YjliOTAwYjksMHhmOGY4MDBmOCwweGFjYWMwMGFjLAorCTB4MzYzNjAwMzYsMHgyYTJhMDAyYSwweDNjM2MwMDNjLDB4ZjFmMTAwZjEsCisJMHg0MDQwMDA0MCwweGQzZDMwMGQzLDB4YmJiYjAwYmIsMHg0MzQzMDA0MywKKwkweDE1MTUwMDE1LDB4YWRhZDAwYWQsMHg3Nzc3MDA3NywweDgwODAwMDgwLAorCTB4ODI4MjAwODIsMHhlY2VjMDBlYywweDI3MjcwMDI3LDB4ZTVlNTAwZTUsCisJMHg4NTg1MDA4NSwweDM1MzUwMDM1LDB4MGMwYzAwMGMsMHg0MTQxMDA0MSwKKwkweGVmZWYwMGVmLDB4OTM5MzAwOTMsMHgxOTE5MDAxOSwweDIxMjEwMDIxLAorCTB4MGUwZTAwMGUsMHg0ZTRlMDA0ZSwweDY1NjUwMDY1LDB4YmRiZDAwYmQsCisJMHhiOGI4MDBiOCwweDhmOGYwMDhmLDB4ZWJlYjAwZWIsMHhjZWNlMDBjZSwKKwkweDMwMzAwMDMwLDB4NWY1ZjAwNWYsMHhjNWM1MDBjNSwweDFhMWEwMDFhLAorCTB4ZTFlMTAwZTEsMHhjYWNhMDBjYSwweDQ3NDcwMDQ3LDB4M2QzZDAwM2QsCisJMHgwMTAxMDAwMSwweGQ2ZDYwMGQ2LDB4NTY1NjAwNTYsMHg0ZDRkMDA0ZCwKKwkweDBkMGQwMDBkLDB4NjY2NjAwNjYsMHhjY2NjMDBjYywweDJkMmQwMDJkLAorCTB4MTIxMjAwMTIsMHgyMDIwMDAyMCwweGIxYjEwMGIxLDB4OTk5OTAwOTksCisJMHg0YzRjMDA0YywweGMyYzIwMGMyLDB4N2U3ZTAwN2UsMHgwNTA1MDAwNSwKKwkweGI3YjcwMGI3LDB4MzEzMTAwMzEsMHgxNzE3MDAxNywweGQ3ZDcwMGQ3LAorCTB4NTg1ODAwNTgsMHg2MTYxMDA2MSwweDFiMWIwMDFiLDB4MWMxYzAwMWMsCisJMHgwZjBmMDAwZiwweDE2MTYwMDE2LDB4MTgxODAwMTgsMHgyMjIyMDAyMiwKKwkweDQ0NDQwMDQ0LDB4YjJiMjAwYjIsMHhiNWI1MDBiNSwweDkxOTEwMDkxLAorCTB4MDgwODAwMDgsMHhhOGE4MDBhOCwweGZjZmMwMGZjLDB4NTA1MDAwNTAsCisJMHhkMGQwMDBkMCwweDdkN2QwMDdkLDB4ODk4OTAwODksMHg5Nzk3MDA5NywKKwkweDViNWIwMDViLDB4OTU5NTAwOTUsMHhmZmZmMDBmZiwweGQyZDIwMGQyLAorCTB4YzRjNDAwYzQsMHg0ODQ4MDA0OCwweGY3ZjcwMGY3LDB4ZGJkYjAwZGIsCisJMHgwMzAzMDAwMywweGRhZGEwMGRhLDB4M2YzZjAwM2YsMHg5NDk0MDA5NCwKKwkweDVjNWMwMDVjLDB4MDIwMjAwMDIsMHg0YTRhMDA0YSwweDMzMzMwMDMzLAorCTB4Njc2NzAwNjcsMHhmM2YzMDBmMywweDdmN2YwMDdmLDB4ZTJlMjAwZTIsCisJMHg5YjliMDA5YiwweDI2MjYwMDI2LDB4MzczNzAwMzcsMHgzYjNiMDAzYiwKKwkweDk2OTYwMDk2LDB4NGI0YjAwNGIsMHhiZWJlMDBiZSwweDJlMmUwMDJlLAorCTB4Nzk3OTAwNzksMHg4YzhjMDA4YywweDZlNmUwMDZlLDB4OGU4ZTAwOGUsCisJMHhmNWY1MDBmNSwweGI2YjYwMGI2LDB4ZmRmZDAwZmQsMHg1OTU5MDA1OSwKKwkweDk4OTgwMDk4LDB4NmE2YTAwNmEsMHg0NjQ2MDA0NiwweGJhYmEwMGJhLAorCTB4MjUyNTAwMjUsMHg0MjQyMDA0MiwweGEyYTIwMGEyLDB4ZmFmYTAwZmEsCisJMHgwNzA3MDAwNywweDU1NTUwMDU1LDB4ZWVlZTAwZWUsMHgwYTBhMDAwYSwKKwkweDQ5NDkwMDQ5LDB4Njg2ODAwNjgsMHgzODM4MDAzOCwweGE0YTQwMGE0LAorCTB4MjgyODAwMjgsMHg3YjdiMDA3YiwweGM5YzkwMGM5LDB4YzFjMTAwYzEsCisJMHhlM2UzMDBlMywweGY0ZjQwMGY0LDB4YzdjNzAwYzcsMHg5ZTllMDA5ZSwKK307CisKKworCitzdGF0aWMgdm9pZCBjYW1lbGxpYV9zZXR1cDEyOChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHUzMiAqc3Via2V5KQoreworCXUzMiBrbGwsIGtsciwga3JsLCBrcnI7CisJdTMyIGlsLCBpciwgdDAsIHQxLCB3MCwgdzE7CisJdTMyIGt3NGwsIGt3NHIsIGR3LCB0bCwgdHI7CisJdTMyIHN1YkxbMjZdOworCXUzMiBzdWJSWzI2XTsKKworCS8qKgorCSAqICBrID09IGtsbCB8fCBrbHIgfHwga3JsIHx8IGtyciAofHwgaXMgY29uY2F0aW5hdGlvbikKKwkgKi8KKwlrbGwgPSBHRVRVMzIoa2V5ICAgICApOworCWtsciA9IEdFVFUzMihrZXkgKyAgNCk7CisJa3JsID0gR0VUVTMyKGtleSArICA4KTsKKwlrcnIgPSBHRVRVMzIoa2V5ICsgMTIpOworCS8qKgorCSAqIGdlbmVyYXRlIEtMIGRlcGVuZGVudCBzdWJrZXlzCisJICovCisJLyoga3cxICovCisJU1VCTCgwKSA9IGtsbDsgU1VCUigwKSA9IGtscjsKKwkvKiBrdzIgKi8KKwlTVUJMKDEpID0ga3JsOyBTVUJSKDEpID0ga3JyOworCS8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgMTViaXQgKi8KKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTUpOworCS8qIGszICovCisJU1VCTCg0KSA9IGtsbDsgU1VCUig0KSA9IGtscjsKKwkvKiBrNCAqLworCVNVQkwoNSkgPSBrcmw7IFNVQlIoNSkgPSBrcnI7CisJLyogcm90YXRpb24gbGVmdCBzaGlmdCAxNSszMGJpdCAqLworCUNBTUVMTElBX1JPTERRKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAzMCk7CisJLyogazcgKi8KKwlTVUJMKDEwKSA9IGtsbDsgU1VCUigxMCkgPSBrbHI7CisJLyogazggKi8KKwlTVUJMKDExKSA9IGtybDsgU1VCUigxMSkgPSBrcnI7CisJLyogcm90YXRpb24gbGVmdCBzaGlmdCAxNSszMCsxNWJpdCAqLworCUNBTUVMTElBX1JPTERRKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAxNSk7CisJLyogazEwICovCisJU1VCTCgxMykgPSBrcmw7IFNVQlIoMTMpID0ga3JyOworCS8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgMTUrMzArMTUrMTcgYml0ICovCisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE3KTsKKwkvKiBrbDMgKi8KKwlTVUJMKDE2KSA9IGtsbDsgU1VCUigxNikgPSBrbHI7CisJLyoga2w0ICovCisJU1VCTCgxNykgPSBrcmw7IFNVQlIoMTcpID0ga3JyOworCS8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgMTUrMzArMTUrMTcrMTcgYml0ICovCisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE3KTsKKwkvKiBrMTMgKi8KKwlTVUJMKDE4KSA9IGtsbDsgU1VCUigxOCkgPSBrbHI7CisJLyogazE0ICovCisJU1VCTCgxOSkgPSBrcmw7IFNVQlIoMTkpID0ga3JyOworCS8qIHJvdGF0aW9uIGxlZnQgc2hpZnQgMTUrMzArMTUrMTcrMTcrMTcgYml0ICovCisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE3KTsKKwkvKiBrMTcgKi8KKwlTVUJMKDIyKSA9IGtsbDsgU1VCUigyMikgPSBrbHI7CisJLyogazE4ICovCisJU1VCTCgyMykgPSBrcmw7IFNVQlIoMjMpID0ga3JyOworCisJLyogZ2VuZXJhdGUgS0EgKi8KKwlrbGwgPSBTVUJMKDApOyBrbHIgPSBTVUJSKDApOworCWtybCA9IFNVQkwoMSk7IGtyciA9IFNVQlIoMSk7CisJQ0FNRUxMSUFfRihrbGwsIGtsciwKKwkJICAgQ0FNRUxMSUFfU0lHTUExTCwgQ0FNRUxMSUFfU0lHTUExUiwKKwkJICAgdzAsIHcxLCBpbCwgaXIsIHQwLCB0MSk7CisJa3JsIF49IHcwOyBrcnIgXj0gdzE7CisJQ0FNRUxMSUFfRihrcmwsIGtyciwKKwkJICAgQ0FNRUxMSUFfU0lHTUEyTCwgQ0FNRUxMSUFfU0lHTUEyUiwKKwkJICAga2xsLCBrbHIsIGlsLCBpciwgdDAsIHQxKTsKKwkvKiBjdXJyZW50IHN0YXR1cyA9PSAoa2xsLCBrbHIsIHcwLCB3MSkgKi8KKwlDQU1FTExJQV9GKGtsbCwga2xyLAorCQkgICBDQU1FTExJQV9TSUdNQTNMLCBDQU1FTExJQV9TSUdNQTNSLAorCQkgICBrcmwsIGtyciwgaWwsIGlyLCB0MCwgdDEpOworCWtybCBePSB3MDsga3JyIF49IHcxOworCUNBTUVMTElBX0Yoa3JsLCBrcnIsCisJCSAgIENBTUVMTElBX1NJR01BNEwsIENBTUVMTElBX1NJR01BNFIsCisJCSAgIHcwLCB3MSwgaWwsIGlyLCB0MCwgdDEpOworCWtsbCBePSB3MDsga2xyIF49IHcxOworCisJLyogZ2VuZXJhdGUgS0EgZGVwZW5kZW50IHN1YmtleXMgKi8KKwkvKiBrMSwgazIgKi8KKwlTVUJMKDIpID0ga2xsOyBTVUJSKDIpID0ga2xyOworCVNVQkwoMykgPSBrcmw7IFNVQlIoMykgPSBrcnI7CisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKwkvKiBrNSxrNiAqLworCVNVQkwoNikgPSBrbGw7IFNVQlIoNikgPSBrbHI7CisJU1VCTCg3KSA9IGtybDsgU1VCUig3KSA9IGtycjsKKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTUpOworCS8qIGtsMSwga2wyICovCisJU1VCTCg4KSA9IGtsbDsgU1VCUig4KSA9IGtscjsKKwlTVUJMKDkpID0ga3JsOyBTVUJSKDkpID0ga3JyOworCUNBTUVMTElBX1JPTERRKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAxNSk7CisJLyogazkgKi8KKwlTVUJMKDEyKSA9IGtsbDsgU1VCUigxMikgPSBrbHI7CisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKwkvKiBrMTEsIGsxMiAqLworCVNVQkwoMTQpID0ga2xsOyBTVUJSKDE0KSA9IGtscjsKKwlTVUJMKDE1KSA9IGtybDsgU1VCUigxNSkgPSBrcnI7CisJQ0FNRUxMSUFfUk9MRFFvMzIoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDM0KTsKKwkvKiBrMTUsIGsxNiAqLworCVNVQkwoMjApID0ga2xsOyBTVUJSKDIwKSA9IGtscjsKKwlTVUJMKDIxKSA9IGtybDsgU1VCUigyMSkgPSBrcnI7CisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE3KTsKKwkvKiBrdzMsIGt3NCAqLworCVNVQkwoMjQpID0ga2xsOyBTVUJSKDI0KSA9IGtscjsKKwlTVUJMKDI1KSA9IGtybDsgU1VCUigyNSkgPSBrcnI7CisKKworCS8qIGFic29yYiBrdzIgdG8gb3RoZXIgc3Via2V5cyAqLworCS8qIHJvdW5kIDIgKi8KKwlTVUJMKDMpIF49IFNVQkwoMSk7IFNVQlIoMykgXj0gU1VCUigxKTsKKwkvKiByb3VuZCA0ICovCisJU1VCTCg1KSBePSBTVUJMKDEpOyBTVUJSKDUpIF49IFNVQlIoMSk7CisJLyogcm91bmQgNiAqLworCVNVQkwoNykgXj0gU1VCTCgxKTsgU1VCUig3KSBePSBTVUJSKDEpOworCVNVQkwoMSkgXj0gU1VCUigxKSAmIH5TVUJSKDkpOworCWR3ID0gU1VCTCgxKSAmIFNVQkwoOSksCisJCVNVQlIoMSkgXj0gQ0FNRUxMSUFfUkwxKGR3KTsgLyogbW9kaWZpZWQgZm9yIEZMaW52KGtsMikgKi8KKwkvKiByb3VuZCA4ICovCisJU1VCTCgxMSkgXj0gU1VCTCgxKTsgU1VCUigxMSkgXj0gU1VCUigxKTsKKwkvKiByb3VuZCAxMCAqLworCVNVQkwoMTMpIF49IFNVQkwoMSk7IFNVQlIoMTMpIF49IFNVQlIoMSk7CisJLyogcm91bmQgMTIgKi8KKwlTVUJMKDE1KSBePSBTVUJMKDEpOyBTVUJSKDE1KSBePSBTVUJSKDEpOworCVNVQkwoMSkgXj0gU1VCUigxKSAmIH5TVUJSKDE3KTsKKwlkdyA9IFNVQkwoMSkgJiBTVUJMKDE3KSwKKwkJU1VCUigxKSBePSBDQU1FTExJQV9STDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkxpbnYoa2w0KSAqLworCS8qIHJvdW5kIDE0ICovCisJU1VCTCgxOSkgXj0gU1VCTCgxKTsgU1VCUigxOSkgXj0gU1VCUigxKTsKKwkvKiByb3VuZCAxNiAqLworCVNVQkwoMjEpIF49IFNVQkwoMSk7IFNVQlIoMjEpIF49IFNVQlIoMSk7CisJLyogcm91bmQgMTggKi8KKwlTVUJMKDIzKSBePSBTVUJMKDEpOyBTVUJSKDIzKSBePSBTVUJSKDEpOworCS8qIGt3MyAqLworCVNVQkwoMjQpIF49IFNVQkwoMSk7IFNVQlIoMjQpIF49IFNVQlIoMSk7CisKKwkvKiBhYnNvcmIga3c0IHRvIG90aGVyIHN1YmtleXMgKi8KKwlrdzRsID0gU1VCTCgyNSk7IGt3NHIgPSBTVUJSKDI1KTsKKwkvKiByb3VuZCAxNyAqLworCVNVQkwoMjIpIF49IGt3NGw7IFNVQlIoMjIpIF49IGt3NHI7CisJLyogcm91bmQgMTUgKi8KKwlTVUJMKDIwKSBePSBrdzRsOyBTVUJSKDIwKSBePSBrdzRyOworCS8qIHJvdW5kIDEzICovCisJU1VCTCgxOCkgXj0ga3c0bDsgU1VCUigxOCkgXj0ga3c0cjsKKwlrdzRsIF49IGt3NHIgJiB+U1VCUigxNik7CisJZHcgPSBrdzRsICYgU1VCTCgxNiksCisJCWt3NHIgXj0gQ0FNRUxMSUFfUkwxKGR3KTsgLyogbW9kaWZpZWQgZm9yIEZMKGtsMykgKi8KKwkvKiByb3VuZCAxMSAqLworCVNVQkwoMTQpIF49IGt3NGw7IFNVQlIoMTQpIF49IGt3NHI7CisJLyogcm91bmQgOSAqLworCVNVQkwoMTIpIF49IGt3NGw7IFNVQlIoMTIpIF49IGt3NHI7CisJLyogcm91bmQgNyAqLworCVNVQkwoMTApIF49IGt3NGw7IFNVQlIoMTApIF49IGt3NHI7CisJa3c0bCBePSBrdzRyICYgflNVQlIoOCk7CisJZHcgPSBrdzRsICYgU1VCTCg4KSwKKwkJa3c0ciBePSBDQU1FTExJQV9STDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkwoa2wxKSAqLworCS8qIHJvdW5kIDUgKi8KKwlTVUJMKDYpIF49IGt3NGw7IFNVQlIoNikgXj0ga3c0cjsKKwkvKiByb3VuZCAzICovCisJU1VCTCg0KSBePSBrdzRsOyBTVUJSKDQpIF49IGt3NHI7CisJLyogcm91bmQgMSAqLworCVNVQkwoMikgXj0ga3c0bDsgU1VCUigyKSBePSBrdzRyOworCS8qIGt3MSAqLworCVNVQkwoMCkgXj0ga3c0bDsgU1VCUigwKSBePSBrdzRyOworCisKKwkvKiBrZXkgWE9SIGlzIGVuZCBvZiBGLWZ1bmN0aW9uICovCisJQ0FNRUxMSUFfU1VCS0VZX0woMCkgPSBTVUJMKDApIF4gU1VCTCgyKTsvKiBrdzEgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigwKSA9IFNVQlIoMCkgXiBTVUJSKDIpOworCUNBTUVMTElBX1NVQktFWV9MKDIpID0gU1VCTCgzKTsgICAgICAgLyogcm91bmQgMSAqLworCUNBTUVMTElBX1NVQktFWV9SKDIpID0gU1VCUigzKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgzKSA9IFNVQkwoMikgXiBTVUJMKDQpOyAvKiByb3VuZCAyICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMykgPSBTVUJSKDIpIF4gU1VCUig0KTsKKwlDQU1FTExJQV9TVUJLRVlfTCg0KSA9IFNVQkwoMykgXiBTVUJMKDUpOyAvKiByb3VuZCAzICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNCkgPSBTVUJSKDMpIF4gU1VCUig1KTsKKwlDQU1FTExJQV9TVUJLRVlfTCg1KSA9IFNVQkwoNCkgXiBTVUJMKDYpOyAvKiByb3VuZCA0ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNSkgPSBTVUJSKDQpIF4gU1VCUig2KTsKKwlDQU1FTExJQV9TVUJLRVlfTCg2KSA9IFNVQkwoNSkgXiBTVUJMKDcpOyAvKiByb3VuZCA1ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNikgPSBTVUJSKDUpIF4gU1VCUig3KTsKKwl0bCA9IFNVQkwoMTApIF4gKFNVQlIoMTApICYgflNVQlIoOCkpOworCWR3ID0gdGwgJiBTVUJMKDgpLCAgLyogRkwoa2wxKSAqLworCQl0ciA9IFNVQlIoMTApIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKwlDQU1FTExJQV9TVUJLRVlfTCg3KSA9IFNVQkwoNikgXiB0bDsgLyogcm91bmQgNiAqLworCUNBTUVMTElBX1NVQktFWV9SKDcpID0gU1VCUig2KSBeIHRyOworCUNBTUVMTElBX1NVQktFWV9MKDgpID0gU1VCTCg4KTsgICAgICAgLyogRkwoa2wxKSAqLworCUNBTUVMTElBX1NVQktFWV9SKDgpID0gU1VCUig4KTsKKwlDQU1FTExJQV9TVUJLRVlfTCg5KSA9IFNVQkwoOSk7ICAgICAgIC8qIEZMaW52KGtsMikgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig5KSA9IFNVQlIoOSk7CisJdGwgPSBTVUJMKDcpIF4gKFNVQlIoNykgJiB+U1VCUig5KSk7CisJZHcgPSB0bCAmIFNVQkwoOSksICAvKiBGTGludihrbDIpICovCisJCXRyID0gU1VCUig3KSBeIENBTUVMTElBX1JMMShkdyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTApID0gdGwgXiBTVUJMKDExKTsgLyogcm91bmQgNyAqLworCUNBTUVMTElBX1NVQktFWV9SKDEwKSA9IHRyIF4gU1VCUigxMSk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTEpID0gU1VCTCgxMCkgXiBTVUJMKDEyKTsgLyogcm91bmQgOCAqLworCUNBTUVMTElBX1NVQktFWV9SKDExKSA9IFNVQlIoMTApIF4gU1VCUigxMik7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTIpID0gU1VCTCgxMSkgXiBTVUJMKDEzKTsgLyogcm91bmQgOSAqLworCUNBTUVMTElBX1NVQktFWV9SKDEyKSA9IFNVQlIoMTEpIF4gU1VCUigxMyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTMpID0gU1VCTCgxMikgXiBTVUJMKDE0KTsgLyogcm91bmQgMTAgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxMykgPSBTVUJSKDEyKSBeIFNVQlIoMTQpOworCUNBTUVMTElBX1NVQktFWV9MKDE0KSA9IFNVQkwoMTMpIF4gU1VCTCgxNSk7IC8qIHJvdW5kIDExICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTQpID0gU1VCUigxMykgXiBTVUJSKDE1KTsKKwl0bCA9IFNVQkwoMTgpIF4gKFNVQlIoMTgpICYgflNVQlIoMTYpKTsKKwlkdyA9IHRsICYgU1VCTCgxNiksIC8qIEZMKGtsMykgKi8KKwkJdHIgPSBTVUJSKDE4KSBeIENBTUVMTElBX1JMMShkdyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTUpID0gU1VCTCgxNCkgXiB0bDsgLyogcm91bmQgMTIgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxNSkgPSBTVUJSKDE0KSBeIHRyOworCUNBTUVMTElBX1NVQktFWV9MKDE2KSA9IFNVQkwoMTYpOyAgICAgLyogRkwoa2wzKSAqLworCUNBTUVMTElBX1NVQktFWV9SKDE2KSA9IFNVQlIoMTYpOworCUNBTUVMTElBX1NVQktFWV9MKDE3KSA9IFNVQkwoMTcpOyAgICAgLyogRkxpbnYoa2w0KSAqLworCUNBTUVMTElBX1NVQktFWV9SKDE3KSA9IFNVQlIoMTcpOworCXRsID0gU1VCTCgxNSkgXiAoU1VCUigxNSkgJiB+U1VCUigxNykpOworCWR3ID0gdGwgJiBTVUJMKDE3KSwgLyogRkxpbnYoa2w0KSAqLworCQl0ciA9IFNVQlIoMTUpIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgxOCkgPSB0bCBeIFNVQkwoMTkpOyAvKiByb3VuZCAxMyAqLworCUNBTUVMTElBX1NVQktFWV9SKDE4KSA9IHRyIF4gU1VCUigxOSk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTkpID0gU1VCTCgxOCkgXiBTVUJMKDIwKTsgLyogcm91bmQgMTQgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxOSkgPSBTVUJSKDE4KSBeIFNVQlIoMjApOworCUNBTUVMTElBX1NVQktFWV9MKDIwKSA9IFNVQkwoMTkpIF4gU1VCTCgyMSk7IC8qIHJvdW5kIDE1ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjApID0gU1VCUigxOSkgXiBTVUJSKDIxKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyMSkgPSBTVUJMKDIwKSBeIFNVQkwoMjIpOyAvKiByb3VuZCAxNiAqLworCUNBTUVMTElBX1NVQktFWV9SKDIxKSA9IFNVQlIoMjApIF4gU1VCUigyMik7CisJQ0FNRUxMSUFfU1VCS0VZX0woMjIpID0gU1VCTCgyMSkgXiBTVUJMKDIzKTsgLyogcm91bmQgMTcgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMikgPSBTVUJSKDIxKSBeIFNVQlIoMjMpOworCUNBTUVMTElBX1NVQktFWV9MKDIzKSA9IFNVQkwoMjIpOyAgICAgLyogcm91bmQgMTggKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMykgPSBTVUJSKDIyKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyNCkgPSBTVUJMKDI0KSBeIFNVQkwoMjMpOyAvKiBrdzMgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyNCkgPSBTVUJSKDI0KSBeIFNVQlIoMjMpOworCisJLyogYXBwbHkgdGhlIGludmVyc2Ugb2YgdGhlIGxhc3QgaGFsZiBvZiBQLWZ1bmN0aW9uICovCisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyKSBeIENBTUVMTElBX1NVQktFWV9SKDIpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMSAqLworCUNBTUVMTElBX1NVQktFWV9SKDIpID0gQ0FNRUxMSUFfU1VCS0VZX0woMikgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMikgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDMpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMyksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAyICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMykgPSBDQU1FTExJQV9TVUJLRVlfTCgzKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgzKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woNCkgXiBDQU1FTExJQV9TVUJLRVlfUig0KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDMgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig0KSA9IENBTUVMTElBX1NVQktFWV9MKDQpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDQpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCg1KSBeIENBTUVMTElBX1NVQktFWV9SKDUpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgNCAqLworCUNBTUVMTElBX1NVQktFWV9SKDUpID0gQ0FNRUxMSUFfU1VCS0VZX0woNSkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woNSkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDYpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoNiksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCA1ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNikgPSBDQU1FTExJQV9TVUJLRVlfTCg2KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCg2KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woNykgXiBDQU1FTExJQV9TVUJLRVlfUig3KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDYgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig3KSA9IENBTUVMTElBX1NVQktFWV9MKDcpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDcpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgxMCkgXiBDQU1FTExJQV9TVUJLRVlfUigxMCksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCA3ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTApID0gQ0FNRUxMSUFfU1VCS0VZX0woMTApIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDEwKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMTEpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMTEpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgOCAqLworCUNBTUVMTElBX1NVQktFWV9SKDExKSA9IENBTUVMTElBX1NVQktFWV9MKDExKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgxMSkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDEyKSBeIENBTUVMTElBX1NVQktFWV9SKDEyKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDkgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxMikgPSBDQU1FTExJQV9TVUJLRVlfTCgxMikgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMTIpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgxMykgXiBDQU1FTExJQV9TVUJLRVlfUigxMyksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxMCAqLworCUNBTUVMTElBX1NVQktFWV9SKDEzKSA9IENBTUVMTElBX1NVQktFWV9MKDEzKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgxMykgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDE0KSBeIENBTUVMTElBX1NVQktFWV9SKDE0KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDExICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTQpID0gQ0FNRUxMSUFfU1VCS0VZX0woMTQpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDE0KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMTUpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMTUpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTIgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxNSkgPSBDQU1FTExJQV9TVUJLRVlfTCgxNSkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMTUpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgxOCkgXiBDQU1FTExJQV9TVUJLRVlfUigxOCksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxMyAqLworCUNBTUVMTElBX1NVQktFWV9SKDE4KSA9IENBTUVMTElBX1NVQktFWV9MKDE4KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgxOCkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDE5KSBeIENBTUVMTElBX1NVQktFWV9SKDE5KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDE0ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTkpID0gQ0FNRUxMSUFfU1VCS0VZX0woMTkpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDE5KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMjApIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMjApLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTUgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMCkgPSBDQU1FTExJQV9TVUJLRVlfTCgyMCkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMjApID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyMSkgXiBDQU1FTExJQV9TVUJLRVlfUigyMSksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxNiAqLworCUNBTUVMTElBX1NVQktFWV9SKDIxKSA9IENBTUVMTElBX1NVQktFWV9MKDIxKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgyMSkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDIyKSBeIENBTUVMTElBX1NVQktFWV9SKDIyKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDE3ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjIpID0gQ0FNRUxMSUFfU1VCS0VZX0woMjIpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDIyKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMjMpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMjMpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTggKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMykgPSBDQU1FTExJQV9TVUJLRVlfTCgyMykgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMjMpID0gZHc7CisKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgY2FtZWxsaWFfc2V0dXAyNTYoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1MzIgKnN1YmtleSkKK3sKKwl1MzIga2xsLGtscixrcmwsa3JyOyAgICAgICAgICAgLyogbGVmdCBoYWxmIG9mIGtleSAqLworCXUzMiBrcmxsLGtybHIsa3JybCxrcnJyOyAgICAgICAvKiByaWdodCBoYWxmIG9mIGtleSAqLworCXUzMiBpbCwgaXIsIHQwLCB0MSwgdzAsIHcxOyAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGVzICovCisJdTMyIGt3NGwsIGt3NHIsIGR3LCB0bCwgdHI7CisJdTMyIHN1YkxbMzRdOworCXUzMiBzdWJSWzM0XTsKKworCS8qKgorCSAqICBrZXkgPSAoa2xsIHx8IGtsciB8fCBrcmwgfHwga3JyIHx8IGtybGwgfHwga3JsciB8fCBrcnJsIHx8IGtycnIpCisJICogICh8fCBpcyBjb25jYXRpbmF0aW9uKQorCSAqLworCisJa2xsICA9IEdFVFUzMihrZXkgICAgICk7CisJa2xyICA9IEdFVFUzMihrZXkgKyAgNCk7CisJa3JsICA9IEdFVFUzMihrZXkgKyAgOCk7CisJa3JyICA9IEdFVFUzMihrZXkgKyAxMik7CisJa3JsbCA9IEdFVFUzMihrZXkgKyAxNik7CisJa3JsciA9IEdFVFUzMihrZXkgKyAyMCk7CisJa3JybCA9IEdFVFUzMihrZXkgKyAyNCk7CisJa3JyciA9IEdFVFUzMihrZXkgKyAyOCk7CisKKwkvKiBnZW5lcmF0ZSBLTCBkZXBlbmRlbnQgc3Via2V5cyAqLworCS8qIGt3MSAqLworCVNVQkwoMCkgPSBrbGw7IFNVQlIoMCkgPSBrbHI7CisJLyoga3cyICovCisJU1VCTCgxKSA9IGtybDsgU1VCUigxKSA9IGtycjsKKwlDQU1FTExJQV9ST0xEUW8zMihrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgNDUpOworCS8qIGs5ICovCisJU1VCTCgxMikgPSBrbGw7IFNVQlIoMTIpID0ga2xyOworCS8qIGsxMCAqLworCVNVQkwoMTMpID0ga3JsOyBTVUJSKDEzKSA9IGtycjsKKwlDQU1FTExJQV9ST0xEUShrbGwsIGtsciwga3JsLCBrcnIsIHcwLCB3MSwgMTUpOworCS8qIGtsMyAqLworCVNVQkwoMTYpID0ga2xsOyBTVUJSKDE2KSA9IGtscjsKKwkvKiBrbDQgKi8KKwlTVUJMKDE3KSA9IGtybDsgU1VCUigxNykgPSBrcnI7CisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE3KTsKKwkvKiBrMTcgKi8KKwlTVUJMKDIyKSA9IGtsbDsgU1VCUigyMikgPSBrbHI7CisJLyogazE4ICovCisJU1VCTCgyMykgPSBrcmw7IFNVQlIoMjMpID0ga3JyOworCUNBTUVMTElBX1JPTERRbzMyKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAzNCk7CisJLyogazIzICovCisJU1VCTCgzMCkgPSBrbGw7IFNVQlIoMzApID0ga2xyOworCS8qIGsyNCAqLworCVNVQkwoMzEpID0ga3JsOyBTVUJSKDMxKSA9IGtycjsKKworCS8qIGdlbmVyYXRlIEtSIGRlcGVuZGVudCBzdWJrZXlzICovCisJQ0FNRUxMSUFfUk9MRFEoa3JsbCwga3Jsciwga3JybCwga3JyciwgdzAsIHcxLCAxNSk7CisJLyogazMgKi8KKwlTVUJMKDQpID0ga3JsbDsgU1VCUig0KSA9IGtybHI7CisJLyogazQgKi8KKwlTVUJMKDUpID0ga3JybDsgU1VCUig1KSA9IGtycnI7CisJQ0FNRUxMSUFfUk9MRFEoa3JsbCwga3Jsciwga3JybCwga3JyciwgdzAsIHcxLCAxNSk7CisJLyoga2wxICovCisJU1VCTCg4KSA9IGtybGw7IFNVQlIoOCkgPSBrcmxyOworCS8qIGtsMiAqLworCVNVQkwoOSkgPSBrcnJsOyBTVUJSKDkpID0ga3JycjsKKwlDQU1FTExJQV9ST0xEUShrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDMwKTsKKwkvKiBrMTMgKi8KKwlTVUJMKDE4KSA9IGtybGw7IFNVQlIoMTgpID0ga3JscjsKKwkvKiBrMTQgKi8KKwlTVUJMKDE5KSA9IGtycmw7IFNVQlIoMTkpID0ga3JycjsKKwlDQU1FTExJQV9ST0xEUW8zMihrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDM0KTsKKwkvKiBrMTkgKi8KKwlTVUJMKDI2KSA9IGtybGw7IFNVQlIoMjYpID0ga3JscjsKKwkvKiBrMjAgKi8KKwlTVUJMKDI3KSA9IGtycmw7IFNVQlIoMjcpID0ga3JycjsKKwlDQU1FTExJQV9ST0xEUW8zMihrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDM0KTsKKworCS8qIGdlbmVyYXRlIEtBICovCisJa2xsID0gU1VCTCgwKSBeIGtybGw7IGtsciA9IFNVQlIoMCkgXiBrcmxyOworCWtybCA9IFNVQkwoMSkgXiBrcnJsOyBrcnIgPSBTVUJSKDEpIF4ga3JycjsKKwlDQU1FTExJQV9GKGtsbCwga2xyLAorCQkgICBDQU1FTExJQV9TSUdNQTFMLCBDQU1FTExJQV9TSUdNQTFSLAorCQkgICB3MCwgdzEsIGlsLCBpciwgdDAsIHQxKTsKKwlrcmwgXj0gdzA7IGtyciBePSB3MTsKKwlDQU1FTExJQV9GKGtybCwga3JyLAorCQkgICBDQU1FTExJQV9TSUdNQTJMLCBDQU1FTExJQV9TSUdNQTJSLAorCQkgICBrbGwsIGtsciwgaWwsIGlyLCB0MCwgdDEpOworCWtsbCBePSBrcmxsOyBrbHIgXj0ga3JscjsKKwlDQU1FTExJQV9GKGtsbCwga2xyLAorCQkgICBDQU1FTExJQV9TSUdNQTNMLCBDQU1FTExJQV9TSUdNQTNSLAorCQkgICBrcmwsIGtyciwgaWwsIGlyLCB0MCwgdDEpOworCWtybCBePSB3MCBeIGtycmw7IGtyciBePSB3MSBeIGtycnI7CisJQ0FNRUxMSUFfRihrcmwsIGtyciwKKwkJICAgQ0FNRUxMSUFfU0lHTUE0TCwgQ0FNRUxMSUFfU0lHTUE0UiwKKwkJICAgdzAsIHcxLCBpbCwgaXIsIHQwLCB0MSk7CisJa2xsIF49IHcwOyBrbHIgXj0gdzE7CisKKwkvKiBnZW5lcmF0ZSBLQiAqLworCWtybGwgXj0ga2xsOyBrcmxyIF49IGtscjsKKwlrcnJsIF49IGtybDsga3JyciBePSBrcnI7CisJQ0FNRUxMSUFfRihrcmxsLCBrcmxyLAorCQkgICBDQU1FTExJQV9TSUdNQTVMLCBDQU1FTExJQV9TSUdNQTVSLAorCQkgICB3MCwgdzEsIGlsLCBpciwgdDAsIHQxKTsKKwlrcnJsIF49IHcwOyBrcnJyIF49IHcxOworCUNBTUVMTElBX0Yoa3JybCwga3JyciwKKwkJICAgQ0FNRUxMSUFfU0lHTUE2TCwgQ0FNRUxMSUFfU0lHTUE2UiwKKwkJICAgdzAsIHcxLCBpbCwgaXIsIHQwLCB0MSk7CisJa3JsbCBePSB3MDsga3JsciBePSB3MTsKKworCS8qIGdlbmVyYXRlIEtBIGRlcGVuZGVudCBzdWJrZXlzICovCisJQ0FNRUxMSUFfUk9MRFEoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDE1KTsKKwkvKiBrNSAqLworCVNVQkwoNikgPSBrbGw7IFNVQlIoNikgPSBrbHI7CisJLyogazYgKi8KKwlTVUJMKDcpID0ga3JsOyBTVUJSKDcpID0ga3JyOworCUNBTUVMTElBX1JPTERRKGtsbCwga2xyLCBrcmwsIGtyciwgdzAsIHcxLCAzMCk7CisJLyogazExICovCisJU1VCTCgxNCkgPSBrbGw7IFNVQlIoMTQpID0ga2xyOworCS8qIGsxMiAqLworCVNVQkwoMTUpID0ga3JsOyBTVUJSKDE1KSA9IGtycjsKKwkvKiByb3RhdGlvbiBsZWZ0IHNoaWZ0IDMyYml0ICovCisJLyoga2w1ICovCisJU1VCTCgyNCkgPSBrbHI7IFNVQlIoMjQpID0ga3JsOworCS8qIGtsNiAqLworCVNVQkwoMjUpID0ga3JyOyBTVUJSKDI1KSA9IGtsbDsKKwkvKiByb3RhdGlvbiBsZWZ0IHNoaWZ0IDQ5IGZyb20gazExLGsxMiAtPiBrMjEsazIyICovCisJQ0FNRUxMSUFfUk9MRFFvMzIoa2xsLCBrbHIsIGtybCwga3JyLCB3MCwgdzEsIDQ5KTsKKwkvKiBrMjEgKi8KKwlTVUJMKDI4KSA9IGtsbDsgU1VCUigyOCkgPSBrbHI7CisJLyogazIyICovCisJU1VCTCgyOSkgPSBrcmw7IFNVQlIoMjkpID0ga3JyOworCisJLyogZ2VuZXJhdGUgS0IgZGVwZW5kZW50IHN1YmtleXMgKi8KKwkvKiBrMSAqLworCVNVQkwoMikgPSBrcmxsOyBTVUJSKDIpID0ga3JscjsKKwkvKiBrMiAqLworCVNVQkwoMykgPSBrcnJsOyBTVUJSKDMpID0ga3JycjsKKwlDQU1FTExJQV9ST0xEUShrcmxsLCBrcmxyLCBrcnJsLCBrcnJyLCB3MCwgdzEsIDMwKTsKKwkvKiBrNyAqLworCVNVQkwoMTApID0ga3JsbDsgU1VCUigxMCkgPSBrcmxyOworCS8qIGs4ICovCisJU1VCTCgxMSkgPSBrcnJsOyBTVUJSKDExKSA9IGtycnI7CisJQ0FNRUxMSUFfUk9MRFEoa3JsbCwga3Jsciwga3JybCwga3JyciwgdzAsIHcxLCAzMCk7CisJLyogazE1ICovCisJU1VCTCgyMCkgPSBrcmxsOyBTVUJSKDIwKSA9IGtybHI7CisJLyogazE2ICovCisJU1VCTCgyMSkgPSBrcnJsOyBTVUJSKDIxKSA9IGtycnI7CisJQ0FNRUxMSUFfUk9MRFFvMzIoa3JsbCwga3Jsciwga3JybCwga3JyciwgdzAsIHcxLCA1MSk7CisJLyoga3czICovCisJU1VCTCgzMikgPSBrcmxsOyBTVUJSKDMyKSA9IGtybHI7CisJLyoga3c0ICovCisJU1VCTCgzMykgPSBrcnJsOyBTVUJSKDMzKSA9IGtycnI7CisKKwkvKiBhYnNvcmIga3cyIHRvIG90aGVyIHN1YmtleXMgKi8KKwkvKiByb3VuZCAyICovCisJU1VCTCgzKSBePSBTVUJMKDEpOyBTVUJSKDMpIF49IFNVQlIoMSk7CisJLyogcm91bmQgNCAqLworCVNVQkwoNSkgXj0gU1VCTCgxKTsgU1VCUig1KSBePSBTVUJSKDEpOworCS8qIHJvdW5kIDYgKi8KKwlTVUJMKDcpIF49IFNVQkwoMSk7IFNVQlIoNykgXj0gU1VCUigxKTsKKwlTVUJMKDEpIF49IFNVQlIoMSkgJiB+U1VCUig5KTsKKwlkdyA9IFNVQkwoMSkgJiBTVUJMKDkpLAorCQlTVUJSKDEpIF49IENBTUVMTElBX1JMMShkdyk7IC8qIG1vZGlmaWVkIGZvciBGTGludihrbDIpICovCisJLyogcm91bmQgOCAqLworCVNVQkwoMTEpIF49IFNVQkwoMSk7IFNVQlIoMTEpIF49IFNVQlIoMSk7CisJLyogcm91bmQgMTAgKi8KKwlTVUJMKDEzKSBePSBTVUJMKDEpOyBTVUJSKDEzKSBePSBTVUJSKDEpOworCS8qIHJvdW5kIDEyICovCisJU1VCTCgxNSkgXj0gU1VCTCgxKTsgU1VCUigxNSkgXj0gU1VCUigxKTsKKwlTVUJMKDEpIF49IFNVQlIoMSkgJiB+U1VCUigxNyk7CisJZHcgPSBTVUJMKDEpICYgU1VCTCgxNyksCisJCVNVQlIoMSkgXj0gQ0FNRUxMSUFfUkwxKGR3KTsgLyogbW9kaWZpZWQgZm9yIEZMaW52KGtsNCkgKi8KKwkvKiByb3VuZCAxNCAqLworCVNVQkwoMTkpIF49IFNVQkwoMSk7IFNVQlIoMTkpIF49IFNVQlIoMSk7CisJLyogcm91bmQgMTYgKi8KKwlTVUJMKDIxKSBePSBTVUJMKDEpOyBTVUJSKDIxKSBePSBTVUJSKDEpOworCS8qIHJvdW5kIDE4ICovCisJU1VCTCgyMykgXj0gU1VCTCgxKTsgU1VCUigyMykgXj0gU1VCUigxKTsKKwlTVUJMKDEpIF49IFNVQlIoMSkgJiB+U1VCUigyNSk7CisJZHcgPSBTVUJMKDEpICYgU1VCTCgyNSksCisJCVNVQlIoMSkgXj0gQ0FNRUxMSUFfUkwxKGR3KTsgLyogbW9kaWZpZWQgZm9yIEZMaW52KGtsNikgKi8KKwkvKiByb3VuZCAyMCAqLworCVNVQkwoMjcpIF49IFNVQkwoMSk7IFNVQlIoMjcpIF49IFNVQlIoMSk7CisJLyogcm91bmQgMjIgKi8KKwlTVUJMKDI5KSBePSBTVUJMKDEpOyBTVUJSKDI5KSBePSBTVUJSKDEpOworCS8qIHJvdW5kIDI0ICovCisJU1VCTCgzMSkgXj0gU1VCTCgxKTsgU1VCUigzMSkgXj0gU1VCUigxKTsKKwkvKiBrdzMgKi8KKwlTVUJMKDMyKSBePSBTVUJMKDEpOyBTVUJSKDMyKSBePSBTVUJSKDEpOworCisKKwkvKiBhYnNvcmIga3c0IHRvIG90aGVyIHN1YmtleXMgKi8KKwlrdzRsID0gU1VCTCgzMyk7IGt3NHIgPSBTVUJSKDMzKTsKKwkvKiByb3VuZCAyMyAqLworCVNVQkwoMzApIF49IGt3NGw7IFNVQlIoMzApIF49IGt3NHI7CisJLyogcm91bmQgMjEgKi8KKwlTVUJMKDI4KSBePSBrdzRsOyBTVUJSKDI4KSBePSBrdzRyOworCS8qIHJvdW5kIDE5ICovCisJU1VCTCgyNikgXj0ga3c0bDsgU1VCUigyNikgXj0ga3c0cjsKKwlrdzRsIF49IGt3NHIgJiB+U1VCUigyNCk7CisJZHcgPSBrdzRsICYgU1VCTCgyNCksCisJCWt3NHIgXj0gQ0FNRUxMSUFfUkwxKGR3KTsgLyogbW9kaWZpZWQgZm9yIEZMKGtsNSkgKi8KKwkvKiByb3VuZCAxNyAqLworCVNVQkwoMjIpIF49IGt3NGw7IFNVQlIoMjIpIF49IGt3NHI7CisJLyogcm91bmQgMTUgKi8KKwlTVUJMKDIwKSBePSBrdzRsOyBTVUJSKDIwKSBePSBrdzRyOworCS8qIHJvdW5kIDEzICovCisJU1VCTCgxOCkgXj0ga3c0bDsgU1VCUigxOCkgXj0ga3c0cjsKKwlrdzRsIF49IGt3NHIgJiB+U1VCUigxNik7CisJZHcgPSBrdzRsICYgU1VCTCgxNiksCisJCWt3NHIgXj0gQ0FNRUxMSUFfUkwxKGR3KTsgLyogbW9kaWZpZWQgZm9yIEZMKGtsMykgKi8KKwkvKiByb3VuZCAxMSAqLworCVNVQkwoMTQpIF49IGt3NGw7IFNVQlIoMTQpIF49IGt3NHI7CisJLyogcm91bmQgOSAqLworCVNVQkwoMTIpIF49IGt3NGw7IFNVQlIoMTIpIF49IGt3NHI7CisJLyogcm91bmQgNyAqLworCVNVQkwoMTApIF49IGt3NGw7IFNVQlIoMTApIF49IGt3NHI7CisJa3c0bCBePSBrdzRyICYgflNVQlIoOCk7CisJZHcgPSBrdzRsICYgU1VCTCg4KSwKKwkJa3c0ciBePSBDQU1FTExJQV9STDEoZHcpOyAvKiBtb2RpZmllZCBmb3IgRkwoa2wxKSAqLworCS8qIHJvdW5kIDUgKi8KKwlTVUJMKDYpIF49IGt3NGw7IFNVQlIoNikgXj0ga3c0cjsKKwkvKiByb3VuZCAzICovCisJU1VCTCg0KSBePSBrdzRsOyBTVUJSKDQpIF49IGt3NHI7CisJLyogcm91bmQgMSAqLworCVNVQkwoMikgXj0ga3c0bDsgU1VCUigyKSBePSBrdzRyOworCS8qIGt3MSAqLworCVNVQkwoMCkgXj0ga3c0bDsgU1VCUigwKSBePSBrdzRyOworCisJLyoga2V5IFhPUiBpcyBlbmQgb2YgRi1mdW5jdGlvbiAqLworCUNBTUVMTElBX1NVQktFWV9MKDApID0gU1VCTCgwKSBeIFNVQkwoMik7Lyoga3cxICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMCkgPSBTVUJSKDApIF4gU1VCUigyKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyKSA9IFNVQkwoMyk7ICAgICAgIC8qIHJvdW5kIDEgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyKSA9IFNVQlIoMyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMykgPSBTVUJMKDIpIF4gU1VCTCg0KTsgLyogcm91bmQgMiAqLworCUNBTUVMTElBX1NVQktFWV9SKDMpID0gU1VCUigyKSBeIFNVQlIoNCk7CisJQ0FNRUxMSUFfU1VCS0VZX0woNCkgPSBTVUJMKDMpIF4gU1VCTCg1KTsgLyogcm91bmQgMyAqLworCUNBTUVMTElBX1NVQktFWV9SKDQpID0gU1VCUigzKSBeIFNVQlIoNSk7CisJQ0FNRUxMSUFfU1VCS0VZX0woNSkgPSBTVUJMKDQpIF4gU1VCTCg2KTsgLyogcm91bmQgNCAqLworCUNBTUVMTElBX1NVQktFWV9SKDUpID0gU1VCUig0KSBeIFNVQlIoNik7CisJQ0FNRUxMSUFfU1VCS0VZX0woNikgPSBTVUJMKDUpIF4gU1VCTCg3KTsgLyogcm91bmQgNSAqLworCUNBTUVMTElBX1NVQktFWV9SKDYpID0gU1VCUig1KSBeIFNVQlIoNyk7CisJdGwgPSBTVUJMKDEwKSBeIChTVUJSKDEwKSAmIH5TVUJSKDgpKTsKKwlkdyA9IHRsICYgU1VCTCg4KSwgIC8qIEZMKGtsMSkgKi8KKwkJdHIgPSBTVUJSKDEwKSBeIENBTUVMTElBX1JMMShkdyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woNykgPSBTVUJMKDYpIF4gdGw7IC8qIHJvdW5kIDYgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig3KSA9IFNVQlIoNikgXiB0cjsKKwlDQU1FTExJQV9TVUJLRVlfTCg4KSA9IFNVQkwoOCk7ICAgICAgIC8qIEZMKGtsMSkgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig4KSA9IFNVQlIoOCk7CisJQ0FNRUxMSUFfU1VCS0VZX0woOSkgPSBTVUJMKDkpOyAgICAgICAvKiBGTGludihrbDIpICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoOSkgPSBTVUJSKDkpOworCXRsID0gU1VCTCg3KSBeIChTVUJSKDcpICYgflNVQlIoOSkpOworCWR3ID0gdGwgJiBTVUJMKDkpLCAgLyogRkxpbnYoa2wyKSAqLworCQl0ciA9IFNVQlIoNykgXiBDQU1FTExJQV9STDEoZHcpOworCUNBTUVMTElBX1NVQktFWV9MKDEwKSA9IHRsIF4gU1VCTCgxMSk7IC8qIHJvdW5kIDcgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxMCkgPSB0ciBeIFNVQlIoMTEpOworCUNBTUVMTElBX1NVQktFWV9MKDExKSA9IFNVQkwoMTApIF4gU1VCTCgxMik7IC8qIHJvdW5kIDggKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxMSkgPSBTVUJSKDEwKSBeIFNVQlIoMTIpOworCUNBTUVMTElBX1NVQktFWV9MKDEyKSA9IFNVQkwoMTEpIF4gU1VCTCgxMyk7IC8qIHJvdW5kIDkgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxMikgPSBTVUJSKDExKSBeIFNVQlIoMTMpOworCUNBTUVMTElBX1NVQktFWV9MKDEzKSA9IFNVQkwoMTIpIF4gU1VCTCgxNCk7IC8qIHJvdW5kIDEwICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTMpID0gU1VCUigxMikgXiBTVUJSKDE0KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgxNCkgPSBTVUJMKDEzKSBeIFNVQkwoMTUpOyAvKiByb3VuZCAxMSAqLworCUNBTUVMTElBX1NVQktFWV9SKDE0KSA9IFNVQlIoMTMpIF4gU1VCUigxNSk7CisJdGwgPSBTVUJMKDE4KSBeIChTVUJSKDE4KSAmIH5TVUJSKDE2KSk7CisJZHcgPSB0bCAmIFNVQkwoMTYpLCAvKiBGTChrbDMpICovCisJCXRyID0gU1VCUigxOCkgXiBDQU1FTExJQV9STDEoZHcpOworCUNBTUVMTElBX1NVQktFWV9MKDE1KSA9IFNVQkwoMTQpIF4gdGw7IC8qIHJvdW5kIDEyICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTUpID0gU1VCUigxNCkgXiB0cjsKKwlDQU1FTExJQV9TVUJLRVlfTCgxNikgPSBTVUJMKDE2KTsgICAgIC8qIEZMKGtsMykgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxNikgPSBTVUJSKDE2KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgxNykgPSBTVUJMKDE3KTsgICAgIC8qIEZMaW52KGtsNCkgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxNykgPSBTVUJSKDE3KTsKKwl0bCA9IFNVQkwoMTUpIF4gKFNVQlIoMTUpICYgflNVQlIoMTcpKTsKKwlkdyA9IHRsICYgU1VCTCgxNyksIC8qIEZMaW52KGtsNCkgKi8KKwkJdHIgPSBTVUJSKDE1KSBeIENBTUVMTElBX1JMMShkdyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMTgpID0gdGwgXiBTVUJMKDE5KTsgLyogcm91bmQgMTMgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxOCkgPSB0ciBeIFNVQlIoMTkpOworCUNBTUVMTElBX1NVQktFWV9MKDE5KSA9IFNVQkwoMTgpIF4gU1VCTCgyMCk7IC8qIHJvdW5kIDE0ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTkpID0gU1VCUigxOCkgXiBTVUJSKDIwKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyMCkgPSBTVUJMKDE5KSBeIFNVQkwoMjEpOyAvKiByb3VuZCAxNSAqLworCUNBTUVMTElBX1NVQktFWV9SKDIwKSA9IFNVQlIoMTkpIF4gU1VCUigyMSk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMjEpID0gU1VCTCgyMCkgXiBTVUJMKDIyKTsgLyogcm91bmQgMTYgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMSkgPSBTVUJSKDIwKSBeIFNVQlIoMjIpOworCUNBTUVMTElBX1NVQktFWV9MKDIyKSA9IFNVQkwoMjEpIF4gU1VCTCgyMyk7IC8qIHJvdW5kIDE3ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjIpID0gU1VCUigyMSkgXiBTVUJSKDIzKTsKKwl0bCA9IFNVQkwoMjYpIF4gKFNVQlIoMjYpCisJCQkgJiB+U1VCUigyNCkpOworCWR3ID0gdGwgJiBTVUJMKDI0KSwgLyogRkwoa2w1KSAqLworCQl0ciA9IFNVQlIoMjYpIF4gQ0FNRUxMSUFfUkwxKGR3KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyMykgPSBTVUJMKDIyKSBeIHRsOyAvKiByb3VuZCAxOCAqLworCUNBTUVMTElBX1NVQktFWV9SKDIzKSA9IFNVQlIoMjIpIF4gdHI7CisJQ0FNRUxMSUFfU1VCS0VZX0woMjQpID0gU1VCTCgyNCk7ICAgICAvKiBGTChrbDUpICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjQpID0gU1VCUigyNCk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMjUpID0gU1VCTCgyNSk7ICAgICAvKiBGTGludihrbDYpICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjUpID0gU1VCUigyNSk7CisJdGwgPSBTVUJMKDIzKSBeIChTVUJSKDIzKSAmCisJCQkgflNVQlIoMjUpKTsKKwlkdyA9IHRsICYgU1VCTCgyNSksIC8qIEZMaW52KGtsNikgKi8KKwkJdHIgPSBTVUJSKDIzKSBeIENBTUVMTElBX1JMMShkdyk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMjYpID0gdGwgXiBTVUJMKDI3KTsgLyogcm91bmQgMTkgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyNikgPSB0ciBeIFNVQlIoMjcpOworCUNBTUVMTElBX1NVQktFWV9MKDI3KSA9IFNVQkwoMjYpIF4gU1VCTCgyOCk7IC8qIHJvdW5kIDIwICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjcpID0gU1VCUigyNikgXiBTVUJSKDI4KTsKKwlDQU1FTExJQV9TVUJLRVlfTCgyOCkgPSBTVUJMKDI3KSBeIFNVQkwoMjkpOyAvKiByb3VuZCAyMSAqLworCUNBTUVMTElBX1NVQktFWV9SKDI4KSA9IFNVQlIoMjcpIF4gU1VCUigyOSk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMjkpID0gU1VCTCgyOCkgXiBTVUJMKDMwKTsgLyogcm91bmQgMjIgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyOSkgPSBTVUJSKDI4KSBeIFNVQlIoMzApOworCUNBTUVMTElBX1NVQktFWV9MKDMwKSA9IFNVQkwoMjkpIF4gU1VCTCgzMSk7IC8qIHJvdW5kIDIzICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMzApID0gU1VCUigyOSkgXiBTVUJSKDMxKTsKKwlDQU1FTExJQV9TVUJLRVlfTCgzMSkgPSBTVUJMKDMwKTsgICAgIC8qIHJvdW5kIDI0ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMzEpID0gU1VCUigzMCk7CisJQ0FNRUxMSUFfU1VCS0VZX0woMzIpID0gU1VCTCgzMikgXiBTVUJMKDMxKTsgLyoga3czICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMzIpID0gU1VCUigzMikgXiBTVUJSKDMxKTsKKworCS8qIGFwcGx5IHRoZSBpbnZlcnNlIG9mIHRoZSBsYXN0IGhhbGYgb2YgUC1mdW5jdGlvbiAqLworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMikgXiBDQU1FTExJQV9TVUJLRVlfUigyKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDEgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyKSA9IENBTUVMTElBX1NVQktFWV9MKDIpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDIpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgzKSBeIENBTUVMTElBX1NVQktFWV9SKDMpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMiAqLworCUNBTUVMTElBX1NVQktFWV9SKDMpID0gQ0FNRUxMSUFfU1VCS0VZX0woMykgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMykgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDQpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoNCksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAzICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNCkgPSBDQU1FTExJQV9TVUJLRVlfTCg0KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCg0KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woNSkgXiBDQU1FTExJQV9TVUJLRVlfUig1KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDQgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig1KSA9IENBTUVMTElBX1NVQktFWV9MKDUpIF4gZHcsCisJQ0FNRUxMSUFfU1VCS0VZX0woNSkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDYpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoNiksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCA1ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoNikgPSBDQU1FTExJQV9TVUJLRVlfTCg2KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCg2KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woNykgXiBDQU1FTExJQV9TVUJLRVlfUig3KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDYgKi8KKwlDQU1FTExJQV9TVUJLRVlfUig3KSA9IENBTUVMTElBX1NVQktFWV9MKDcpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDcpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgxMCkgXiBDQU1FTExJQV9TVUJLRVlfUigxMCksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCA3ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTApID0gQ0FNRUxMSUFfU1VCS0VZX0woMTApIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDEwKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMTEpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMTEpLAorCSAgICBkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgOCAqLworCUNBTUVMTElBX1NVQktFWV9SKDExKSA9IENBTUVMTElBX1NVQktFWV9MKDExKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgxMSkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDEyKSBeIENBTUVMTElBX1NVQktFWV9SKDEyKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDkgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxMikgPSBDQU1FTExJQV9TVUJLRVlfTCgxMikgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMTIpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgxMykgXiBDQU1FTExJQV9TVUJLRVlfUigxMyksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxMCAqLworCUNBTUVMTElBX1NVQktFWV9SKDEzKSA9IENBTUVMTElBX1NVQktFWV9MKDEzKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgxMykgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDE0KSBeIENBTUVMTElBX1NVQktFWV9SKDE0KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDExICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTQpID0gQ0FNRUxMSUFfU1VCS0VZX0woMTQpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDE0KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMTUpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMTUpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTIgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigxNSkgPSBDQU1FTExJQV9TVUJLRVlfTCgxNSkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMTUpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgxOCkgXiBDQU1FTExJQV9TVUJLRVlfUigxOCksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxMyAqLworCUNBTUVMTElBX1NVQktFWV9SKDE4KSA9IENBTUVMTElBX1NVQktFWV9MKDE4KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgxOCkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDE5KSBeIENBTUVMTElBX1NVQktFWV9SKDE5KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDE0ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMTkpID0gQ0FNRUxMSUFfU1VCS0VZX0woMTkpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDE5KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMjApIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMjApLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTUgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMCkgPSBDQU1FTExJQV9TVUJLRVlfTCgyMCkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMjApID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyMSkgXiBDQU1FTExJQV9TVUJLRVlfUigyMSksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxNiAqLworCUNBTUVMTElBX1NVQktFWV9SKDIxKSA9IENBTUVMTElBX1NVQktFWV9MKDIxKSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgyMSkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDIyKSBeIENBTUVMTElBX1NVQktFWV9SKDIyKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDE3ICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjIpID0gQ0FNRUxMSUFfU1VCS0VZX0woMjIpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDIyKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMjMpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMjMpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMTggKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyMykgPSBDQU1FTExJQV9TVUJLRVlfTCgyMykgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMjMpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyNikgXiBDQU1FTExJQV9TVUJLRVlfUigyNiksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAxOSAqLworCUNBTUVMTElBX1NVQktFWV9SKDI2KSA9IENBTUVMTElBX1NVQktFWV9MKDI2KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgyNikgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDI3KSBeIENBTUVMTElBX1NVQktFWV9SKDI3KSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDIwICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMjcpID0gQ0FNRUxMSUFfU1VCS0VZX0woMjcpIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDI3KSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMjgpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMjgpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMjEgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigyOCkgPSBDQU1FTExJQV9TVUJLRVlfTCgyOCkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMjgpID0gZHc7CisJZHcgPSBDQU1FTExJQV9TVUJLRVlfTCgyOSkgXiBDQU1FTExJQV9TVUJLRVlfUigyOSksCisJCWR3ID0gQ0FNRUxMSUFfUkw4KGR3KTsvKiByb3VuZCAyMiAqLworCUNBTUVMTElBX1NVQktFWV9SKDI5KSA9IENBTUVMTElBX1NVQktFWV9MKDI5KSBeIGR3LAorCQlDQU1FTExJQV9TVUJLRVlfTCgyOSkgPSBkdzsKKwlkdyA9IENBTUVMTElBX1NVQktFWV9MKDMwKSBeIENBTUVMTElBX1NVQktFWV9SKDMwKSwKKwkJZHcgPSBDQU1FTExJQV9STDgoZHcpOy8qIHJvdW5kIDIzICovCisJQ0FNRUxMSUFfU1VCS0VZX1IoMzApID0gQ0FNRUxMSUFfU1VCS0VZX0woMzApIF4gZHcsCisJCUNBTUVMTElBX1NVQktFWV9MKDMwKSA9IGR3OworCWR3ID0gQ0FNRUxMSUFfU1VCS0VZX0woMzEpIF4gQ0FNRUxMSUFfU1VCS0VZX1IoMzEpLAorCQlkdyA9IENBTUVMTElBX1JMOChkdyk7Lyogcm91bmQgMjQgKi8KKwlDQU1FTExJQV9TVUJLRVlfUigzMSkgPSBDQU1FTExJQV9TVUJLRVlfTCgzMSkgXiBkdywKKwkJQ0FNRUxMSUFfU1VCS0VZX0woMzEpID0gZHc7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNhbWVsbGlhX3NldHVwMTkyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdTMyICpzdWJrZXkpCit7CisJdW5zaWduZWQgY2hhciBra1szMl07CisJdTMyIGtybGwsIGtybHIsIGtycmwsa3JycjsKKworCW1lbWNweShraywga2V5LCAyNCk7CisJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopJmtybGwsIGtleSsxNiw0KTsKKwltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikma3Jsciwga2V5KzIwLDQpOworCWtycmwgPSB+a3JsbDsKKwlrcnJyID0gfmtybHI7CisJbWVtY3B5KGtrKzI0LCAodW5zaWduZWQgY2hhciAqKSZrcnJsLCA0KTsKKwltZW1jcHkoa2srMjgsICh1bnNpZ25lZCBjaGFyICopJmtycnIsIDQpOworCWNhbWVsbGlhX3NldHVwMjU2KGtrLCBzdWJrZXkpOworCXJldHVybjsKK30KKworCisvKioKKyAqIFN0dWZmIHJlbGF0ZWQgdG8gY2FtZWxsaWEgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGNhbWVsbGlhX2VuY3J5cHQxMjgoY29uc3QgdTMyICpzdWJrZXksIF9fYmUzMiAqaW9fdGV4dCkKK3sKKwl1MzIgaWwsaXIsdDAsdDE7ICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhbGlhYmxlcyAqLworCisJdTMyIGlvWzRdOworCisJaW9bMF0gPSBiZTMyX3RvX2NwdShpb190ZXh0WzBdKTsKKwlpb1sxXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbMV0pOworCWlvWzJdID0gYmUzMl90b19jcHUoaW9fdGV4dFsyXSk7CisJaW9bM10gPSBiZTMyX3RvX2NwdShpb190ZXh0WzNdKTsKKworCS8qIHByZSB3aGl0ZW5pbmcgYnV0IGFic29yYiBrdzIqLworCWlvWzBdIF49IENBTUVMTElBX1NVQktFWV9MKDApOworCWlvWzFdIF49IENBTUVMTElBX1NVQktFWV9SKDApOworCS8qIG1haW4gaXRlcmF0aW9uICovCisKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIpLENBTUVMTElBX1NVQktFWV9SKDIpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDMpLENBTUVMTElBX1NVQktFWV9SKDMpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDQpLENBTUVMTElBX1NVQktFWV9SKDQpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDUpLENBTUVMTElBX1NVQktFWV9SKDUpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDYpLENBTUVMTElBX1NVQktFWV9SKDYpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDcpLENBTUVMTElBX1NVQktFWV9SKDcpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworCUNBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCg4KSxDQU1FTExJQV9TVUJLRVlfUig4KSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCg5KSxDQU1FTExJQV9TVUJLRVlfUig5KSwKKwkJICAgICB0MCx0MSxpbCxpcik7CisKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDEwKSxDQU1FTExJQV9TVUJLRVlfUigxMCksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTEpLENBTUVMTElBX1NVQktFWV9SKDExKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxMiksQ0FNRUxMSUFfU1VCS0VZX1IoMTIpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDEzKSxDQU1FTExJQV9TVUJLRVlfUigxMyksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTQpLENBTUVMTElBX1NVQktFWV9SKDE0KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxNSksQ0FNRUxMSUFfU1VCS0VZX1IoMTUpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworCUNBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCgxNiksQ0FNRUxMSUFfU1VCS0VZX1IoMTYpLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDE3KSxDQU1FTExJQV9TVUJLRVlfUigxNyksCisJCSAgICAgdDAsdDEsaWwsaXIpOworCisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxOCksQ0FNRUxMSUFfU1VCS0VZX1IoMTgpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDE5KSxDQU1FTExJQV9TVUJLRVlfUigxOSksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjApLENBTUVMTElBX1NVQktFWV9SKDIwKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMSksQ0FNRUxMSUFfU1VCS0VZX1IoMjEpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIyKSxDQU1FTExJQV9TVUJLRVlfUigyMiksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjMpLENBTUVMTElBX1NVQktFWV9SKDIzKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKwkvKiBwb3N0IHdoaXRlbmluZyBidXQga3c0ICovCisJaW9bMl0gXj0gQ0FNRUxMSUFfU1VCS0VZX0woMjQpOworCWlvWzNdIF49IENBTUVMTElBX1NVQktFWV9SKDI0KTsKKworCXQwID0gaW9bMF07CisJdDEgPSBpb1sxXTsKKwlpb1swXSA9IGlvWzJdOworCWlvWzFdID0gaW9bM107CisJaW9bMl0gPSB0MDsKKwlpb1szXSA9IHQxOworCisJaW9fdGV4dFswXSA9IGNwdV90b19iZTMyKGlvWzBdKTsKKwlpb190ZXh0WzFdID0gY3B1X3RvX2JlMzIoaW9bMV0pOworCWlvX3RleHRbMl0gPSBjcHVfdG9fYmUzMihpb1syXSk7CisJaW9fdGV4dFszXSA9IGNwdV90b19iZTMyKGlvWzNdKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2FtZWxsaWFfZGVjcnlwdDEyOChjb25zdCB1MzIgKnN1YmtleSwgX19iZTMyICppb190ZXh0KQoreworCXUzMiBpbCxpcix0MCx0MTsgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFsaWFibGVzICovCisKKwl1MzIgaW9bNF07CisKKwlpb1swXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbMF0pOworCWlvWzFdID0gYmUzMl90b19jcHUoaW9fdGV4dFsxXSk7CisJaW9bMl0gPSBiZTMyX3RvX2NwdShpb190ZXh0WzJdKTsKKwlpb1szXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbM10pOworCisJLyogcHJlIHdoaXRlbmluZyBidXQgYWJzb3JiIGt3MiovCisJaW9bMF0gXj0gQ0FNRUxMSUFfU1VCS0VZX0woMjQpOworCWlvWzFdIF49IENBTUVMTElBX1NVQktFWV9SKDI0KTsKKworCS8qIG1haW4gaXRlcmF0aW9uICovCisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMyksQ0FNRUxMSUFfU1VCS0VZX1IoMjMpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIyKSxDQU1FTExJQV9TVUJLRVlfUigyMiksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjEpLENBTUVMTElBX1NVQktFWV9SKDIxKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMCksQ0FNRUxMSUFfU1VCS0VZX1IoMjApLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDE5KSxDQU1FTExJQV9TVUJLRVlfUigxOSksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTgpLENBTUVMTElBX1NVQktFWV9SKDE4KSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKwlDQU1FTExJQV9GTFMoaW9bMF0saW9bMV0saW9bMl0saW9bM10sCisJCSAgICAgQ0FNRUxMSUFfU1VCS0VZX0woMTcpLENBTUVMTElBX1NVQktFWV9SKDE3KSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCgxNiksQ0FNRUxMSUFfU1VCS0VZX1IoMTYpLAorCQkgICAgIHQwLHQxLGlsLGlyKTsKKworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTUpLENBTUVMTElBX1NVQktFWV9SKDE1KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxNCksQ0FNRUxMSUFfU1VCS0VZX1IoMTQpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDEzKSxDQU1FTExJQV9TVUJLRVlfUigxMyksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTIpLENBTUVMTElBX1NVQktFWV9SKDEyKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxMSksQ0FNRUxMSUFfU1VCS0VZX1IoMTEpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDEwKSxDQU1FTExJQV9TVUJLRVlfUigxMCksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisJQ0FNRUxMSUFfRkxTKGlvWzBdLGlvWzFdLGlvWzJdLGlvWzNdLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDkpLENBTUVMTElBX1NVQktFWV9SKDkpLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDgpLENBTUVMTElBX1NVQktFWV9SKDgpLAorCQkgICAgIHQwLHQxLGlsLGlyKTsKKworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNyksQ0FNRUxMSUFfU1VCS0VZX1IoNyksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNiksQ0FNRUxMSUFfU1VCS0VZX1IoNiksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNSksQ0FNRUxMSUFfU1VCS0VZX1IoNSksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNCksQ0FNRUxMSUFfU1VCS0VZX1IoNCksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMyksQ0FNRUxMSUFfU1VCS0VZX1IoMyksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMiksQ0FNRUxMSUFfU1VCS0VZX1IoMiksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisJLyogcG9zdCB3aGl0ZW5pbmcgYnV0IGt3NCAqLworCWlvWzJdIF49IENBTUVMTElBX1NVQktFWV9MKDApOworCWlvWzNdIF49IENBTUVMTElBX1NVQktFWV9SKDApOworCisJdDAgPSBpb1swXTsKKwl0MSA9IGlvWzFdOworCWlvWzBdID0gaW9bMl07CisJaW9bMV0gPSBpb1szXTsKKwlpb1syXSA9IHQwOworCWlvWzNdID0gdDE7CisKKwlpb190ZXh0WzBdID0gY3B1X3RvX2JlMzIoaW9bMF0pOworCWlvX3RleHRbMV0gPSBjcHVfdG9fYmUzMihpb1sxXSk7CisJaW9fdGV4dFsyXSA9IGNwdV90b19iZTMyKGlvWzJdKTsKKwlpb190ZXh0WzNdID0gY3B1X3RvX2JlMzIoaW9bM10pOworCisJcmV0dXJuOworfQorCisKKy8qKgorICogc3R1ZmYgZm9yIDE5MiBhbmQgMjU2Yml0IGVuY3J5cHRpb24vZGVjcnlwdGlvbgorICovCitzdGF0aWMgdm9pZCBjYW1lbGxpYV9lbmNyeXB0MjU2KGNvbnN0IHUzMiAqc3Via2V5LCBfX2JlMzIgKmlvX3RleHQpCit7CisJdTMyIGlsLGlyLHQwLHQxOyAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhbGlhYmxlcyAqLworCisJdTMyIGlvWzRdOworCisJaW9bMF0gPSBiZTMyX3RvX2NwdShpb190ZXh0WzBdKTsKKwlpb1sxXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbMV0pOworCWlvWzJdID0gYmUzMl90b19jcHUoaW9fdGV4dFsyXSk7CisJaW9bM10gPSBiZTMyX3RvX2NwdShpb190ZXh0WzNdKTsKKworCS8qIHByZSB3aGl0ZW5pbmcgYnV0IGFic29yYiBrdzIqLworCWlvWzBdIF49IENBTUVMTElBX1NVQktFWV9MKDApOworCWlvWzFdIF49IENBTUVMTElBX1NVQktFWV9SKDApOworCisJLyogbWFpbiBpdGVyYXRpb24gKi8KKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIpLENBTUVMTElBX1NVQktFWV9SKDIpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDMpLENBTUVMTElBX1NVQktFWV9SKDMpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDQpLENBTUVMTElBX1NVQktFWV9SKDQpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDUpLENBTUVMTElBX1NVQktFWV9SKDUpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDYpLENBTUVMTElBX1NVQktFWV9SKDYpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDcpLENBTUVMTElBX1NVQktFWV9SKDcpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworCUNBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCg4KSxDQU1FTExJQV9TVUJLRVlfUig4KSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCg5KSxDQU1FTExJQV9TVUJLRVlfUig5KSwKKwkJICAgICB0MCx0MSxpbCxpcik7CisKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDEwKSxDQU1FTExJQV9TVUJLRVlfUigxMCksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTEpLENBTUVMTElBX1NVQktFWV9SKDExKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxMiksQ0FNRUxMSUFfU1VCS0VZX1IoMTIpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDEzKSxDQU1FTExJQV9TVUJLRVlfUigxMyksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTQpLENBTUVMTElBX1NVQktFWV9SKDE0KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxNSksQ0FNRUxMSUFfU1VCS0VZX1IoMTUpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworCUNBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCgxNiksQ0FNRUxMSUFfU1VCS0VZX1IoMTYpLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDE3KSxDQU1FTExJQV9TVUJLRVlfUigxNyksCisJCSAgICAgdDAsdDEsaWwsaXIpOworCisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxOCksQ0FNRUxMSUFfU1VCS0VZX1IoMTgpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDE5KSxDQU1FTExJQV9TVUJLRVlfUigxOSksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjApLENBTUVMTElBX1NVQktFWV9SKDIwKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMSksQ0FNRUxMSUFfU1VCS0VZX1IoMjEpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIyKSxDQU1FTExJQV9TVUJLRVlfUigyMiksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjMpLENBTUVMTElBX1NVQktFWV9SKDIzKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKwlDQU1FTExJQV9GTFMoaW9bMF0saW9bMV0saW9bMl0saW9bM10sCisJCSAgICAgQ0FNRUxMSUFfU1VCS0VZX0woMjQpLENBTUVMTElBX1NVQktFWV9SKDI0KSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCgyNSksQ0FNRUxMSUFfU1VCS0VZX1IoMjUpLAorCQkgICAgIHQwLHQxLGlsLGlyKTsKKworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjYpLENBTUVMTElBX1NVQktFWV9SKDI2KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyNyksQ0FNRUxMSUFfU1VCS0VZX1IoMjcpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDI4KSxDQU1FTExJQV9TVUJLRVlfUigyOCksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjkpLENBTUVMTElBX1NVQktFWV9SKDI5KSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgzMCksQ0FNRUxMSUFfU1VCS0VZX1IoMzApLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDMxKSxDQU1FTExJQV9TVUJLRVlfUigzMSksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisJLyogcG9zdCB3aGl0ZW5pbmcgYnV0IGt3NCAqLworCWlvWzJdIF49IENBTUVMTElBX1NVQktFWV9MKDMyKTsKKwlpb1szXSBePSBDQU1FTExJQV9TVUJLRVlfUigzMik7CisKKwl0MCA9IGlvWzBdOworCXQxID0gaW9bMV07CisJaW9bMF0gPSBpb1syXTsKKwlpb1sxXSA9IGlvWzNdOworCWlvWzJdID0gdDA7CisJaW9bM10gPSB0MTsKKworCWlvX3RleHRbMF0gPSBjcHVfdG9fYmUzMihpb1swXSk7CisJaW9fdGV4dFsxXSA9IGNwdV90b19iZTMyKGlvWzFdKTsKKwlpb190ZXh0WzJdID0gY3B1X3RvX2JlMzIoaW9bMl0pOworCWlvX3RleHRbM10gPSBjcHVfdG9fYmUzMihpb1szXSk7CisKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgY2FtZWxsaWFfZGVjcnlwdDI1Nihjb25zdCB1MzIgKnN1YmtleSwgX19iZTMyICppb190ZXh0KQoreworCXUzMiBpbCxpcix0MCx0MTsgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YWxpYWJsZXMgKi8KKworCXUzMiBpb1s0XTsKKworCWlvWzBdID0gYmUzMl90b19jcHUoaW9fdGV4dFswXSk7CisJaW9bMV0gPSBiZTMyX3RvX2NwdShpb190ZXh0WzFdKTsKKwlpb1syXSA9IGJlMzJfdG9fY3B1KGlvX3RleHRbMl0pOworCWlvWzNdID0gYmUzMl90b19jcHUoaW9fdGV4dFszXSk7CisKKwkvKiBwcmUgd2hpdGVuaW5nIGJ1dCBhYnNvcmIga3cyKi8KKwlpb1swXSBePSBDQU1FTExJQV9TVUJLRVlfTCgzMik7CisJaW9bMV0gXj0gQ0FNRUxMSUFfU1VCS0VZX1IoMzIpOworCisJLyogbWFpbiBpdGVyYXRpb24gKi8KKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDMxKSxDQU1FTExJQV9TVUJLRVlfUigzMSksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMzApLENBTUVMTElBX1NVQktFWV9SKDMwKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyOSksQ0FNRUxMSUFfU1VCS0VZX1IoMjkpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDI4KSxDQU1FTExJQV9TVUJLRVlfUigyOCksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjcpLENBTUVMTElBX1NVQktFWV9SKDI3KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyNiksQ0FNRUxMSUFfU1VCS0VZX1IoMjYpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKworCUNBTUVMTElBX0ZMUyhpb1swXSxpb1sxXSxpb1syXSxpb1szXSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCgyNSksQ0FNRUxMSUFfU1VCS0VZX1IoMjUpLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDI0KSxDQU1FTExJQV9TVUJLRVlfUigyNCksCisJCSAgICAgdDAsdDEsaWwsaXIpOworCisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMyksQ0FNRUxMSUFfU1VCS0VZX1IoMjMpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDIyKSxDQU1FTExJQV9TVUJLRVlfUigyMiksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMjEpLENBTUVMTElBX1NVQktFWV9SKDIxKSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgyMCksQ0FNRUxMSUFfU1VCS0VZX1IoMjApLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDE5KSxDQU1FTExJQV9TVUJLRVlfUigxOSksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTgpLENBTUVMTElBX1NVQktFWV9SKDE4KSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisKKwlDQU1FTExJQV9GTFMoaW9bMF0saW9bMV0saW9bMl0saW9bM10sCisJCSAgICAgQ0FNRUxMSUFfU1VCS0VZX0woMTcpLENBTUVMTElBX1NVQktFWV9SKDE3KSwKKwkJICAgICBDQU1FTExJQV9TVUJLRVlfTCgxNiksQ0FNRUxMSUFfU1VCS0VZX1IoMTYpLAorCQkgICAgIHQwLHQxLGlsLGlyKTsKKworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTUpLENBTUVMTElBX1NVQktFWV9SKDE1KSwKKwkJCSBpb1syXSxpb1szXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1syXSxpb1szXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxNCksQ0FNRUxMSUFfU1VCS0VZX1IoMTQpLAorCQkJIGlvWzBdLGlvWzFdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzBdLGlvWzFdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDEzKSxDQU1FTExJQV9TVUJLRVlfUigxMyksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMTIpLENBTUVMTElBX1NVQktFWV9SKDEyKSwKKwkJCSBpb1swXSxpb1sxXSxpbCxpcix0MCx0MSk7CisJQ0FNRUxMSUFfUk9VTkRTTShpb1swXSxpb1sxXSwKKwkJCSBDQU1FTExJQV9TVUJLRVlfTCgxMSksQ0FNRUxMSUFfU1VCS0VZX1IoMTEpLAorCQkJIGlvWzJdLGlvWzNdLGlsLGlyLHQwLHQxKTsKKwlDQU1FTExJQV9ST1VORFNNKGlvWzJdLGlvWzNdLAorCQkJIENBTUVMTElBX1NVQktFWV9MKDEwKSxDQU1FTExJQV9TVUJLRVlfUigxMCksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisJQ0FNRUxMSUFfRkxTKGlvWzBdLGlvWzFdLGlvWzJdLGlvWzNdLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDkpLENBTUVMTElBX1NVQktFWV9SKDkpLAorCQkgICAgIENBTUVMTElBX1NVQktFWV9MKDgpLENBTUVMTElBX1NVQktFWV9SKDgpLAorCQkgICAgIHQwLHQxLGlsLGlyKTsKKworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNyksQ0FNRUxMSUFfU1VCS0VZX1IoNyksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNiksQ0FNRUxMSUFfU1VCS0VZX1IoNiksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNSksQ0FNRUxMSUFfU1VCS0VZX1IoNSksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woNCksQ0FNRUxMSUFfU1VCS0VZX1IoNCksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMF0saW9bMV0sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMyksQ0FNRUxMSUFfU1VCS0VZX1IoMyksCisJCQkgaW9bMl0saW9bM10saWwsaXIsdDAsdDEpOworCUNBTUVMTElBX1JPVU5EU00oaW9bMl0saW9bM10sCisJCQkgQ0FNRUxMSUFfU1VCS0VZX0woMiksQ0FNRUxMSUFfU1VCS0VZX1IoMiksCisJCQkgaW9bMF0saW9bMV0saWwsaXIsdDAsdDEpOworCisJLyogcG9zdCB3aGl0ZW5pbmcgYnV0IGt3NCAqLworCWlvWzJdIF49IENBTUVMTElBX1NVQktFWV9MKDApOworCWlvWzNdIF49IENBTUVMTElBX1NVQktFWV9SKDApOworCisJdDAgPSBpb1swXTsKKwl0MSA9IGlvWzFdOworCWlvWzBdID0gaW9bMl07CisJaW9bMV0gPSBpb1szXTsKKwlpb1syXSA9IHQwOworCWlvWzNdID0gdDE7CisKKwlpb190ZXh0WzBdID0gY3B1X3RvX2JlMzIoaW9bMF0pOworCWlvX3RleHRbMV0gPSBjcHVfdG9fYmUzMihpb1sxXSk7CisJaW9fdGV4dFsyXSA9IGNwdV90b19iZTMyKGlvWzJdKTsKKwlpb190ZXh0WzNdID0gY3B1X3RvX2JlMzIoaW9bM10pOworCisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQKK2NhbWVsbGlhX3NldF9rZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmluX2tleSwKKwkJIHVuc2lnbmVkIGludCBrZXlfbGVuKQoreworCXN0cnVjdCBjYW1lbGxpYV9jdHggKmNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopaW5fa2V5OworCXUzMiAqZmxhZ3MgPSAmdGZtLT5jcnRfZmxhZ3M7CisKKwlpZiAoa2V5X2xlbiAhPSAxNiAmJiBrZXlfbGVuICE9IDI0ICYmIGtleV9sZW4gIT0gMzIpIHsKKwkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljY3R4LT5rZXlfbGVuZ3RoID0ga2V5X2xlbjsKKworCXN3aXRjaChrZXlfbGVuKSB7CisJY2FzZSAxNjoKKwkJY2FtZWxsaWFfc2V0dXAxMjgoa2V5LCBjY3R4LT5rZXlfdGFibGUpOworCQlicmVhazsKKwljYXNlIDI0OgorCQljYW1lbGxpYV9zZXR1cDE5MihrZXksIGNjdHgtPmtleV90YWJsZSk7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWNhbWVsbGlhX3NldHVwMjU2KGtleSwgY2N0eC0+a2V5X3RhYmxlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgY2FtZWxsaWFfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCit7CisJY29uc3Qgc3RydWN0IGNhbWVsbGlhX2N0eCAqY2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJY29uc3QgX19iZTMyICpzcmMgPSAoY29uc3QgX19iZTMyICopaW47CisJX19iZTMyICpkc3QgPSAoX19iZTMyICopb3V0OworCisJX19iZTMyIHRtcFs0XTsKKworCW1lbWNweSh0bXAsIHNyYywgQ0FNRUxMSUFfQkxPQ0tfU0laRSk7CisKKwlzd2l0Y2ggKGNjdHgtPmtleV9sZW5ndGgpIHsKKwljYXNlIDE2OgorCQljYW1lbGxpYV9lbmNyeXB0MTI4KGNjdHgtPmtleV90YWJsZSwgdG1wKTsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAzMjoKKwkJY2FtZWxsaWFfZW5jcnlwdDI1NihjY3R4LT5rZXlfdGFibGUsIHRtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCW1lbWNweShkc3QsIHRtcCwgQ0FNRUxMSUFfQkxPQ0tfU0laRSk7Cit9CisKKworc3RhdGljIHZvaWQgY2FtZWxsaWFfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCit7CisJY29uc3Qgc3RydWN0IGNhbWVsbGlhX2N0eCAqY2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJY29uc3QgX19iZTMyICpzcmMgPSAoY29uc3QgX19iZTMyICopaW47CisJX19iZTMyICpkc3QgPSAoX19iZTMyICopb3V0OworCisJX19iZTMyIHRtcFs0XTsKKworCW1lbWNweSh0bXAsIHNyYywgQ0FNRUxMSUFfQkxPQ0tfU0laRSk7CisKKwlzd2l0Y2ggKGNjdHgtPmtleV9sZW5ndGgpIHsKKwljYXNlIDE2OgorCQljYW1lbGxpYV9kZWNyeXB0MTI4KGNjdHgtPmtleV90YWJsZSwgdG1wKTsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAzMjoKKwkJY2FtZWxsaWFfZGVjcnlwdDI1NihjY3R4LT5rZXlfdGFibGUsIHRtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCW1lbWNweShkc3QsIHRtcCwgQ0FNRUxMSUFfQkxPQ0tfU0laRSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGNhbWVsbGlhX2FsZyA9IHsKKwkuY3JhX25hbWUJCT0JImNhbWVsbGlhIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0JImNhbWVsbGlhLWdlbmVyaWMiLAorCS5jcmFfcHJpb3JpdHkJCT0JMTAwLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlDQU1FTExJQV9CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGNhbWVsbGlhX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMywKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoY2FtZWxsaWFfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UJCQk9CXsKKwkJLmNpcGhlciA9IHsKKwkJCS5jaWFfbWluX2tleXNpemUJPQlDQU1FTExJQV9NSU5fS0VZX1NJWkUsCisJCQkuY2lhX21heF9rZXlzaXplCT0JQ0FNRUxMSUFfTUFYX0tFWV9TSVpFLAorCQkJLmNpYV9zZXRrZXkJCT0JY2FtZWxsaWFfc2V0X2tleSwKKwkJCS5jaWFfZW5jcnlwdAkJPQljYW1lbGxpYV9lbmNyeXB0LAorCQkJLmNpYV9kZWNyeXB0CQk9CWNhbWVsbGlhX2RlY3J5cHQKKwkJfQorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNhbWVsbGlhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY2FtZWxsaWFfYWxnKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2FtZWxsaWFfZmluaSh2b2lkKQoreworCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY2FtZWxsaWFfYWxnKTsKK30KKworCittb2R1bGVfaW5pdChjYW1lbGxpYV9pbml0KTsKK21vZHVsZV9leGl0KGNhbWVsbGlhX2ZpbmkpOworCisKK01PRFVMRV9ERVNDUklQVElPTigiQ2FtZWxsaWEgQ2lwaGVyIEFsZ29yaXRobSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NiYy5jIGIvY3J5cHRvL2NiYy5jCmluZGV4IGY1NTQyYjQuLjEzNmZlYTcgMTAwNjQ0Ci0tLSBhL2NyeXB0by9jYmMuYworKysgYi9jcnlwdG8vY2JjLmMKQEAgLTI0Myw2ICsyNDMsNyBAQAogCXN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QgPSAodm9pZCAqKXRmbS0+X19jcnRfYWxnOwogCXN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduID0gY3J5cHRvX2luc3RhbmNlX2N0eChpbnN0KTsKIAlzdHJ1Y3QgY3J5cHRvX2NiY19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKmNpcGhlcjsKIAogCXN3aXRjaCAoY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpIHsKIAljYXNlIDg6CkBAIC0yNjAsMTEgKzI2MSwxMSBAQAogCQkJY3R4LT54b3IgPSB4b3JfcXVhZDsKIAl9CiAKLQl0Zm0gPSBjcnlwdG9fc3Bhd25fdGZtKHNwYXduKTsKLQlpZiAoSVNfRVJSKHRmbSkpCi0JCXJldHVybiBQVFJfRVJSKHRmbSk7CisJY2lwaGVyID0gY3J5cHRvX3NwYXduX2NpcGhlcihzcGF3bik7CisJaWYgKElTX0VSUihjaXBoZXIpKQorCQlyZXR1cm4gUFRSX0VSUihjaXBoZXIpOwogCi0JY3R4LT5jaGlsZCA9IGNyeXB0b19jaXBoZXJfY2FzdCh0Zm0pOworCWN0eC0+Y2hpbGQgPSBjaXBoZXI7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9jaXBoZXIuYyBiL2NyeXB0by9jaXBoZXIuYwppbmRleCA5ZTAzNzAxLi4zMzNhYWIyIDEwMDY0NAotLS0gYS9jcnlwdG8vY2lwaGVyLmMKKysrIGIvY3J5cHRvL2NpcGhlci5jCkBAIC0xMiwyNzQgKzEyLDEzIEBACiAgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAic2NhdHRlcndhbGsuaCIKLQotc3RydWN0IGNpcGhlcl9hbGdfY29tcGF0IHsKLQl1bnNpZ25lZCBpbnQgY2lhX21pbl9rZXlzaXplOwotCXVuc2lnbmVkIGludCBjaWFfbWF4X2tleXNpemU7Ci0JaW50ICgqY2lhX3NldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKLQkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKTsKLQl2b2lkICgqY2lhX2VuY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwotCXZvaWQgKCpjaWFfZGVjcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Ci0KLQl1bnNpZ25lZCBpbnQgKCpjaWFfZW5jcnlwdF9lY2IpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcyk7Ci0JdW5zaWduZWQgaW50ICgqY2lhX2RlY3J5cHRfZWNiKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCi0JCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpOwotCXVuc2lnbmVkIGludCAoKmNpYV9lbmNyeXB0X2NiYykoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAotCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKLQl1bnNpZ25lZCBpbnQgKCpjaWFfZGVjcnlwdF9jYmMpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcyk7Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgeG9yXzY0KHU4ICphLCBjb25zdCB1OCAqYikKLXsKLQkoKHUzMiAqKWEpWzBdIF49ICgodTMyICopYilbMF07Ci0JKCh1MzIgKilhKVsxXSBePSAoKHUzMiAqKWIpWzFdOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgeG9yXzEyOCh1OCAqYSwgY29uc3QgdTggKmIpCi17Ci0JKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOwotCSgodTMyICopYSlbMV0gXj0gKCh1MzIgKiliKVsxXTsKLQkoKHUzMiAqKWEpWzJdIF49ICgodTMyICopYilbMl07Ci0JKCh1MzIgKilhKVszXSBePSAoKHUzMiAqKWIpWzNdOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0X3Nsb3coY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAotCQkJICAgICAgIHN0cnVjdCBzY2F0dGVyX3dhbGsgKmluLAotCQkJICAgICAgIHN0cnVjdCBzY2F0dGVyX3dhbGsgKm91dCwgdW5zaWduZWQgaW50IGJzaXplKQotewotCXVuc2lnbmVkIGxvbmcgYWxpZ25tYXNrID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKGRlc2MtPnRmbSk7Ci0JdTggYnVmZmVyW2JzaXplICogMiArIGFsaWdubWFza107Ci0JdTggKnNyYyA9ICh1OCAqKUFMSUdOKCh1bnNpZ25lZCBsb25nKWJ1ZmZlciwgYWxpZ25tYXNrICsgMSk7Ci0JdTggKmRzdCA9IHNyYyArIGJzaXplOwotCi0Jc2NhdHRlcndhbGtfY29weWNodW5rcyhzcmMsIGluLCBic2l6ZSwgMCk7Ci0JZGVzYy0+cHJmbihkZXNjLCBkc3QsIHNyYywgYnNpemUpOwotCXNjYXR0ZXJ3YWxrX2NvcHljaHVua3MoZHN0LCBvdXQsIGJzaXplLCAxKTsKLQotCXJldHVybiBic2l6ZTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRfZmFzdChjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCQkJICAgICAgc3RydWN0IHNjYXR0ZXJfd2FsayAqaW4sCi0JCQkJICAgICAgc3RydWN0IHNjYXR0ZXJfd2FsayAqb3V0LAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICp0bXApCi17Ci0JdTggKnNyYywgKmRzdDsKLQl1OCAqcmVhbF9zcmMsICpyZWFsX2RzdDsKLQotCXJlYWxfc3JjID0gc2NhdHRlcndhbGtfbWFwKGluLCAwKTsKLQlyZWFsX2RzdCA9IHNjYXR0ZXJ3YWxrX21hcChvdXQsIDEpOwotCi0Jc3JjID0gcmVhbF9zcmM7Ci0JZHN0ID0gc2NhdHRlcndhbGtfc2FtZWJ1Zihpbiwgb3V0KSA/IHNyYyA6IHJlYWxfZHN0OwotCi0JaWYgKHRtcCkgewotCQltZW1jcHkodG1wLCBzcmMsIG5ieXRlcyk7Ci0JCXNyYyA9IHRtcDsKLQkJZHN0ID0gdG1wOwotCX0KLQotCW5ieXRlcyA9IGRlc2MtPnByZm4oZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0KLQlpZiAodG1wKQotCQltZW1jcHkocmVhbF9kc3QsIHRtcCwgbmJ5dGVzKTsKLQotCXNjYXR0ZXJ3YWxrX3VubWFwKHJlYWxfc3JjLCAwKTsKLQlzY2F0dGVyd2Fsa191bm1hcChyZWFsX2RzdCwgMSk7Ci0KLQlzY2F0dGVyd2Fsa19hZHZhbmNlKGluLCBuYnl0ZXMpOwotCXNjYXR0ZXJ3YWxrX2FkdmFuY2Uob3V0LCBuYnl0ZXMpOwotCi0JcmV0dXJuIG5ieXRlczsKLX0KLQotLyogCi0gKiBHZW5lcmljIGVuY3J5cHQvZGVjcnlwdCB3cmFwcGVyIGZvciBjaXBoZXJzLCBoYW5kbGVzIG9wZXJhdGlvbnMgYWNyb3NzCi0gKiBtdWx0aXBsZSBwYWdlIGJvdW5kYXJpZXMgYnkgdXNpbmcgdGVtcG9yYXJ5IGJsb2Nrcy4gIEluIHVzZXIgY29udGV4dCwKLSAqIHRoZSBrZXJuZWwgaXMgZ2l2ZW4gYSBjaGFuY2UgdG8gc2NoZWR1bGUgdXMgb25jZSBwZXIgcGFnZS4KLSAqLwotc3RhdGljIGludCBjcnlwdChjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlzdHJ1Y3Qgc2NhdHRlcl93YWxrIHdhbGtfaW4sIHdhbGtfb3V0OwotCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07Ci0JY29uc3QgdW5zaWduZWQgaW50IGJzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7Ci0JdW5zaWduZWQgaW50IGFsaWdubWFzayA9IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayh0Zm0pOwotCXVuc2lnbmVkIGxvbmcgYnVmZmVyID0gMDsKLQotCWlmICghbmJ5dGVzKQotCQlyZXR1cm4gMDsKLQotCWlmIChuYnl0ZXMgJSBic2l6ZSkgewotCQl0Zm0tPmNydF9mbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfQkxPQ0tfTEVOOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzY2F0dGVyd2Fsa19zdGFydCgmd2Fsa19pbiwgc3JjKTsKLQlzY2F0dGVyd2Fsa19zdGFydCgmd2Fsa19vdXQsIGRzdCk7Ci0KLQlmb3IoOzspIHsKLQkJdW5zaWduZWQgaW50IG4gPSBuYnl0ZXM7Ci0JCXU4ICp0bXAgPSBOVUxMOwotCi0JCWlmICghc2NhdHRlcndhbGtfYWxpZ25lZCgmd2Fsa19pbiwgYWxpZ25tYXNrKSB8fAotCQkgICAgIXNjYXR0ZXJ3YWxrX2FsaWduZWQoJndhbGtfb3V0LCBhbGlnbm1hc2spKSB7Ci0JCQlpZiAoIWJ1ZmZlcikgewotCQkJCWJ1ZmZlciA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKLQkJCQlpZiAoIWJ1ZmZlcikKLQkJCQkJbiA9IDA7Ci0JCQl9Ci0JCQl0bXAgPSAodTggKilidWZmZXI7Ci0JCX0KLQotCQluID0gc2NhdHRlcndhbGtfY2xhbXAoJndhbGtfaW4sIG4pOwotCQluID0gc2NhdHRlcndhbGtfY2xhbXAoJndhbGtfb3V0LCBuKTsKLQotCQlpZiAobGlrZWx5KG4gPj0gYnNpemUpKQotCQkJbiA9IGNyeXB0X2Zhc3QoZGVzYywgJndhbGtfaW4sICZ3YWxrX291dCwgbiwgdG1wKTsKLQkJZWxzZQotCQkJbiA9IGNyeXB0X3Nsb3coZGVzYywgJndhbGtfaW4sICZ3YWxrX291dCwgYnNpemUpOwotCi0JCW5ieXRlcyAtPSBuOwotCi0JCXNjYXR0ZXJ3YWxrX2RvbmUoJndhbGtfaW4sIDAsIG5ieXRlcyk7Ci0JCXNjYXR0ZXJ3YWxrX2RvbmUoJndhbGtfb3V0LCAxLCBuYnl0ZXMpOwotCi0JCWlmICghbmJ5dGVzKQotCQkJYnJlYWs7Ci0KLQkJY3J5cHRvX3lpZWxkKHRmbS0+Y3J0X2ZsYWdzKTsKLQl9Ci0KLQlpZiAoYnVmZmVyKQotCQlmcmVlX3BhZ2UoYnVmZmVyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNyeXB0X2l2X3VuYWxpZ25lZChzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGVzYy0+dGZtOwotCXVuc2lnbmVkIGxvbmcgYWxpZ25tYXNrID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKHRmbSk7Ci0JdTggKml2ID0gZGVzYy0+aW5mbzsKLQotCWlmICh1bmxpa2VseSgoKHVuc2lnbmVkIGxvbmcpaXYgJiBhbGlnbm1hc2spKSkgewotCQl1bnNpZ25lZCBpbnQgaXZzaXplID0gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdnNpemU7Ci0JCXU4IGJ1ZmZlcltpdnNpemUgKyBhbGlnbm1hc2tdOwotCQl1OCAqdG1wID0gKHU4ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCBhbGlnbm1hc2sgKyAxKTsKLQkJaW50IGVycjsKLQotCQlkZXNjLT5pbmZvID0gbWVtY3B5KHRtcCwgaXYsIGl2c2l6ZSk7Ci0JCWVyciA9IGNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwotCQltZW1jcHkoaXYsIHRtcCwgaXZzaXplKTsKLQotCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiBjcnlwdChkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjYmNfcHJvY2Vzc19lbmNyeXB0KGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGVzYy0+dGZtOwotCXZvaWQgKCp4b3IpKHU4ICosIGNvbnN0IHU4ICopID0gdGZtLT5jcnRfdS5jaXBoZXIuY2l0X3hvcl9ibG9jazsKLQlpbnQgYnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKLQotCXZvaWQgKCpmbikoc3RydWN0IGNyeXB0b190Zm0gKiwgdTggKiwgY29uc3QgdTggKikgPSBkZXNjLT5jcmZuOwotCXU4ICppdiA9IGRlc2MtPmluZm87Ci0JdW5zaWduZWQgaW50IGRvbmUgPSAwOwotCi0JbmJ5dGVzIC09IGJzaXplOwotCi0JZG8gewotCQl4b3IoaXYsIHNyYyk7Ci0JCWZuKHRmbSwgZHN0LCBpdik7Ci0JCW1lbWNweShpdiwgZHN0LCBic2l6ZSk7Ci0KLQkJc3JjICs9IGJzaXplOwotCQlkc3QgKz0gYnNpemU7Ci0JfSB3aGlsZSAoKGRvbmUgKz0gYnNpemUpIDw9IG5ieXRlcyk7Ci0KLQlyZXR1cm4gZG9uZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjYmNfcHJvY2Vzc19kZWNyeXB0KGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGVzYy0+dGZtOwotCXZvaWQgKCp4b3IpKHU4ICosIGNvbnN0IHU4ICopID0gdGZtLT5jcnRfdS5jaXBoZXIuY2l0X3hvcl9ibG9jazsKLQlpbnQgYnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKLQl1bnNpZ25lZCBsb25nIGFsaWdubWFzayA9IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayhkZXNjLT50Zm0pOwotCi0JdTggc3RhY2tbc3JjID09IGRzdCA/IGJzaXplICsgYWxpZ25tYXNrIDogMF07Ci0JdTggKmJ1ZiA9ICh1OCAqKUFMSUdOKCh1bnNpZ25lZCBsb25nKXN0YWNrLCBhbGlnbm1hc2sgKyAxKTsKLQl1OCAqKmRzdF9wID0gc3JjID09IGRzdCA/ICZidWYgOiAmZHN0OwotCi0Jdm9pZCAoKmZuKShzdHJ1Y3QgY3J5cHRvX3RmbSAqLCB1OCAqLCBjb25zdCB1OCAqKSA9IGRlc2MtPmNyZm47Ci0JdTggKml2ID0gZGVzYy0+aW5mbzsKLQl1bnNpZ25lZCBpbnQgZG9uZSA9IDA7Ci0KLQluYnl0ZXMgLT0gYnNpemU7Ci0KLQlkbyB7Ci0JCXU4ICp0bXBfZHN0ID0gKmRzdF9wOwotCi0JCWZuKHRmbSwgdG1wX2RzdCwgc3JjKTsKLQkJeG9yKHRtcF9kc3QsIGl2KTsKLQkJbWVtY3B5KGl2LCBzcmMsIGJzaXplKTsKLQkJaWYgKHRtcF9kc3QgIT0gZHN0KQotCQkJbWVtY3B5KGRzdCwgdG1wX2RzdCwgYnNpemUpOwotCi0JCXNyYyArPSBic2l6ZTsKLQkJZHN0ICs9IGJzaXplOwotCX0gd2hpbGUgKChkb25lICs9IGJzaXplKSA8PSBuYnl0ZXMpOwotCi0JcmV0dXJuIGRvbmU7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZWNiX3Byb2Nlc3MoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqZHN0LAotCQkJCWNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGRlc2MtPnRmbTsKLQlpbnQgYnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKLQl2b2lkICgqZm4pKHN0cnVjdCBjcnlwdG9fdGZtICosIHU4ICosIGNvbnN0IHU4ICopID0gZGVzYy0+Y3JmbjsKLQl1bnNpZ25lZCBpbnQgZG9uZSA9IDA7Ci0KLQluYnl0ZXMgLT0gYnNpemU7Ci0KLQlkbyB7Ci0JCWZuKHRmbSwgZHN0LCBzcmMpOwotCi0JCXNyYyArPSBic2l6ZTsKLQkJZHN0ICs9IGJzaXplOwotCX0gd2hpbGUgKChkb25lICs9IGJzaXplKSA8PSBuYnl0ZXMpOwotCi0JcmV0dXJuIGRvbmU7Ci19CiAKIHN0YXRpYyBpbnQgc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCiB7CkBAIC0yOTMsMTIyICszMiw2IEBACiAJCXJldHVybiBjaWEtPmNpYV9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7CiB9CiAKLXN0YXRpYyBpbnQgZWNiX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlzdHJ1Y3QgY2lwaGVyX2Rlc2MgZGVzYzsKLQlzdHJ1Y3QgY2lwaGVyX2FsZ19jb21wYXQgKmNpcGhlciA9ICh2b2lkICopJnRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyOwotCi0JZGVzYy50Zm0gPSB0Zm07Ci0JZGVzYy5jcmZuID0gY2lwaGVyLT5jaWFfZW5jcnlwdDsKLQlkZXNjLnByZm4gPSBjaXBoZXItPmNpYV9lbmNyeXB0X2VjYiA/OiBlY2JfcHJvY2VzczsKLQotCXJldHVybiBjcnlwdCgmZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgZWNiX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlzdHJ1Y3QgY2lwaGVyX2Rlc2MgZGVzYzsKLQlzdHJ1Y3QgY2lwaGVyX2FsZ19jb21wYXQgKmNpcGhlciA9ICh2b2lkICopJnRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyOwotCi0JZGVzYy50Zm0gPSB0Zm07Ci0JZGVzYy5jcmZuID0gY2lwaGVyLT5jaWFfZGVjcnlwdDsKLQlkZXNjLnByZm4gPSBjaXBoZXItPmNpYV9kZWNyeXB0X2VjYiA/OiBlY2JfcHJvY2VzczsKLQotCXJldHVybiBjcnlwdCgmZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgY2JjX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlzdHJ1Y3QgY2lwaGVyX2Rlc2MgZGVzYzsKLQlzdHJ1Y3QgY2lwaGVyX2FsZ19jb21wYXQgKmNpcGhlciA9ICh2b2lkICopJnRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyOwotCi0JZGVzYy50Zm0gPSB0Zm07Ci0JZGVzYy5jcmZuID0gY2lwaGVyLT5jaWFfZW5jcnlwdDsKLQlkZXNjLnByZm4gPSBjaXBoZXItPmNpYV9lbmNyeXB0X2NiYyA/OiBjYmNfcHJvY2Vzc19lbmNyeXB0OwotCWRlc2MuaW5mbyA9IHRmbS0+Y3J0X2NpcGhlci5jaXRfaXY7Ci0KLQlyZXR1cm4gY3J5cHQoJmRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwotfQotCi1zdGF0aWMgaW50IGNiY19lbmNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQotewotCXN0cnVjdCBjaXBoZXJfZGVzYyBkZXNjOwotCXN0cnVjdCBjaXBoZXJfYWxnX2NvbXBhdCAqY2lwaGVyID0gKHZvaWQgKikmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7Ci0KLQlkZXNjLnRmbSA9IHRmbTsKLQlkZXNjLmNyZm4gPSBjaXBoZXItPmNpYV9lbmNyeXB0OwotCWRlc2MucHJmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHRfY2JjID86IGNiY19wcm9jZXNzX2VuY3J5cHQ7Ci0JZGVzYy5pbmZvID0gaXY7Ci0KLQlyZXR1cm4gY3J5cHRfaXZfdW5hbGlnbmVkKCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKLX0KLQotc3RhdGljIGludCBjYmNfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCXN0cnVjdCBjaXBoZXJfZGVzYyBkZXNjOwotCXN0cnVjdCBjaXBoZXJfYWxnX2NvbXBhdCAqY2lwaGVyID0gKHZvaWQgKikmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7Ci0KLQlkZXNjLnRmbSA9IHRmbTsKLQlkZXNjLmNyZm4gPSBjaXBoZXItPmNpYV9kZWNyeXB0OwotCWRlc2MucHJmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHRfY2JjID86IGNiY19wcm9jZXNzX2RlY3J5cHQ7Ci0JZGVzYy5pbmZvID0gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdjsKLQotCXJldHVybiBjcnlwdCgmZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgY2JjX2RlY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCi17Ci0Jc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7Ci0Jc3RydWN0IGNpcGhlcl9hbGdfY29tcGF0ICpjaXBoZXIgPSAodm9pZCAqKSZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKLQotCWRlc2MudGZtID0gdGZtOwotCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHQ7Ci0JZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZGVjcnlwdF9jYmMgPzogY2JjX3Byb2Nlc3NfZGVjcnlwdDsKLQlkZXNjLmluZm8gPSBpdjsKLQotCXJldHVybiBjcnlwdF9pdl91bmFsaWduZWQoJmRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwotfQotCi1zdGF0aWMgaW50IG5vY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCBub2NyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0gICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi1pbnQgY3J5cHRvX2luaXRfY2lwaGVyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKLXsKLQl1MzIgbW9kZSA9IGZsYWdzICYgQ1JZUFRPX1RGTV9NT0RFX01BU0s7Ci0JdGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID0gbW9kZSA/IG1vZGUgOiBDUllQVE9fVEZNX01PREVfRUNCOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBjaXBoZXJfY3J5cHRfdW5hbGlnbmVkKHZvaWQgKCpmbikoc3RydWN0IGNyeXB0b190Zm0gKiwgdTggKiwKIAkJCQkJICAgICAgY29uc3QgdTggKiksCiAJCQkJICAgc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKQEAgLTQ1NCw3ICs3Nyw2IEBACiAKIGludCBjcnlwdG9faW5pdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7Ci0JaW50IHJldCA9IDA7CiAJc3RydWN0IGNpcGhlcl90Zm0gKm9wcyA9ICZ0Zm0tPmNydF9jaXBoZXI7CiAJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKIApAQCAtNDY0LDcwICs4Niw3IEBACiAJb3BzLT5jaXRfZGVjcnlwdF9vbmUgPSBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2sodGZtKSA/CiAJCWNpcGhlcl9kZWNyeXB0X3VuYWxpZ25lZCA6IGNpcGhlci0+Y2lhX2RlY3J5cHQ7CiAKLQlzd2l0Y2ggKHRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSkgewotCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0VDQjoKLQkJb3BzLT5jaXRfZW5jcnlwdCA9IGVjYl9lbmNyeXB0OwotCQlvcHMtPmNpdF9kZWNyeXB0ID0gZWNiX2RlY3J5cHQ7Ci0JCW9wcy0+Y2l0X2VuY3J5cHRfaXYgPSBub2NyeXB0X2l2OwotCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gbm9jcnlwdF9pdjsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0NCQzoKLQkJb3BzLT5jaXRfZW5jcnlwdCA9IGNiY19lbmNyeXB0OwotCQlvcHMtPmNpdF9kZWNyeXB0ID0gY2JjX2RlY3J5cHQ7Ci0JCW9wcy0+Y2l0X2VuY3J5cHRfaXYgPSBjYmNfZW5jcnlwdF9pdjsKLQkJb3BzLT5jaXRfZGVjcnlwdF9pdiA9IGNiY19kZWNyeXB0X2l2OwotCQlicmVhazsKLQkJCi0JY2FzZSBDUllQVE9fVEZNX01PREVfQ0ZCOgotCQlvcHMtPmNpdF9lbmNyeXB0ID0gbm9jcnlwdDsKLQkJb3BzLT5jaXRfZGVjcnlwdCA9IG5vY3J5cHQ7Ci0JCW9wcy0+Y2l0X2VuY3J5cHRfaXYgPSBub2NyeXB0X2l2OwotCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gbm9jcnlwdF9pdjsKLQkJYnJlYWs7Ci0JCi0JY2FzZSBDUllQVE9fVEZNX01PREVfQ1RSOgotCQlvcHMtPmNpdF9lbmNyeXB0ID0gbm9jcnlwdDsKLQkJb3BzLT5jaXRfZGVjcnlwdCA9IG5vY3J5cHQ7Ci0JCW9wcy0+Y2l0X2VuY3J5cHRfaXYgPSBub2NyeXB0X2l2OwotCQlvcHMtPmNpdF9kZWNyeXB0X2l2ID0gbm9jcnlwdF9pdjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0JCi0JaWYgKG9wcy0+Y2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0NCQykgewotCQl1bnNpZ25lZCBsb25nIGFsaWduOwotCQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JICAgIAkKLQkgICAgCXN3aXRjaCAoY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpIHsKLQkgICAgCWNhc2UgODoKLQkgICAgCQlvcHMtPmNpdF94b3JfYmxvY2sgPSB4b3JfNjQ7Ci0JICAgIAkJYnJlYWs7Ci0JICAgIAkJCi0JICAgIAljYXNlIDE2OgotCSAgICAJCW9wcy0+Y2l0X3hvcl9ibG9jayA9IHhvcl8xMjg7Ci0JICAgIAkJYnJlYWs7Ci0JICAgIAkJCi0JICAgIAlkZWZhdWx0OgotCSAgICAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBibG9jayBzaXplICV1IG5vdCBzdXBwb3J0ZWRcbiIsCi0JICAgIAkJICAgICAgIGNyeXB0b190Zm1fYWxnX25hbWUodGZtKSwKLQkgICAgCQkgICAgICAgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpOwotCSAgICAJCXJldCA9IC1FSU5WQUw7Ci0JICAgIAkJZ290byBvdXQ7Ci0JICAgIAl9Ci0JICAgIAkKLQkJb3BzLT5jaXRfaXZzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7Ci0JCWFsaWduID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKHRmbSkgKyAxOwotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpY3J5cHRvX3RmbV9jdHgodGZtKTsKLQkJYWRkciA9IEFMSUdOKGFkZHIsIGFsaWduKTsKLQkJYWRkciArPSBBTElHTih0Zm0tPl9fY3J0X2FsZy0+Y3JhX2N0eHNpemUsIGFsaWduKTsKLQkJb3BzLT5jaXRfaXYgPSAodm9pZCAqKWFkZHI7Ci0JfQotCi1vdXQ6CQotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgY3J5cHRvX2V4aXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NvbXByZXNzLmMgYi9jcnlwdG8vY29tcHJlc3MuYwppbmRleCBlY2ExODJhLi4wYTY1NzAwIDEwMDY0NAotLS0gYS9jcnlwdG8vY29tcHJlc3MuYworKysgYi9jcnlwdG8vY29tcHJlc3MuYwpAQCAtMzQsMTEgKzM0LDYgQEAKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGVuKTsKIH0KIAotaW50IGNyeXB0b19pbml0X2NvbXByZXNzX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKLXsKLQlyZXR1cm4gZmxhZ3MgPyAtRUlOVkFMIDogMDsKLX0KLQogaW50IGNyeXB0b19pbml0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewogCXN0cnVjdCBjb21wcmVzc190Zm0gKm9wcyA9ICZ0Zm0tPmNydF9jb21wcmVzczsKZGlmZiAtLWdpdCBhL2NyeXB0by9kaWdlc3QuYyBiL2NyeXB0by9kaWdlc3QuYwppbmRleCA4ZjQ1OTMyLi4xYmY3NDE0IDEwMDY0NAotLS0gYS9jcnlwdG8vZGlnZXN0LmMKKysrIGIvY3J5cHRvL2RpZ2VzdC5jCkBAIC0xNCw3ICsxNCw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCkBAIC0yOSw4ICszMSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdXBkYXRlKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsCi0JCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5ieXRlcykKK3N0YXRpYyBpbnQgdXBkYXRlMihzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLAorCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewogCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBjcnlwdG9faGFzaF90Zm0oZGVzYy0+dGZtKTsKIAl1bnNpZ25lZCBpbnQgYWxpZ25tYXNrID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKHRmbSk7CkBAIC04MSw2ICs4MywxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLAorCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJaWYgKFdBUk5fT05fT05DRShpbl9pcnEoKSkpCisJCXJldHVybiAtRURFQURMSzsKKwlyZXR1cm4gdXBkYXRlMihkZXNjLCBzZywgbmJ5dGVzKTsKK30KKwogc3RhdGljIGludCBmaW5hbChzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KQogewogCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBjcnlwdG9faGFzaF90Zm0oZGVzYy0+dGZtKTsKQEAgLTExOCwxNCArMTI4LDEyIEBACiBzdGF0aWMgaW50IGRpZ2VzdChzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLAogCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICpvdXQpCiB7Ci0JaW5pdChkZXNjKTsKLQl1cGRhdGUoZGVzYywgc2csIG5ieXRlcyk7Ci0JcmV0dXJuIGZpbmFsKGRlc2MsIG91dCk7Ci19CisJaWYgKFdBUk5fT05fT05DRShpbl9pcnEoKSkpCisJCXJldHVybiAtRURFQURMSzsKIAotaW50IGNyeXB0b19pbml0X2RpZ2VzdF9mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpCi17Ci0JcmV0dXJuIGZsYWdzID8gLUVJTlZBTCA6IDA7CisJaW5pdChkZXNjKTsKKwl1cGRhdGUyKGRlc2MsIHNnLCBuYnl0ZXMpOworCXJldHVybiBmaW5hbChkZXNjLCBvdXQpOwogfQogCiBpbnQgY3J5cHRvX2luaXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VjYi5jIGIvY3J5cHRvL2VjYi5jCmluZGV4IGYyMzlhYTkuLjgzOWEwYWUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9lY2IuYworKysgYi9jcnlwdG8vZWNiLmMKQEAgLTk5LDEyICs5OSwxMyBAQAogCXN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QgPSAodm9pZCAqKXRmbS0+X19jcnRfYWxnOwogCXN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduID0gY3J5cHRvX2luc3RhbmNlX2N0eChpbnN0KTsKIAlzdHJ1Y3QgY3J5cHRvX2VjYl9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKmNpcGhlcjsKIAotCXRmbSA9IGNyeXB0b19zcGF3bl90Zm0oc3Bhd24pOwotCWlmIChJU19FUlIodGZtKSkKLQkJcmV0dXJuIFBUUl9FUlIodGZtKTsKKwljaXBoZXIgPSBjcnlwdG9fc3Bhd25fY2lwaGVyKHNwYXduKTsKKwlpZiAoSVNfRVJSKGNpcGhlcikpCisJCXJldHVybiBQVFJfRVJSKGNpcGhlcik7CiAKLQljdHgtPmNoaWxkID0gY3J5cHRvX2NpcGhlcl9jYXN0KHRmbSk7CisJY3R4LT5jaGlsZCA9IGNpcGhlcjsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL2ZjcnlwdC5jIGIvY3J5cHRvL2ZjcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMmJiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vZmNyeXB0LmMKQEAgLTAsMCArMSw0MjMgQEAKKy8qIEZDcnlwdCBlbmNyeXB0aW9uIGFsZ29yaXRobQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBCYXNlZCBvbiBjb2RlOgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NSAtIDIwMDAgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCisgKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorCisjZGVmaW5lIFJPVU5EUyAxNgorCitzdHJ1Y3QgZmNyeXB0X2N0eCB7CisJdTMyIHNjaGVkW1JPVU5EU107Cit9OworCisvKiBSb3RhdGUgcmlnaHQgdHdvIDMyIGJpdCBudW1iZXJzIGFzIGEgNTYgYml0IG51bWJlciAqLworI2RlZmluZSByb3I1NihoaSwgbG8sIG4pCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJdTMyIHQgPSBsbyAmICgoMSA8PCBuKSAtIDEpOwkJCQlcCisJbG8gPSAobG8gPj4gbikgfCAoKGhpICYgKCgxIDw8IG4pIC0gMSkpIDw8ICgzMiAtIG4pKTsJXAorCWhpID0gKGhpID4+IG4pIHwgKHQgPDwgKDI0LW4pKTsJCQkJXAorfSB3aGlsZSgwKQorCisvKiBSb3RhdGUgcmlnaHQgb25lIDY0IGJpdCBudW1iZXIgYXMgYSA1NiBiaXQgbnVtYmVyICovCisjZGVmaW5lIHJvcjU2XzY0KGssIG4pCQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWsgPSAoayA+PiBuKSB8ICgoayAmICgoMSA8PCBuKSAtIDEpKSA8PCAoNTYgLSBuKSk7CVwKK30gd2hpbGUoMCkKKworLyoKKyAqIFNib3hlcyBmb3IgRmVpc3RlbCBuZXR3b3JrIGRlcml2ZWQgZnJvbQorICogL2Fmcy90cmFuc2FyYy5jb20vcHVibGljL2Fmc3BzL2Fmcy5yZWwzMWIuZXhwb3J0LXNyYy9yeGthZC9zYm94ZXMuaAorICovCisjdW5kZWYgWgorI2RlZmluZSBaKHgpIF9fY29uc3RhbnRfYmUzMl90b19jcHUoeCA8PCAzKQorc3RhdGljIGNvbnN0IHUzMiBzYm94MFsyNTZdID0geworCVooMHhlYSksIFooMHg3ZiksIFooMHhiMiksIFooMHg2NCksIFooMHg5ZCksIFooMHhiMCksIFooMHhkOSksIFooMHgxMSksCisJWigweGNkKSwgWigweDg2KSwgWigweDg2KSwgWigweDkxKSwgWigweDBhKSwgWigweGIyKSwgWigweDkzKSwgWigweDA2KSwKKwlaKDB4MGUpLCBaKDB4MDYpLCBaKDB4ZDIpLCBaKDB4NjUpLCBaKDB4NzMpLCBaKDB4YzUpLCBaKDB4MjgpLCBaKDB4NjApLAorCVooMHhmMiksIFooMHgyMCksIFooMHhiNSksIFooMHgzOCksIFooMHg3ZSksIFooMHhkYSksIFooMHg5ZiksIFooMHhlMyksCisJWigweGQyKSwgWigweGNmKSwgWigweGM0KSwgWigweDNjKSwgWigweDYxKSwgWigweGZmKSwgWigweDRhKSwgWigweDRhKSwKKwlaKDB4MzUpLCBaKDB4YWMpLCBaKDB4YWEpLCBaKDB4NWYpLCBaKDB4MmIpLCBaKDB4YmIpLCBaKDB4YmMpLCBaKDB4NTMpLAorCVooMHg0ZSksIFooMHg5ZCksIFooMHg3OCksIFooMHhhMyksIFooMHhkYyksIFooMHgwOSksIFooMHgzMiksIFooMHgxMCksCisJWigweGM2KSwgWigweDZmKSwgWigweDY2KSwgWigweGQ2KSwgWigweGFiKSwgWigweGE5KSwgWigweGFmKSwgWigweGZkKSwKKwlaKDB4M2IpLCBaKDB4OTUpLCBaKDB4ZTgpLCBaKDB4MzQpLCBaKDB4OWEpLCBaKDB4ODEpLCBaKDB4NzIpLCBaKDB4ODApLAorCVooMHg5YyksIFooMHhmMyksIFooMHhlYyksIFooMHhkYSksIFooMHg5ZiksIFooMHgyNiksIFooMHg3NiksIFooMHgxNSksCisJWigweDNlKSwgWigweDU1KSwgWigweDRkKSwgWigweGRlKSwgWigweDg0KSwgWigweGVlKSwgWigweGFkKSwgWigweGM3KSwKKwlaKDB4ZjEpLCBaKDB4NmIpLCBaKDB4M2QpLCBaKDB4ZDMpLCBaKDB4MDQpLCBaKDB4NDkpLCBaKDB4YWEpLCBaKDB4MjQpLAorCVooMHgwYiksIFooMHg4YSksIFooMHg4MyksIFooMHhiYSksIFooMHhmYSksIFooMHg4NSksIFooMHhhMCksIFooMHhhOCksCisJWigweGIxKSwgWigweGQ0KSwgWigweDAxKSwgWigweGQ4KSwgWigweDcwKSwgWigweDY0KSwgWigweGYwKSwgWigweDUxKSwKKwlaKDB4ZDIpLCBaKDB4YzMpLCBaKDB4YTcpLCBaKDB4NzUpLCBaKDB4OGMpLCBaKDB4YTUpLCBaKDB4NjQpLCBaKDB4ZWYpLAorCVooMHgxMCksIFooMHg0ZSksIFooMHhiNyksIFooMHhjNiksIFooMHg2MSksIFooMHgwMyksIFooMHhlYiksIFooMHg0NCksCisJWigweDNkKSwgWigweGU1KSwgWigweGIzKSwgWigweDViKSwgWigweGFlKSwgWigweGQ1KSwgWigweGFkKSwgWigweDFkKSwKKwlaKDB4ZmEpLCBaKDB4NWEpLCBaKDB4MWUpLCBaKDB4MzMpLCBaKDB4YWIpLCBaKDB4OTMpLCBaKDB4YTIpLCBaKDB4YjcpLAorCVooMHhlNyksIFooMHhhOCksIFooMHg0NSksIFooMHhhNCksIFooMHhjZCksIFooMHgyOSksIFooMHg2MyksIFooMHg0NCksCisJWigweGI2KSwgWigweDY5KSwgWigweDdlKSwgWigweDJlKSwgWigweDYyKSwgWigweDAzKSwgWigweGM4KSwgWigweGUwKSwKKwlaKDB4MTcpLCBaKDB4YmIpLCBaKDB4YzcpLCBaKDB4ZjMpLCBaKDB4M2YpLCBaKDB4MzYpLCBaKDB4YmEpLCBaKDB4NzEpLAorCVooMHg4ZSksIFooMHg5NyksIFooMHg2NSksIFooMHg2MCksIFooMHg2OSksIFooMHhiNiksIFooMHhmNiksIFooMHhlNiksCisJWigweDZlKSwgWigweGUwKSwgWigweDgxKSwgWigweDU5KSwgWigweGU4KSwgWigweGFmKSwgWigweGRkKSwgWigweDk1KSwKKwlaKDB4MjIpLCBaKDB4OTkpLCBaKDB4ZmQpLCBaKDB4NjMpLCBaKDB4MTkpLCBaKDB4NzQpLCBaKDB4NjEpLCBaKDB4YjEpLAorCVooMHhiNiksIFooMHg1YiksIFooMHhhZSksIFooMHg1NCksIFooMHhiMyksIFooMHg3MCksIFooMHhmZiksIFooMHhjNiksCisJWigweDNiKSwgWigweDNlKSwgWigweGMxKSwgWigweGQ3KSwgWigweGUxKSwgWigweDBlKSwgWigweDc2KSwgWigweGU1KSwKKwlaKDB4MzYpLCBaKDB4NGYpLCBaKDB4NTkpLCBaKDB4YzcpLCBaKDB4MDgpLCBaKDB4NmUpLCBaKDB4ODIpLCBaKDB4YTYpLAorCVooMHg5MyksIFooMHhjNCksIFooMHhhYSksIFooMHgyNiksIFooMHg0OSksIFooMHhlMCksIFooMHgyMSksIFooMHg2NCksCisJWigweDA3KSwgWigweDlmKSwgWigweDY0KSwgWigweDgxKSwgWigweDljKSwgWigweGJmKSwgWigweGY5KSwgWigweGQxKSwKKwlaKDB4NDMpLCBaKDB4ZjgpLCBaKDB4YjYpLCBaKDB4YjkpLCBaKDB4ZjEpLCBaKDB4MjQpLCBaKDB4NzUpLCBaKDB4MDMpLAorCVooMHhlNCksIFooMHhiMCksIFooMHg5OSksIFooMHg0NiksIFooMHgzZCksIFooMHhmNSksIFooMHhkMSksIFooMHgzOSksCisJWigweDcyKSwgWigweDEyKSwgWigweGY2KSwgWigweGJhKSwgWigweDBjKSwgWigweDBkKSwgWigweDQyKSwgWigweDJlKQorfTsKKworI3VuZGVmIFoKKyNkZWZpbmUgWih4KSBfX2NvbnN0YW50X2JlMzJfdG9fY3B1KCh4IDw8IDI3KSB8ICh4ID4+IDUpKQorc3RhdGljIGNvbnN0IHUzMiBzYm94MVsyNTZdID0geworCVooMHg3NyksIFooMHgxNCksIFooMHhhNiksIFooMHhmZSksIFooMHhiMiksIFooMHg1ZSksIFooMHg4YyksIFooMHgzZSksCisJWigweDY3KSwgWigweDZjKSwgWigweGExKSwgWigweDBkKSwgWigweGMyKSwgWigweGEyKSwgWigweGMxKSwgWigweDg1KSwKKwlaKDB4NmMpLCBaKDB4N2IpLCBaKDB4NjcpLCBaKDB4YzYpLCBaKDB4MjMpLCBaKDB4ZTMpLCBaKDB4ZjIpLCBaKDB4ODkpLAorCVooMHg1MCksIFooMHg5YyksIFooMHgwMyksIFooMHhiNyksIFooMHg3MyksIFooMHhlNiksIFooMHhlMSksIFooMHgzOSksCisJWigweDMxKSwgWigweDJjKSwgWigweDI3KSwgWigweDlmKSwgWigweGE1KSwgWigweDY5KSwgWigweDQ0KSwgWigweGQ2KSwKKwlaKDB4MjMpLCBaKDB4ODMpLCBaKDB4OTgpLCBaKDB4N2QpLCBaKDB4M2MpLCBaKDB4YjQpLCBaKDB4MmQpLCBaKDB4OTkpLAorCVooMHgxYyksIFooMHgxZiksIFooMHg4YyksIFooMHgyMCksIFooMHgwMyksIFooMHg3YyksIFooMHg1ZiksIFooMHhhZCksCisJWigweGY0KSwgWigweGZhKSwgWigweDk1KSwgWigweGNhKSwgWigweDc2KSwgWigweDQ0KSwgWigweGNkKSwgWigweGI2KSwKKwlaKDB4YjgpLCBaKDB4YTEpLCBaKDB4YTEpLCBaKDB4YmUpLCBaKDB4OWUpLCBaKDB4NTQpLCBaKDB4OGYpLCBaKDB4MGIpLAorCVooMHgxNiksIFooMHg3NCksIFooMHgzMSksIFooMHg4YSksIFooMHgyMyksIFooMHgxNyksIFooMHgwNCksIFooMHhmYSksCisJWigweDc5KSwgWigweDg0KSwgWigweGIxKSwgWigweGY1KSwgWigweDEzKSwgWigweGFiKSwgWigweGI1KSwgWigweDJlKSwKKwlaKDB4YWEpLCBaKDB4MGMpLCBaKDB4NjApLCBaKDB4NmIpLCBaKDB4NWIpLCBaKDB4YzQpLCBaKDB4NGIpLCBaKDB4YmMpLAorCVooMHhlMiksIFooMHhhZiksIFooMHg0NSksIFooMHg3MyksIFooMHhmYSksIFooMHhjOSksIFooMHg0OSksIFooMHhjZCksCisJWigweDAwKSwgWigweDkyKSwgWigweDdkKSwgWigweDk3KSwgWigweDdhKSwgWigweDE4KSwgWigweDYwKSwgWigweDNkKSwKKwlaKDB4Y2YpLCBaKDB4NWIpLCBaKDB4ZGUpLCBaKDB4YzYpLCBaKDB4ZTIpLCBaKDB4ZTYpLCBaKDB4YmIpLCBaKDB4OGIpLAorCVooMHgwNiksIFooMHhkYSksIFooMHgwOCksIFooMHgxNSksIFooMHgxYiksIFooMHg4OCksIFooMHg2YSksIFooMHgxNyksCisJWigweDg5KSwgWigweGQwKSwgWigweGE5KSwgWigweGMxKSwgWigweGM5KSwgWigweDcwKSwgWigweDZiKSwgWigweGU1KSwKKwlaKDB4NDMpLCBaKDB4ZjQpLCBaKDB4NjgpLCBaKDB4YzgpLCBaKDB4ZDMpLCBaKDB4ODQpLCBaKDB4MjgpLCBaKDB4MGEpLAorCVooMHg1MiksIFooMHg2NiksIFooMHhhMyksIFooMHhjYSksIFooMHhmMiksIFooMHhlMyksIFooMHg3ZiksIFooMHg3YSksCisJWigweDMxKSwgWigweGY3KSwgWigweDg4KSwgWigweDk0KSwgWigweDVlKSwgWigweDljKSwgWigweDYzKSwgWigweGQ1KSwKKwlaKDB4MjQpLCBaKDB4NjYpLCBaKDB4ZmMpLCBaKDB4YjMpLCBaKDB4NTcpLCBaKDB4MjUpLCBaKDB4YmUpLCBaKDB4ODkpLAorCVooMHg0NCksIFooMHhjNCksIFooMHhlMCksIFooMHg4ZiksIFooMHgyMyksIFooMHgzYyksIFooMHgxMiksIFooMHg1MiksCisJWigweGY1KSwgWigweDFlKSwgWigweGY0KSwgWigweGNiKSwgWigweDE4KSwgWigweDMzKSwgWigweDFmKSwgWigweGY4KSwKKwlaKDB4NjkpLCBaKDB4MTApLCBaKDB4OWQpLCBaKDB4ZDMpLCBaKDB4ZjcpLCBaKDB4MjgpLCBaKDB4ZjgpLCBaKDB4MzApLAorCVooMHgwNSksIFooMHg1ZSksIFooMHgzMiksIFooMHhjMCksIFooMHhkNSksIFooMHgxOSksIFooMHhiZCksIFooMHg0NSksCisJWigweDhiKSwgWigweDViKSwgWigweGZkKSwgWigweGJjKSwgWigweGUyKSwgWigweDVjKSwgWigweGE5KSwgWigweDk2KSwKKwlaKDB4ZWYpLCBaKDB4NzApLCBaKDB4Y2YpLCBaKDB4YzIpLCBaKDB4MmEpLCBaKDB4YjMpLCBaKDB4NjEpLCBaKDB4YWQpLAorCVooMHg4MCksIFooMHg0OCksIFooMHg4MSksIFooMHhiNyksIFooMHgxZCksIFooMHg0MyksIFooMHhkOSksIFooMHhkNyksCisJWigweDQ1KSwgWigweGYwKSwgWigweGQ4KSwgWigweDhhKSwgWigweDU5KSwgWigweDdjKSwgWigweDU3KSwgWigweGMxKSwKKwlaKDB4NzkpLCBaKDB4YzcpLCBaKDB4MzQpLCBaKDB4ZDYpLCBaKDB4NDMpLCBaKDB4ZGYpLCBaKDB4ZTQpLCBaKDB4NzgpLAorCVooMHgxNiksIFooMHgwNiksIFooMHhkYSksIFooMHg5MiksIFooMHg3NiksIFooMHg1MSksIFooMHhlMSksIFooMHhkNCksCisJWigweDcwKSwgWigweDAzKSwgWigweGUwKSwgWigweDJmKSwgWigweDk2KSwgWigweDkxKSwgWigweDgyKSwgWigweDgwKQorfTsKKworI3VuZGVmIFoKKyNkZWZpbmUgWih4KSBfX2NvbnN0YW50X2JlMzJfdG9fY3B1KHggPDwgMTEpCitzdGF0aWMgY29uc3QgdTMyIHNib3gyWzI1Nl0gPSB7CisJWigweGYwKSwgWigweDM3KSwgWigweDI0KSwgWigweDUzKSwgWigweDJhKSwgWigweDAzKSwgWigweDgzKSwgWigweDg2KSwKKwlaKDB4ZDEpLCBaKDB4ZWMpLCBaKDB4NTApLCBaKDB4ZjApLCBaKDB4NDIpLCBaKDB4NzgpLCBaKDB4MmYpLCBaKDB4NmQpLAorCVooMHhiZiksIFooMHg4MCksIFooMHg4NyksIFooMHgyNyksIFooMHg5NSksIFooMHhlMiksIFooMHhjNSksIFooMHg1ZCksCisJWigweGY5KSwgWigweDZmKSwgWigweGRiKSwgWigweGI0KSwgWigweDY1KSwgWigweDZlKSwgWigweGU3KSwgWigweDI0KSwKKwlaKDB4YzgpLCBaKDB4MWEpLCBaKDB4YmIpLCBaKDB4NDkpLCBaKDB4YjUpLCBaKDB4MGEpLCBaKDB4N2QpLCBaKDB4YjkpLAorCVooMHhlOCksIFooMHhkYyksIFooMHhiNyksIFooMHhkOSksIFooMHg0NSksIFooMHgyMCksIFooMHgxYiksIFooMHhjZSksCisJWigweDU5KSwgWigweDlkKSwgWigweDZiKSwgWigweGJkKSwgWigweDBlKSwgWigweDhmKSwgWigweGEzKSwgWigweGE5KSwKKwlaKDB4YmMpLCBaKDB4NzQpLCBaKDB4YTYpLCBaKDB4ZjYpLCBaKDB4N2YpLCBaKDB4NWYpLCBaKDB4YjEpLCBaKDB4NjgpLAorCVooMHg4NCksIFooMHhiYyksIFooMHhhOSksIFooMHhmZCksIFooMHg1NSksIFooMHg1MCksIFooMHhlOSksIFooMHhiNiksCisJWigweDEzKSwgWigweDVlKSwgWigweDA3KSwgWigweGI4KSwgWigweDk1KSwgWigweDAyKSwgWigweGMwKSwgWigweGQwKSwKKwlaKDB4NmEpLCBaKDB4MWEpLCBaKDB4ODUpLCBaKDB4YmQpLCBaKDB4YjYpLCBaKDB4ZmQpLCBaKDB4ZmUpLCBaKDB4MTcpLAorCVooMHgzZiksIFooMHgwOSksIFooMHhhMyksIFooMHg4ZCksIFooMHhmYiksIFooMHhlZCksIFooMHhkYSksIFooMHgxZCksCisJWigweDZkKSwgWigweDFjKSwgWigweDZjKSwgWigweDAxKSwgWigweDVhKSwgWigweGU1KSwgWigweDcxKSwgWigweDNlKSwKKwlaKDB4OGIpLCBaKDB4NmIpLCBaKDB4YmUpLCBaKDB4MjkpLCBaKDB4ZWIpLCBaKDB4MTIpLCBaKDB4MTkpLCBaKDB4MzQpLAorCVooMHhjZCksIFooMHhiMyksIFooMHhiZCksIFooMHgzNSksIFooMHhlYSksIFooMHg0YiksIFooMHhkNSksIFooMHhhZSksCisJWigweDJhKSwgWigweDc5KSwgWigweDVhKSwgWigweGE1KSwgWigweDMyKSwgWigweDEyKSwgWigweDdiKSwgWigweGRjKSwKKwlaKDB4MmMpLCBaKDB4ZDApLCBaKDB4MjIpLCBaKDB4NGIpLCBaKDB4YjEpLCBaKDB4ODUpLCBaKDB4NTkpLCBaKDB4ODApLAorCVooMHhjMCksIFooMHgzMCksIFooMHg5ZiksIFooMHg3MyksIFooMHhkMyksIFooMHgxNCksIFooMHg0OCksIFooMHg0MCksCisJWigweDA3KSwgWigweDJkKSwgWigweDhmKSwgWigweDgwKSwgWigweDBmKSwgWigweGNlKSwgWigweDBiKSwgWigweDVlKSwKKwlaKDB4YjcpLCBaKDB4NWUpLCBaKDB4YWMpLCBaKDB4MjQpLCBaKDB4OTQpLCBaKDB4NGEpLCBaKDB4MTgpLCBaKDB4MTUpLAorCVooMHgwNSksIFooMHhlOCksIFooMHgwMiksIFooMHg3NyksIFooMHhhOSksIFooMHhjNyksIFooMHg0MCksIFooMHg0NSksCisJWigweDg5KSwgWigweGQxKSwgWigweGVhKSwgWigweGRlKSwgWigweDBjKSwgWigweDc5KSwgWigweDJhKSwgWigweDk5KSwKKwlaKDB4NmMpLCBaKDB4M2UpLCBaKDB4OTUpLCBaKDB4ZGQpLCBaKDB4OGMpLCBaKDB4N2QpLCBaKDB4YWQpLCBaKDB4NmYpLAorCVooMHhkYyksIFooMHhmZiksIFooMHhmZCksIFooMHg2MiksIFooMHg0NyksIFooMHhiMyksIFooMHgyMSksIFooMHg4YSksCisJWigweGVjKSwgWigweDhlKSwgWigweDE5KSwgWigweDE4KSwgWigweGI0KSwgWigweDZlKSwgWigweDNkKSwgWigweGZkKSwKKwlaKDB4NzQpLCBaKDB4NTQpLCBaKDB4MWUpLCBaKDB4MDQpLCBaKDB4ODUpLCBaKDB4ZDgpLCBaKDB4YmMpLCBaKDB4MWYpLAorCVooMHg1NiksIFooMHhlNyksIFooMHgzYSksIFooMHg1NiksIFooMHg2NyksIFooMHhkNiksIFooMHhjOCksIFooMHhhNSksCisJWigweGYzKSwgWigweDhlKSwgWigweGRlKSwgWigweGFlKSwgWigweDM3KSwgWigweDQ5KSwgWigweGI3KSwgWigweGZhKSwKKwlaKDB4YzgpLCBaKDB4ZjQpLCBaKDB4MWYpLCBaKDB4ZTApLCBaKDB4MmEpLCBaKDB4OWIpLCBaKDB4MTUpLCBaKDB4ZDEpLAorCVooMHgzNCksIFooMHgwZSksIFooMHhiNSksIFooMHhlMCksIFooMHg0NCksIFooMHg3OCksIFooMHg4NCksIFooMHg1OSksCisJWigweDU2KSwgWigweDY4KSwgWigweDc3KSwgWigweGE1KSwgWigweDE0KSwgWigweDA2KSwgWigweGY1KSwgWigweDJmKSwKKwlaKDB4OGMpLCBaKDB4OGEpLCBaKDB4NzMpLCBaKDB4ODApLCBaKDB4NzYpLCBaKDB4YjQpLCBaKDB4MTApLCBaKDB4ODYpCit9OworCisjdW5kZWYgWgorI2RlZmluZSBaKHgpIF9fY29uc3RhbnRfYmUzMl90b19jcHUoeCA8PCAxOSkKK3N0YXRpYyBjb25zdCB1MzIgc2JveDNbMjU2XSA9IHsKKwlaKDB4YTkpLCBaKDB4MmEpLCBaKDB4NDgpLCBaKDB4NTEpLCBaKDB4ODQpLCBaKDB4N2UpLCBaKDB4NDkpLCBaKDB4ZTIpLAorCVooMHhiNSksIFooMHhiNyksIFooMHg0MiksIFooMHgzMyksIFooMHg3ZCksIFooMHg1ZCksIFooMHhhNiksIFooMHgxMiksCisJWigweDQ0KSwgWigweDQ4KSwgWigweDZkKSwgWigweDI4KSwgWigweGFhKSwgWigweDIwKSwgWigweDZkKSwgWigweDU3KSwKKwlaKDB4ZDYpLCBaKDB4NmIpLCBaKDB4NWQpLCBaKDB4NzIpLCBaKDB4ZjApLCBaKDB4OTIpLCBaKDB4NWEpLCBaKDB4MWIpLAorCVooMHg1MyksIFooMHg4MCksIFooMHgyNCksIFooMHg3MCksIFooMHg5YSksIFooMHhjYyksIFooMHhhNyksIFooMHg2NiksCisJWigweGExKSwgWigweDAxKSwgWigweGE1KSwgWigweDQxKSwgWigweDk3KSwgWigweDQxKSwgWigweDMxKSwgWigweDgyKSwKKwlaKDB4ZjEpLCBaKDB4MTQpLCBaKDB4Y2YpLCBaKDB4NTMpLCBaKDB4MGQpLCBaKDB4YTApLCBaKDB4MTApLCBaKDB4Y2MpLAorCVooMHgyYSksIFooMHg3ZCksIFooMHhkMiksIFooMHhiZiksIFooMHg0YiksIFooMHgxYSksIFooMHhkYiksIFooMHgxNiksCisJWigweDQ3KSwgWigweGY2KSwgWigweDUxKSwgWigweDM2KSwgWigweGVkKSwgWigweGYzKSwgWigweGI5KSwgWigweDFhKSwKKwlaKDB4YTcpLCBaKDB4ZGYpLCBaKDB4MjkpLCBaKDB4NDMpLCBaKDB4MDEpLCBaKDB4NTQpLCBaKDB4NzApLCBaKDB4YTQpLAorCVooMHhiZiksIFooMHhkNCksIFooMHgwYiksIFooMHg1MyksIFooMHg0NCksIFooMHg2MCksIFooMHg5ZSksIFooMHgyMyksCisJWigweGExKSwgWigweDE4KSwgWigweDY4KSwgWigweDRmKSwgWigweGYwKSwgWigweDJmKSwgWigweDgyKSwgWigweGMyKSwKKwlaKDB4MmEpLCBaKDB4NDEpLCBaKDB4YjIpLCBaKDB4NDIpLCBaKDB4MGMpLCBaKDB4ZWQpLCBaKDB4MGMpLCBaKDB4MWQpLAorCVooMHgxMyksIFooMHgzYSksIFooMHgzYyksIFooMHg2ZSksIFooMHgzNSksIFooMHhkYyksIFooMHg2MCksIFooMHg2NSksCisJWigweDg1KSwgWigweGU5KSwgWigweDY0KSwgWigweDAyKSwgWigweDlhKSwgWigweDNmKSwgWigweDlmKSwgWigweDg3KSwKKwlaKDB4OTYpLCBaKDB4ZGYpLCBaKDB4YmUpLCBaKDB4ZjIpLCBaKDB4Y2IpLCBaKDB4ZTUpLCBaKDB4NmMpLCBaKDB4ZDQpLAorCVooMHg1YSksIFooMHg4MyksIFooMHhiZiksIFooMHg5MiksIFooMHgxYiksIFooMHg5NCksIFooMHgwMCksIFooMHg0MiksCisJWigweGNmKSwgWigweDRiKSwgWigweDAwKSwgWigweDc1KSwgWigweGJhKSwgWigweDhmKSwgWigweDc2KSwgWigweDVmKSwKKwlaKDB4NWQpLCBaKDB4M2EpLCBaKDB4NGQpLCBaKDB4MDkpLCBaKDB4MTIpLCBaKDB4MDgpLCBaKDB4MzgpLCBaKDB4OTUpLAorCVooMHgxNyksIFooMHhlNCksIFooMHgwMSksIFooMHgxZCksIFooMHg0YyksIFooMHhhOSksIFooMHhjYyksIFooMHg4NSksCisJWigweDgyKSwgWigweDRjKSwgWigweDlkKSwgWigweDJmKSwgWigweDNiKSwgWigweDY2KSwgWigweGExKSwgWigweDM0KSwKKwlaKDB4MTApLCBaKDB4Y2QpLCBaKDB4NTkpLCBaKDB4ODkpLCBaKDB4YTUpLCBaKDB4MzEpLCBaKDB4Y2YpLCBaKDB4MDUpLAorCVooMHhjOCksIFooMHg4NCksIFooMHhmYSksIFooMHhjNyksIFooMHhiYSksIFooMHg0ZSksIFooMHg4YiksIFooMHgxYSksCisJWigweDE5KSwgWigweGYxKSwgWigweGExKSwgWigweDNiKSwgWigweDE4KSwgWigweDEyKSwgWigweDE3KSwgWigweGIwKSwKKwlaKDB4OTgpLCBaKDB4OGQpLCBaKDB4MGIpLCBaKDB4MjMpLCBaKDB4YzMpLCBaKDB4M2EpLCBaKDB4MmQpLCBaKDB4MjApLAorCVooMHhkZiksIFooMHgxMyksIFooMHhhMCksIFooMHhhOCksIFooMHg0YyksIFooMHgwZCksIFooMHg2YyksIFooMHgyZiksCisJWigweDQ3KSwgWigweDEzKSwgWigweDEzKSwgWigweDUyKSwgWigweDFmKSwgWigweDJkKSwgWigweGY1KSwgWigweDc5KSwKKwlaKDB4M2QpLCBaKDB4YTIpLCBaKDB4NTQpLCBaKDB4YmQpLCBaKDB4NjkpLCBaKDB4YzgpLCBaKDB4NmIpLCBaKDB4ZjMpLAorCVooMHgwNSksIFooMHgyOCksIFooMHhmMSksIFooMHgxNiksIFooMHg0NiksIFooMHg0MCksIFooMHhiMCksIFooMHgxMSksCisJWigweGQzKSwgWigweGI3KSwgWigweDk1KSwgWigweDQ5KSwgWigweGNmKSwgWigweGMzKSwgWigweDFkKSwgWigweDhmKSwKKwlaKDB4ZDgpLCBaKDB4ZTEpLCBaKDB4NzMpLCBaKDB4ZGIpLCBaKDB4YWQpLCBaKDB4YzgpLCBaKDB4YzkpLCBaKDB4YTkpLAorCVooMHhhMSksIFooMHhjMiksIFooMHhjNSksIFooMHhlMyksIFooMHhiYSksIFooMHhmYyksIFooMHgwZSksIFooMHgyNSkKK307CisKKy8qCisgKiBUaGlzIGlzIGEgMTYgcm91bmQgRmVpc3RlbCBuZXR3b3JrIHdpdGggcGVybXV0YXRpb24gRl9FTkNSWVBUCisgKi8KKyNkZWZpbmUgRl9FTkNSWVBUKFIsIEwsIHNjaGVkKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJdW5pb24gbGM0IHsgdTMyIGw7IHU4IGNbNF07IH0gdTsJCQkJXAorCXUubCA9IHNjaGVkIF4gUjsJCQkJCQlcCisJTCBePSBzYm94MFt1LmNbMF1dIF4gc2JveDFbdS5jWzFdXSBeIHNib3gyW3UuY1syXV0gXiBzYm94M1t1LmNbM11dOyBcCit9IHdoaWxlKDApCisKKy8qCisgKiBlbmNyeXB0b3IKKyAqLworc3RhdGljIHZvaWQgZmNyeXB0X2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sKKwljb25zdCBzdHJ1Y3QgZmNyeXB0X2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgeworCQl1MzIgbCwgcjsKKwl9IFg7CisKKwltZW1jcHkoJlgsIHNyYywgc2l6ZW9mKFgpKTsKKworCUZfRU5DUllQVChYLnIsIFgubCwgY3R4LT5zY2hlZFsweDBdKTsKKwlGX0VOQ1JZUFQoWC5sLCBYLnIsIGN0eC0+c2NoZWRbMHgxXSk7CisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4Ml0pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweDNdKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHg0XSk7CisJRl9FTkNSWVBUKFgubCwgWC5yLCBjdHgtPnNjaGVkWzB4NV0pOworCUZfRU5DUllQVChYLnIsIFgubCwgY3R4LT5zY2hlZFsweDZdKTsKKwlGX0VOQ1JZUFQoWC5sLCBYLnIsIGN0eC0+c2NoZWRbMHg3XSk7CisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4OF0pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweDldKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHhhXSk7CisJRl9FTkNSWVBUKFgubCwgWC5yLCBjdHgtPnNjaGVkWzB4Yl0pOworCUZfRU5DUllQVChYLnIsIFgubCwgY3R4LT5zY2hlZFsweGNdKTsKKwlGX0VOQ1JZUFQoWC5sLCBYLnIsIGN0eC0+c2NoZWRbMHhkXSk7CisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4ZV0pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweGZdKTsKKworCW1lbWNweShkc3QsICZYLCBzaXplb2YoWCkpOworfQorCisvKgorICogZGVjcnlwdG9yCisgKi8KK3N0YXRpYyB2b2lkIGZjcnlwdF9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CisJY29uc3Qgc3RydWN0IGZjcnlwdF9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJc3RydWN0IHsKKwkJdTMyIGwsIHI7CisJfSBYOworCisJbWVtY3B5KCZYLCBzcmMsIHNpemVvZihYKSk7CisKKwlGX0VOQ1JZUFQoWC5sLCBYLnIsIGN0eC0+c2NoZWRbMHhmXSk7CisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4ZV0pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweGRdKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHhjXSk7CisJRl9FTkNSWVBUKFgubCwgWC5yLCBjdHgtPnNjaGVkWzB4Yl0pOworCUZfRU5DUllQVChYLnIsIFgubCwgY3R4LT5zY2hlZFsweGFdKTsKKwlGX0VOQ1JZUFQoWC5sLCBYLnIsIGN0eC0+c2NoZWRbMHg5XSk7CisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4OF0pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweDddKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHg2XSk7CisJRl9FTkNSWVBUKFgubCwgWC5yLCBjdHgtPnNjaGVkWzB4NV0pOworCUZfRU5DUllQVChYLnIsIFgubCwgY3R4LT5zY2hlZFsweDRdKTsKKwlGX0VOQ1JZUFQoWC5sLCBYLnIsIGN0eC0+c2NoZWRbMHgzXSk7CisJRl9FTkNSWVBUKFguciwgWC5sLCBjdHgtPnNjaGVkWzB4Ml0pOworCUZfRU5DUllQVChYLmwsIFguciwgY3R4LT5zY2hlZFsweDFdKTsKKwlGX0VOQ1JZUFQoWC5yLCBYLmwsIGN0eC0+c2NoZWRbMHgwXSk7CisKKwltZW1jcHkoZHN0LCAmWCwgc2l6ZW9mKFgpKTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEga2V5IHNjaGVkdWxlIGZyb20ga2V5LCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGluIGVhY2gga2V5IGJ5dGUKKyAqIGlzIHBhcml0eSBhbmQgc2hhbGwgYmUgaWdub3JlZC4gVGhpcyBsZWF2ZXMgNTYgc2lnbmlmaWNhbnQgYml0cyBpbiB0aGUga2V5CisgKiB0byBzY2F0dGVyIG92ZXIgdGhlIDE2IGtleSBzY2hlZHVsZXMuIEZvciBlYWNoIHNjaGVkdWxlIGV4dHJhY3QgdGhlIGxvdworICogb3JkZXIgMzIgYml0cyBhbmQgdXNlIGFzIHNjaGVkdWxlLCB0aGVuIHJvdGF0ZSByaWdodCBieSAxMSBiaXRzLgorICovCitzdGF0aWMgaW50IGZjcnlwdF9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlzdHJ1Y3QgZmNyeXB0X2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQgIC8qIHRoZSA2NC1iaXQgdmVyc2lvbiBjYW4gYWxzbyBiZSB1c2VkIGZvciAzMi1iaXQKKwkJCSAgKiBrZXJuZWxzIC0gaXQgc2VlbXMgdG8gYmUgZmFzdGVyIGJ1dCB0aGUgY29kZSBpcworCQkJICAqIGxhcmdlciAqLworCisJdTY0IGs7CS8qIGsgaG9sZHMgYWxsIDU2IG5vbi1wYXJpdHkgYml0cyAqLworCisJLyogZGlzY2FyZCB0aGUgcGFyaXR5IGJpdHMgKi8KKwlrID0gKCprZXkrKykgPj4gMTsKKwlrIDw8PSA3OworCWsgfD0gKCprZXkrKykgPj4gMTsKKwlrIDw8PSA3OworCWsgfD0gKCprZXkrKykgPj4gMTsKKwlrIDw8PSA3OworCWsgfD0gKCprZXkrKykgPj4gMTsKKwlrIDw8PSA3OworCWsgfD0gKCprZXkrKykgPj4gMTsKKwlrIDw8PSA3OworCWsgfD0gKCprZXkrKykgPj4gMTsKKwlrIDw8PSA3OworCWsgfD0gKCprZXkrKykgPj4gMTsKKwlrIDw8PSA3OworCWsgfD0gKCprZXkpID4+IDE7CisKKwkvKiBVc2UgbG93ZXIgMzIgYml0cyBmb3Igc2NoZWR1bGUsIHJvdGF0ZSBieSAxMSBlYWNoIHJvdW5kICgxNiB0aW1lcykgKi8KKwljdHgtPnNjaGVkWzB4MF0gPSBiZTMyX3RvX2NwdShrKTsgcm9yNTZfNjQoaywgMTEpOworCWN0eC0+c2NoZWRbMHgxXSA9IGJlMzJfdG9fY3B1KGspOyByb3I1Nl82NChrLCAxMSk7CisJY3R4LT5zY2hlZFsweDJdID0gYmUzMl90b19jcHUoayk7IHJvcjU2XzY0KGssIDExKTsKKwljdHgtPnNjaGVkWzB4M10gPSBiZTMyX3RvX2NwdShrKTsgcm9yNTZfNjQoaywgMTEpOworCWN0eC0+c2NoZWRbMHg0XSA9IGJlMzJfdG9fY3B1KGspOyByb3I1Nl82NChrLCAxMSk7CisJY3R4LT5zY2hlZFsweDVdID0gYmUzMl90b19jcHUoayk7IHJvcjU2XzY0KGssIDExKTsKKwljdHgtPnNjaGVkWzB4Nl0gPSBiZTMyX3RvX2NwdShrKTsgcm9yNTZfNjQoaywgMTEpOworCWN0eC0+c2NoZWRbMHg3XSA9IGJlMzJfdG9fY3B1KGspOyByb3I1Nl82NChrLCAxMSk7CisJY3R4LT5zY2hlZFsweDhdID0gYmUzMl90b19jcHUoayk7IHJvcjU2XzY0KGssIDExKTsKKwljdHgtPnNjaGVkWzB4OV0gPSBiZTMyX3RvX2NwdShrKTsgcm9yNTZfNjQoaywgMTEpOworCWN0eC0+c2NoZWRbMHhhXSA9IGJlMzJfdG9fY3B1KGspOyByb3I1Nl82NChrLCAxMSk7CisJY3R4LT5zY2hlZFsweGJdID0gYmUzMl90b19jcHUoayk7IHJvcjU2XzY0KGssIDExKTsKKwljdHgtPnNjaGVkWzB4Y10gPSBiZTMyX3RvX2NwdShrKTsgcm9yNTZfNjQoaywgMTEpOworCWN0eC0+c2NoZWRbMHhkXSA9IGJlMzJfdG9fY3B1KGspOyByb3I1Nl82NChrLCAxMSk7CisJY3R4LT5zY2hlZFsweGVdID0gYmUzMl90b19jcHUoayk7IHJvcjU2XzY0KGssIDExKTsKKwljdHgtPnNjaGVkWzB4Zl0gPSBiZTMyX3RvX2NwdShrKTsKKworCXJldHVybiAwOworI2Vsc2UKKwl1MzIgaGksIGxvOwkJLyogaGkgaXMgdXBwZXIgMjQgYml0cyBhbmQgbG8gbG93ZXIgMzIsIHRvdGFsIDU2ICovCisKKwkvKiBkaXNjYXJkIHRoZSBwYXJpdHkgYml0cyAqLworCWxvID0gKCprZXkrKykgPj4gMTsKKwlsbyA8PD0gNzsKKwlsbyB8PSAoKmtleSsrKSA+PiAxOworCWxvIDw8PSA3OworCWxvIHw9ICgqa2V5KyspID4+IDE7CisJbG8gPDw9IDc7CisJbG8gfD0gKCprZXkrKykgPj4gMTsKKwloaSA9IGxvID4+IDQ7CisJbG8gJj0gMHhmOworCWxvIDw8PSA3OworCWxvIHw9ICgqa2V5KyspID4+IDE7CisJbG8gPDw9IDc7CisJbG8gfD0gKCprZXkrKykgPj4gMTsKKwlsbyA8PD0gNzsKKwlsbyB8PSAoKmtleSsrKSA+PiAxOworCWxvIDw8PSA3OworCWxvIHw9ICgqa2V5KSA+PiAxOworCisJLyogVXNlIGxvd2VyIDMyIGJpdHMgZm9yIHNjaGVkdWxlLCByb3RhdGUgYnkgMTEgZWFjaCByb3VuZCAoMTYgdGltZXMpICovCisJY3R4LT5zY2hlZFsweDBdID0gYmUzMl90b19jcHUobG8pOyByb3I1NihoaSwgbG8sIDExKTsKKwljdHgtPnNjaGVkWzB4MV0gPSBiZTMyX3RvX2NwdShsbyk7IHJvcjU2KGhpLCBsbywgMTEpOworCWN0eC0+c2NoZWRbMHgyXSA9IGJlMzJfdG9fY3B1KGxvKTsgcm9yNTYoaGksIGxvLCAxMSk7CisJY3R4LT5zY2hlZFsweDNdID0gYmUzMl90b19jcHUobG8pOyByb3I1NihoaSwgbG8sIDExKTsKKwljdHgtPnNjaGVkWzB4NF0gPSBiZTMyX3RvX2NwdShsbyk7IHJvcjU2KGhpLCBsbywgMTEpOworCWN0eC0+c2NoZWRbMHg1XSA9IGJlMzJfdG9fY3B1KGxvKTsgcm9yNTYoaGksIGxvLCAxMSk7CisJY3R4LT5zY2hlZFsweDZdID0gYmUzMl90b19jcHUobG8pOyByb3I1NihoaSwgbG8sIDExKTsKKwljdHgtPnNjaGVkWzB4N10gPSBiZTMyX3RvX2NwdShsbyk7IHJvcjU2KGhpLCBsbywgMTEpOworCWN0eC0+c2NoZWRbMHg4XSA9IGJlMzJfdG9fY3B1KGxvKTsgcm9yNTYoaGksIGxvLCAxMSk7CisJY3R4LT5zY2hlZFsweDldID0gYmUzMl90b19jcHUobG8pOyByb3I1NihoaSwgbG8sIDExKTsKKwljdHgtPnNjaGVkWzB4YV0gPSBiZTMyX3RvX2NwdShsbyk7IHJvcjU2KGhpLCBsbywgMTEpOworCWN0eC0+c2NoZWRbMHhiXSA9IGJlMzJfdG9fY3B1KGxvKTsgcm9yNTYoaGksIGxvLCAxMSk7CisJY3R4LT5zY2hlZFsweGNdID0gYmUzMl90b19jcHUobG8pOyByb3I1NihoaSwgbG8sIDExKTsKKwljdHgtPnNjaGVkWzB4ZF0gPSBiZTMyX3RvX2NwdShsbyk7IHJvcjU2KGhpLCBsbywgMTEpOworCWN0eC0+c2NoZWRbMHhlXSA9IGJlMzJfdG9fY3B1KGxvKTsgcm9yNTYoaGksIGxvLCAxMSk7CisJY3R4LT5zY2hlZFsweGZdID0gYmUzMl90b19jcHUobG8pOworCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBmY3J5cHRfYWxnID0geworCS5jcmFfbmFtZQkJPQkiZmNyeXB0IiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JOCwKKwkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBmY3J5cHRfY3R4KSwKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2FsaWdubWFzawkJPQkzLAorCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVChmY3J5cHRfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UJCQk9CXsgLmNpcGhlciA9IHsKKwkuY2lhX21pbl9rZXlzaXplCT0JOCwKKwkuY2lhX21heF9rZXlzaXplCT0JOCwKKwkuY2lhX3NldGtleQkJPQlmY3J5cHRfc2V0a2V5LAorCS5jaWFfZW5jcnlwdAkJPQlmY3J5cHRfZW5jcnlwdCwKKwkuY2lhX2RlY3J5cHQJCT0JZmNyeXB0X2RlY3J5cHQgfSB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJmZjcnlwdF9hbGcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZmNyeXB0X2FsZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRkNyeXB0IENpcGhlciBBbGdvcml0aG0iKTsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJlZGhhdC5jb20+Iik7CmRpZmYgLS1naXQgYS9jcnlwdG8vaGFzaC5jIGIvY3J5cHRvL2hhc2guYwppbmRleCBjZGVjMjNkLi4xMmM0NTE0IDEwMDY0NAotLS0gYS9jcnlwdG8vaGFzaC5jCisrKyBiL2NyeXB0by9oYXNoLmMKQEAgLTE2LDEyICsxNiwxMyBAQAogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdG9faGFzaF9jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCitzdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0b19oYXNoX2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZywgdTMyIHR5cGUsCisJCQkJCXUzMiBtYXNrKQogewogCXJldHVybiBhbGctPmNyYV9jdHhzaXplOwogfQogCi1zdGF0aWMgaW50IGNyeXB0b19pbml0X2hhc2hfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCitzdGF0aWMgaW50IGNyeXB0b19pbml0X2hhc2hfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiB0eXBlLCB1MzIgbWFzaykKIHsKIAlzdHJ1Y3QgaGFzaF90Zm0gKmNydCA9ICZ0Zm0tPmNydF9oYXNoOwogCXN0cnVjdCBoYXNoX2FsZyAqYWxnID0gJnRmbS0+X19jcnRfYWxnLT5jcmFfaGFzaDsKZGlmZiAtLWdpdCBhL2NyeXB0by9obWFjLmMgYi9jcnlwdG8vaG1hYy5jCmluZGV4IGI1MjFiY2QuLjQ0MTg3YzUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9obWFjLmMKKysrIGIvY3J5cHRvL2htYWMuYwpAQCAtMTcyLDE1ICsxNzIsMTYgQEAKIAogc3RhdGljIGludCBobWFjX2luaXRfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7CisJc3RydWN0IGNyeXB0b19oYXNoICpoYXNoOwogCXN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QgPSAodm9pZCAqKXRmbS0+X19jcnRfYWxnOwogCXN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduID0gY3J5cHRvX2luc3RhbmNlX2N0eChpbnN0KTsKIAlzdHJ1Y3QgaG1hY19jdHggKmN0eCA9IGhtYWNfY3R4KF9fY3J5cHRvX2hhc2hfY2FzdCh0Zm0pKTsKIAotCXRmbSA9IGNyeXB0b19zcGF3bl90Zm0oc3Bhd24pOwotCWlmIChJU19FUlIodGZtKSkKLQkJcmV0dXJuIFBUUl9FUlIodGZtKTsKKwloYXNoID0gY3J5cHRvX3NwYXduX2hhc2goc3Bhd24pOworCWlmIChJU19FUlIoaGFzaCkpCisJCXJldHVybiBQVFJfRVJSKGhhc2gpOwogCi0JY3R4LT5jaGlsZCA9IGNyeXB0b19oYXNoX2Nhc3QodGZtKTsKKwljdHgtPmNoaWxkID0gaGFzaDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL2ludGVybmFsLmggYi9jcnlwdG8vaW50ZXJuYWwuaAppbmRleCAyZGE2YWQ0Li42MGFjYWQ5IDEwMDY0NAotLS0gYS9jcnlwdG8vaW50ZXJuYWwuaAorKysgYi9jcnlwdG8vaW50ZXJuYWwuaApAQCAtODMsOCArODMsNyBAQAogeyB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2RpZ2VzdF9jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsCi0JCQkJCQkgaW50IGZsYWdzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2RpZ2VzdF9jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiB7CiAJdW5zaWduZWQgaW50IGxlbiA9IGFsZy0+Y3JhX2N0eHNpemU7CiAKQEAgLTk2LDIzICs5NSwxMiBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19jaXBoZXJfY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLAotCQkJCQkJIGludCBmbGFncykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19jaXBoZXJfY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogewotCXVuc2lnbmVkIGludCBsZW4gPSBhbGctPmNyYV9jdHhzaXplOwotCQotCXN3aXRjaCAoZmxhZ3MgJiBDUllQVE9fVEZNX01PREVfTUFTSykgewotCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0NCQzoKLQkJbGVuID0gQUxJR04obGVuLCAodW5zaWduZWQgbG9uZylhbGctPmNyYV9hbGlnbm1hc2sgKyAxKTsKLQkJbGVuICs9IGFsZy0+Y3JhX2Jsb2Nrc2l6ZTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGxlbjsKKwlyZXR1cm4gYWxnLT5jcmFfY3R4c2l6ZTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2NvbXByZXNzX2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZywKLQkJCQkJCSAgIGludCBmbGFncykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19jb21wcmVzc19jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiB7CiAJcmV0dXJuIGFsZy0+Y3JhX2N0eHNpemU7CiB9CkBAIC0xMjEsMTAgKzEwOSw2IEBACiBzdHJ1Y3QgY3J5cHRvX2FsZyAqX19jcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogCi1pbnQgY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7Ci1pbnQgY3J5cHRvX2luaXRfY2lwaGVyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7Ci1pbnQgY3J5cHRvX2luaXRfY29tcHJlc3NfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKLQogaW50IGNyeXB0b19pbml0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CiBpbnQgY3J5cHRvX2luaXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKIGludCBjcnlwdG9faW5pdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CkBAIC0xMzYsNyArMTIwLDggQEAKIHZvaWQgY3J5cHRvX2xhcnZhbF9lcnJvcihjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogCiB2b2lkIGNyeXB0b19zaG9vdF9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7Ci1zdHJ1Y3QgY3J5cHRvX3RmbSAqX19jcnlwdG9fYWxsb2NfdGZtKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsIHUzMiBmbGFncyk7CitzdHJ1Y3QgY3J5cHRvX3RmbSAqX19jcnlwdG9fYWxsb2NfdGZtKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsIHUzMiB0eXBlLAorCQkJCSAgICAgIHUzMiBtYXNrKTsKIAogaW50IGNyeXB0b19yZWdpc3Rlcl9pbnN0YW5jZShzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsLAogCQkJICAgICBzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0KTsKZGlmZiAtLWdpdCBhL2NyeXB0by9scncuYyBiL2NyeXB0by9scncuYwppbmRleCA1NjY0MjU4Li5iNDEwNTA4IDEwMDY0NAotLS0gYS9jcnlwdG8vbHJ3LmMKKysrIGIvY3J5cHRvL2xydy5jCkBAIC0yMDEsMjEgKzIwMSwyMiBAQAogCiBzdGF0aWMgaW50IGluaXRfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKmNpcGhlcjsKIAlzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0ID0gKHZvaWQgKil0Zm0tPl9fY3J0X2FsZzsKIAlzdHJ1Y3QgY3J5cHRvX3NwYXduICpzcGF3biA9IGNyeXB0b19pbnN0YW5jZV9jdHgoaW5zdCk7CiAJc3RydWN0IHByaXYgKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJdTMyICpmbGFncyA9ICZ0Zm0tPmNydF9mbGFnczsKIAotCXRmbSA9IGNyeXB0b19zcGF3bl90Zm0oc3Bhd24pOwotCWlmIChJU19FUlIodGZtKSkKLQkJcmV0dXJuIFBUUl9FUlIodGZtKTsKKwljaXBoZXIgPSBjcnlwdG9fc3Bhd25fY2lwaGVyKHNwYXduKTsKKwlpZiAoSVNfRVJSKGNpcGhlcikpCisJCXJldHVybiBQVFJfRVJSKGNpcGhlcik7CiAKLQlpZiAoY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkgIT0gMTYpIHsKKwlpZiAoY3J5cHRvX2NpcGhlcl9ibG9ja3NpemUoY2lwaGVyKSAhPSAxNikgewogCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY3R4LT5jaGlsZCA9IGNyeXB0b19jaXBoZXJfY2FzdCh0Zm0pOworCWN0eC0+Y2hpbGQgPSBjaXBoZXI7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9wY2JjLmMgYi9jcnlwdG8vcGNiYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNzRkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vcGNiYy5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogUENCQzogUHJvcGFnYXRpbmcgQ2lwaGVyIEJsb2NrIENoYWluaW5nIG1vZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIERlcml2ZWQgZnJvbSBjYmMuYworICogLSBDb3B5cmlnaHQgKGMpIDIwMDYgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxjcnlwdG8vYWxnYXBpLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitzdHJ1Y3QgY3J5cHRvX3BjYmNfY3R4IHsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqY2hpbGQ7CisJdm9pZCAoKnhvcikodTggKmRzdCwgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGJzKTsKK307CisKK3N0YXRpYyBpbnQgY3J5cHRvX3BjYmNfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICpwYXJlbnQsIGNvbnN0IHU4ICprZXksCisJCQkgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBjcnlwdG9fcGNiY19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHBhcmVudCk7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKmNoaWxkID0gY3R4LT5jaGlsZDsKKwlpbnQgZXJyOworCisJY3J5cHRvX2NpcGhlcl9jbGVhcl9mbGFncyhjaGlsZCwgQ1JZUFRPX1RGTV9SRVFfTUFTSyk7CisJY3J5cHRvX2NpcGhlcl9zZXRfZmxhZ3MoY2hpbGQsIGNyeXB0b190Zm1fZ2V0X2ZsYWdzKHBhcmVudCkgJgorCQkJCUNSWVBUT19URk1fUkVRX01BU0spOworCWVyciA9IGNyeXB0b19jaXBoZXJfc2V0a2V5KGNoaWxkLCBrZXksIGtleWxlbik7CisJY3J5cHRvX3RmbV9zZXRfZmxhZ3MocGFyZW50LCBjcnlwdG9fY2lwaGVyX2dldF9mbGFncyhjaGlsZCkgJgorCQkJICAgICBDUllQVE9fVEZNX1JFU19NQVNLKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNyeXB0b19wY2JjX2VuY3J5cHRfc2VnbWVudChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJICAgICAgIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaywKKwkJCQkgICAgICAgc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwKKwkJCQkgICAgICAgdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKiwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCkpCit7CisJdm9pZCAoKmZuKShzdHJ1Y3QgY3J5cHRvX3RmbSAqLCB1OCAqLCBjb25zdCB1OCAqKSA9CisJCWNyeXB0b19jaXBoZXJfYWxnKHRmbSktPmNpYV9lbmNyeXB0OworCWludCBic2l6ZSA9IGNyeXB0b19jaXBoZXJfYmxvY2tzaXplKHRmbSk7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1OCAqc3JjID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKKwl1OCAqZHN0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKKwl1OCAqaXYgPSB3YWxrLT5pdjsKKworCWRvIHsKKwkJeG9yKGl2LCBzcmMsIGJzaXplKTsKKwkJZm4oY3J5cHRvX2NpcGhlcl90Zm0odGZtKSwgZHN0LCBpdik7CisJCW1lbWNweShpdiwgZHN0LCBic2l6ZSk7CisJCXhvcihpdiwgc3JjLCBic2l6ZSk7CisKKwkJc3JjICs9IGJzaXplOworCQlkc3QgKz0gYnNpemU7CisJfSB3aGlsZSAoKG5ieXRlcyAtPSBic2l6ZSkgPj0gYnNpemUpOworCisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIGludCBjcnlwdG9fcGNiY19lbmNyeXB0X2lucGxhY2Uoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAorCQkJCSAgICAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGssCisJCQkJICAgICAgIHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0sCisJCQkJICAgICAgIHZvaWQgKCp4b3IpKHU4ICosIGNvbnN0IHU4ICosCisJCQkJCQkgICB1bnNpZ25lZCBpbnQpKQoreworCXZvaWQgKCpmbikoc3RydWN0IGNyeXB0b190Zm0gKiwgdTggKiwgY29uc3QgdTggKikgPQorCQljcnlwdG9fY2lwaGVyX2FsZyh0Zm0pLT5jaWFfZW5jcnlwdDsKKwlpbnQgYnNpemUgPSBjcnlwdG9fY2lwaGVyX2Jsb2Nrc2l6ZSh0Zm0pOworCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7CisJdTggKnNyYyA9IHdhbGstPnNyYy52aXJ0LmFkZHI7CisJdTggKml2ID0gd2Fsay0+aXY7CisJdTggdG1wYnVmW2JzaXplXTsKKworCWRvIHsKKwkJbWVtY3B5KHRtcGJ1Ziwgc3JjLCBic2l6ZSk7CisJCXhvcihpdiwgdG1wYnVmLCBic2l6ZSk7CisJCWZuKGNyeXB0b19jaXBoZXJfdGZtKHRmbSksIHNyYywgaXYpOworCQltZW1jcHkoaXYsIHNyYywgYnNpemUpOworCQl4b3IoaXYsIHRtcGJ1ZiwgYnNpemUpOworCisJCXNyYyArPSBic2l6ZTsKKwl9IHdoaWxlICgobmJ5dGVzIC09IGJzaXplKSA+PSBic2l6ZSk7CisKKwltZW1jcHkod2Fsay0+aXYsIGl2LCBic2l6ZSk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgaW50IGNyeXB0b19wY2JjX2VuY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAorCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0gPSBkZXNjLT50Zm07CisJc3RydWN0IGNyeXB0b19wY2JjX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgodGZtKTsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqY2hpbGQgPSBjdHgtPmNoaWxkOworCXZvaWQgKCp4b3IpKHU4ICosIGNvbnN0IHU4ICosIHVuc2lnbmVkIGludCBicykgPSBjdHgtPnhvcjsKKwlpbnQgZXJyOworCisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGsubmJ5dGVzKSkgeworCQlpZiAod2Fsay5zcmMudmlydC5hZGRyID09IHdhbGsuZHN0LnZpcnQuYWRkcikKKwkJCW5ieXRlcyA9IGNyeXB0b19wY2JjX2VuY3J5cHRfaW5wbGFjZShkZXNjLCAmd2FsaywgY2hpbGQsCisJCQkJCQkJICAgICB4b3IpOworCQllbHNlCisJCQluYnl0ZXMgPSBjcnlwdG9fcGNiY19lbmNyeXB0X3NlZ21lbnQoZGVzYywgJndhbGssIGNoaWxkLAorCQkJCQkJCSAgICAgeG9yKTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgbmJ5dGVzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNyeXB0b19wY2JjX2RlY3J5cHRfc2VnbWVudChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJICAgICAgIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaywKKwkJCQkgICAgICAgc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwKKwkJCQkgICAgICAgdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKiwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCkpCit7CisJdm9pZCAoKmZuKShzdHJ1Y3QgY3J5cHRvX3RmbSAqLCB1OCAqLCBjb25zdCB1OCAqKSA9CisJCWNyeXB0b19jaXBoZXJfYWxnKHRmbSktPmNpYV9kZWNyeXB0OworCWludCBic2l6ZSA9IGNyeXB0b19jaXBoZXJfYmxvY2tzaXplKHRmbSk7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1OCAqc3JjID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKKwl1OCAqZHN0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKKwl1OCAqaXYgPSB3YWxrLT5pdjsKKworCWRvIHsKKwkJZm4oY3J5cHRvX2NpcGhlcl90Zm0odGZtKSwgZHN0LCBzcmMpOworCQl4b3IoZHN0LCBpdiwgYnNpemUpOworCQltZW1jcHkoaXYsIHNyYywgYnNpemUpOworCQl4b3IoaXYsIGRzdCwgYnNpemUpOworCisJCXNyYyArPSBic2l6ZTsKKwkJZHN0ICs9IGJzaXplOworCX0gd2hpbGUgKChuYnl0ZXMgLT0gYnNpemUpID49IGJzaXplKTsKKworCW1lbWNweSh3YWxrLT5pdiwgaXYsIGJzaXplKTsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3BjYmNfZGVjcnlwdF9pbnBsYWNlKHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkgICAgICAgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrLAorCQkJCSAgICAgICBzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLAorCQkJCSAgICAgICB2b2lkICgqeG9yKSh1OCAqLCBjb25zdCB1OCAqLAorCQkJCQkJICAgdW5zaWduZWQgaW50KSkKK3sKKwl2b2lkICgqZm4pKHN0cnVjdCBjcnlwdG9fdGZtICosIHU4ICosIGNvbnN0IHU4ICopID0KKwkJY3J5cHRvX2NpcGhlcl9hbGcodGZtKS0+Y2lhX2RlY3J5cHQ7CisJaW50IGJzaXplID0gY3J5cHRvX2NpcGhlcl9ibG9ja3NpemUodGZtKTsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gd2Fsay0+bmJ5dGVzOworCXU4ICpzcmMgPSB3YWxrLT5zcmMudmlydC5hZGRyOworCXU4ICppdiA9IHdhbGstPml2OworCXU4IHRtcGJ1Zltic2l6ZV07CisKKwlkbyB7CisJCW1lbWNweSh0bXBidWYsIHNyYywgYnNpemUpOworCQlmbihjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pLCBzcmMsIHNyYyk7CisJCXhvcihzcmMsIGl2LCBic2l6ZSk7CisJCW1lbWNweShpdiwgdG1wYnVmLCBic2l6ZSk7CisJCXhvcihpdiwgc3JjLCBic2l6ZSk7CisKKwkJc3JjICs9IGJzaXplOworCX0gd2hpbGUgKChuYnl0ZXMgLT0gYnNpemUpID49IGJzaXplKTsKKworCW1lbWNweSh3YWxrLT5pdiwgaXYsIGJzaXplKTsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3BjYmNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSA9IGRlc2MtPnRmbTsKKwlzdHJ1Y3QgY3J5cHRvX3BjYmNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eCh0Zm0pOworCXN0cnVjdCBjcnlwdG9fY2lwaGVyICpjaGlsZCA9IGN0eC0+Y2hpbGQ7CisJdm9pZCAoKnhvcikodTggKiwgY29uc3QgdTggKiwgdW5zaWduZWQgaW50IGJzKSA9IGN0eC0+eG9yOworCWludCBlcnI7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCWlmICh3YWxrLnNyYy52aXJ0LmFkZHIgPT0gd2Fsay5kc3QudmlydC5hZGRyKQorCQkJbmJ5dGVzID0gY3J5cHRvX3BjYmNfZGVjcnlwdF9pbnBsYWNlKGRlc2MsICZ3YWxrLCBjaGlsZCwKKwkJCQkJCQkgICAgIHhvcik7CisJCWVsc2UKKwkJCW5ieXRlcyA9IGNyeXB0b19wY2JjX2RlY3J5cHRfc2VnbWVudChkZXNjLCAmd2FsaywgY2hpbGQsCisJCQkJCQkJICAgICB4b3IpOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHhvcl9ieXRlKHU4ICphLCBjb25zdCB1OCAqYiwgdW5zaWduZWQgaW50IGJzKQoreworCWRvIHsKKwkJKmErKyBePSAqYisrOworCX0gd2hpbGUgKC0tYnMpOworfQorCitzdGF0aWMgdm9pZCB4b3JfcXVhZCh1OCAqZHN0LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgYnMpCit7CisJdTMyICphID0gKHUzMiAqKWRzdDsKKwl1MzIgKmIgPSAodTMyICopc3JjOworCisJZG8geworCQkqYSsrIF49ICpiKys7CisJfSB3aGlsZSAoKGJzIC09IDQpKTsKK30KKworc3RhdGljIHZvaWQgeG9yXzY0KHU4ICphLCBjb25zdCB1OCAqYiwgdW5zaWduZWQgaW50IGJzKQoreworCSgodTMyICopYSlbMF0gXj0gKCh1MzIgKiliKVswXTsKKwkoKHUzMiAqKWEpWzFdIF49ICgodTMyICopYilbMV07Cit9CisKK3N0YXRpYyB2b2lkIHhvcl8xMjgodTggKmEsIGNvbnN0IHU4ICpiLCB1bnNpZ25lZCBpbnQgYnMpCit7CisJKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOworCSgodTMyICopYSlbMV0gXj0gKCh1MzIgKiliKVsxXTsKKwkoKHUzMiAqKWEpWzJdIF49ICgodTMyICopYilbMl07CisJKCh1MzIgKilhKVszXSBePSAoKHUzMiAqKWIpWzNdOworfQorCitzdGF0aWMgaW50IGNyeXB0b19wY2JjX2luaXRfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCA9ICh2b2lkICopdGZtLT5fX2NydF9hbGc7CisJc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24gPSBjcnlwdG9faW5zdGFuY2VfY3R4KGluc3QpOworCXN0cnVjdCBjcnlwdG9fcGNiY19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKmNpcGhlcjsKKworCXN3aXRjaCAoY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpIHsKKwljYXNlIDg6CisJCWN0eC0+eG9yID0geG9yXzY0OworCQlicmVhazsKKworCWNhc2UgMTY6CisJCWN0eC0+eG9yID0geG9yXzEyODsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAoY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkgJSA0KQorCQkJY3R4LT54b3IgPSB4b3JfYnl0ZTsKKwkJZWxzZQorCQkJY3R4LT54b3IgPSB4b3JfcXVhZDsKKwl9CisKKwljaXBoZXIgPSBjcnlwdG9fc3Bhd25fY2lwaGVyKHNwYXduKTsKKwlpZiAoSVNfRVJSKGNpcGhlcikpCisJCXJldHVybiBQVFJfRVJSKGNpcGhlcik7CisKKwljdHgtPmNoaWxkID0gY2lwaGVyOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjcnlwdG9fcGNiY19leGl0X3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBjcnlwdG9fcGNiY19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJY3J5cHRvX2ZyZWVfY2lwaGVyKGN0eC0+Y2hpbGQpOworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqY3J5cHRvX3BjYmNfYWxsb2Modm9pZCAqcGFyYW0sIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCisJYWxnID0gY3J5cHRvX2dldF9hdHRyX2FsZyhwYXJhbSwgbGVuLCBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAorCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0sgfCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKGFsZykpCisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYWxnKSk7CisKKwlpbnN0ID0gY3J5cHRvX2FsbG9jX2luc3RhbmNlKCJwY2JjIiwgYWxnKTsKKwlpZiAoSVNfRVJSKGluc3QpKQorCQlnb3RvIG91dF9wdXRfYWxnOworCisJaW5zdC0+YWxnLmNyYV9mbGFncyA9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVI7CisJaW5zdC0+YWxnLmNyYV9wcmlvcml0eSA9IGFsZy0+Y3JhX3ByaW9yaXR5OworCWluc3QtPmFsZy5jcmFfYmxvY2tzaXplID0gYWxnLT5jcmFfYmxvY2tzaXplOworCWluc3QtPmFsZy5jcmFfYWxpZ25tYXNrID0gYWxnLT5jcmFfYWxpZ25tYXNrOworCWluc3QtPmFsZy5jcmFfdHlwZSA9ICZjcnlwdG9fYmxrY2lwaGVyX3R5cGU7CisKKwlpZiAoIShhbGctPmNyYV9ibG9ja3NpemUgJSA0KSkKKwkJaW5zdC0+YWxnLmNyYV9hbGlnbm1hc2sgfD0gMzsKKwlpbnN0LT5hbGcuY3JhX2Jsa2NpcGhlci5pdnNpemUgPSBhbGctPmNyYV9ibG9ja3NpemU7CisJaW5zdC0+YWxnLmNyYV9ibGtjaXBoZXIubWluX2tleXNpemUgPSBhbGctPmNyYV9jaXBoZXIuY2lhX21pbl9rZXlzaXplOworCWluc3QtPmFsZy5jcmFfYmxrY2lwaGVyLm1heF9rZXlzaXplID0gYWxnLT5jcmFfY2lwaGVyLmNpYV9tYXhfa2V5c2l6ZTsKKworCWluc3QtPmFsZy5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgY3J5cHRvX3BjYmNfY3R4KTsKKworCWluc3QtPmFsZy5jcmFfaW5pdCA9IGNyeXB0b19wY2JjX2luaXRfdGZtOworCWluc3QtPmFsZy5jcmFfZXhpdCA9IGNyeXB0b19wY2JjX2V4aXRfdGZtOworCisJaW5zdC0+YWxnLmNyYV9ibGtjaXBoZXIuc2V0a2V5ID0gY3J5cHRvX3BjYmNfc2V0a2V5OworCWluc3QtPmFsZy5jcmFfYmxrY2lwaGVyLmVuY3J5cHQgPSBjcnlwdG9fcGNiY19lbmNyeXB0OworCWluc3QtPmFsZy5jcmFfYmxrY2lwaGVyLmRlY3J5cHQgPSBjcnlwdG9fcGNiY19kZWNyeXB0OworCitvdXRfcHV0X2FsZzoKKwljcnlwdG9fbW9kX3B1dChhbGcpOworCXJldHVybiBpbnN0OworfQorCitzdGF0aWMgdm9pZCBjcnlwdG9fcGNiY19mcmVlKHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QpCit7CisJY3J5cHRvX2Ryb3Bfc3Bhd24oY3J5cHRvX2luc3RhbmNlX2N0eChpbnN0KSk7CisJa2ZyZWUoaW5zdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlIGNyeXB0b19wY2JjX3RtcGwgPSB7CisJLm5hbWUgPSAicGNiYyIsCisJLmFsbG9jID0gY3J5cHRvX3BjYmNfYWxsb2MsCisJLmZyZWUgPSBjcnlwdG9fcGNiY19mcmVlLAorCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNyeXB0b19wY2JjX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl90ZW1wbGF0ZSgmY3J5cHRvX3BjYmNfdG1wbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcnlwdG9fcGNiY19tb2R1bGVfZXhpdCh2b2lkKQoreworCWNyeXB0b191bnJlZ2lzdGVyX3RlbXBsYXRlKCZjcnlwdG9fcGNiY190bXBsKTsKK30KKworbW9kdWxlX2luaXQoY3J5cHRvX3BjYmNfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoY3J5cHRvX3BjYmNfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDQkMgYmxvY2sgY2lwaGVyIGFsZ29yaXRobSIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3RjcnlwdC5jIGIvY3J5cHRvL3RjcnlwdC5jCmluZGV4IGQ2NzFlODkuLmY1ZTlkYTMgMTAwNjQ0Ci0tLSBhL2NyeXB0by90Y3J5cHQuYworKysgYi9jcnlwdG8vdGNyeXB0LmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICoKKyAqIDIwMDYtMTItMDcgQWRkZWQgU0hBMzg0IEhNQUMgYW5kIFNIQTUxMiBITUFDIHRlc3RzCiAgKiAyMDA0LTA4LTA5IEFkZGVkIGNpcGhlciBzcGVlZCB0ZXN0cyAoUmV5ayBGbG9ldGVyIDxyZXlrQHZhbnRyb25peC5uZXQ+KQogICogMjAwMy0wOS0xNCBSZXdyaXR0ZW4gYnkgS2FydGlrZXkgTWFoZW5kcmEgQmhhdHQKICAqCkBAIC03MSw3ICs3Miw4IEBACiAJImRlcyIsICJtZDUiLCAiZGVzM19lZGUiLCAicm90MTMiLCAic2hhMSIsICJzaGEyNTYiLCAiYmxvd2Zpc2giLAogCSJ0d29maXNoIiwgInNlcnBlbnQiLCAic2hhMzg0IiwgInNoYTUxMiIsICJtZDQiLCAiYWVzIiwgImNhc3Q2IiwKIAkiYXJjNCIsICJtaWNoYWVsX21pYyIsICJkZWZsYXRlIiwgImNyYzMyYyIsICJ0ZWEiLCAieHRlYSIsCi0JImtoYXphZCIsICJ3cDUxMiIsICJ3cDM4NCIsICJ3cDI1NiIsICJ0bmVwcmVzIiwgInhldGEiLCBOVUxMCisJImtoYXphZCIsICJ3cDUxMiIsICJ3cDM4NCIsICJ3cDI1NiIsICJ0bmVwcmVzIiwgInhldGEiLCAgImZjcnlwdCIsCisJImNhbWVsbGlhIiwgTlVMTAogfTsKIAogc3RhdGljIHZvaWQgaGV4ZHVtcCh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW4pCkBAIC03NjUsNyArNzY3LDcgQEAKIAltZW1jcHkodHZtZW0sIGRlZmxhdGVfY29tcF90dl90ZW1wbGF0ZSwgdHNpemUpOwogCXR2ID0gKHZvaWQgKil0dm1lbTsKIAotCXRmbSA9IGNyeXB0b19hbGxvY190Zm0oImRlZmxhdGUiLCAwKTsKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfY29tcCgiZGVmbGF0ZSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOwogCWlmICh0Zm0gPT0gTlVMTCkgewogCQlwcmludGsoImZhaWxlZCB0byBsb2FkIHRyYW5zZm9ybSBmb3IgZGVmbGF0ZVxuIik7CiAJCXJldHVybjsKQEAgLTk2NCw2ICs5NjYsMjYgQEAKIAkJdGVzdF9jaXBoZXIoImVjYih4ZXRhKSIsIERFQ1JZUFQsIHhldGFfZGVjX3R2X3RlbXBsYXRlLAogCQkJICAgIFhFVEFfREVDX1RFU1RfVkVDVE9SUyk7CiAKKwkJLy9GQ3J5cHQKKwkJdGVzdF9jaXBoZXIoInBjYmMoZmNyeXB0KSIsIEVOQ1JZUFQsIGZjcnlwdF9wY2JjX2VuY190dl90ZW1wbGF0ZSwKKwkJCSAgICBGQ1JZUFRfRU5DX1RFU1RfVkVDVE9SUyk7CisJCXRlc3RfY2lwaGVyKCJwY2JjKGZjcnlwdCkiLCBERUNSWVBULCBmY3J5cHRfcGNiY19kZWNfdHZfdGVtcGxhdGUsCisJCQkgICAgRkNSWVBUX0RFQ19URVNUX1ZFQ1RPUlMpOworCisJCS8vQ0FNRUxMSUEKKwkJdGVzdF9jaXBoZXIoImVjYihjYW1lbGxpYSkiLCBFTkNSWVBULAorCQkJICAgIGNhbWVsbGlhX2VuY190dl90ZW1wbGF0ZSwKKwkJCSAgICBDQU1FTExJQV9FTkNfVEVTVF9WRUNUT1JTKTsKKwkJdGVzdF9jaXBoZXIoImVjYihjYW1lbGxpYSkiLCBERUNSWVBULAorCQkJICAgIGNhbWVsbGlhX2RlY190dl90ZW1wbGF0ZSwKKwkJCSAgICBDQU1FTExJQV9ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGVzdF9jaXBoZXIoImNiYyhjYW1lbGxpYSkiLCBFTkNSWVBULAorCQkJICAgIGNhbWVsbGlhX2NiY19lbmNfdHZfdGVtcGxhdGUsCisJCQkgICAgQ0FNRUxMSUFfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2NpcGhlcigiY2JjKGNhbWVsbGlhKSIsIERFQ1JZUFQsCisJCQkgICAgY2FtZWxsaWFfY2JjX2RlY190dl90ZW1wbGF0ZSwKKwkJCSAgICBDQU1FTExJQV9DQkNfREVDX1RFU1RfVkVDVE9SUyk7CisKIAkJdGVzdF9oYXNoKCJzaGEzODQiLCBzaGEzODRfdHZfdGVtcGxhdGUsIFNIQTM4NF9URVNUX1ZFQ1RPUlMpOwogCQl0ZXN0X2hhc2goInNoYTUxMiIsIHNoYTUxMl90dl90ZW1wbGF0ZSwgU0hBNTEyX1RFU1RfVkVDVE9SUyk7CiAJCXRlc3RfaGFzaCgid3A1MTIiLCB3cDUxMl90dl90ZW1wbGF0ZSwgV1A1MTJfVEVTVF9WRUNUT1JTKTsKQEAgLTk4MCw2ICsxMDAyLDEwIEBACiAJCQkgIEhNQUNfU0hBMV9URVNUX1ZFQ1RPUlMpOwogCQl0ZXN0X2hhc2goImhtYWMoc2hhMjU2KSIsIGhtYWNfc2hhMjU2X3R2X3RlbXBsYXRlLAogCQkJICBITUFDX1NIQTI1Nl9URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2hhc2goImhtYWMoc2hhMzg0KSIsIGhtYWNfc2hhMzg0X3R2X3RlbXBsYXRlLAorCQkJICBITUFDX1NIQTM4NF9URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2hhc2goImhtYWMoc2hhNTEyKSIsIGhtYWNfc2hhNTEyX3R2X3RlbXBsYXRlLAorCQkJICBITUFDX1NIQTUxMl9URVNUX1ZFQ1RPUlMpOwogCiAJCXRlc3RfaGFzaCgieGNiYyhhZXMpIiwgYWVzX3hjYmMxMjhfdHZfdGVtcGxhdGUsCiAJCQkgIFhDQkNfQUVTX1RFU1RfVkVDVE9SUyk7CkBAIC0xMTc3LDYgKzEyMDMsMjggQEAKIAkJCSAgICBYRVRBX0RFQ19URVNUX1ZFQ1RPUlMpOwogCQlicmVhazsKIAorCWNhc2UgMzE6CisJCXRlc3RfY2lwaGVyKCJwY2JjKGZjcnlwdCkiLCBFTkNSWVBULCBmY3J5cHRfcGNiY19lbmNfdHZfdGVtcGxhdGUsCisJCQkgICAgRkNSWVBUX0VOQ19URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2NpcGhlcigicGNiYyhmY3J5cHQpIiwgREVDUllQVCwgZmNyeXB0X3BjYmNfZGVjX3R2X3RlbXBsYXRlLAorCQkJICAgIEZDUllQVF9ERUNfVEVTVF9WRUNUT1JTKTsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQl0ZXN0X2NpcGhlcigiZWNiKGNhbWVsbGlhKSIsIEVOQ1JZUFQsCisJCQkgICAgY2FtZWxsaWFfZW5jX3R2X3RlbXBsYXRlLAorCQkJICAgIENBTUVMTElBX0VOQ19URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2NpcGhlcigiZWNiKGNhbWVsbGlhKSIsIERFQ1JZUFQsCisJCQkgICAgY2FtZWxsaWFfZGVjX3R2X3RlbXBsYXRlLAorCQkJICAgIENBTUVMTElBX0RFQ19URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2NpcGhlcigiY2JjKGNhbWVsbGlhKSIsIEVOQ1JZUFQsCisJCQkgICAgY2FtZWxsaWFfY2JjX2VuY190dl90ZW1wbGF0ZSwKKwkJCSAgICBDQU1FTExJQV9DQkNfRU5DX1RFU1RfVkVDVE9SUyk7CisJCXRlc3RfY2lwaGVyKCJjYmMoY2FtZWxsaWEpIiwgREVDUllQVCwKKwkJCSAgICBjYW1lbGxpYV9jYmNfZGVjX3R2X3RlbXBsYXRlLAorCQkJICAgIENBTUVMTElBX0NCQ19ERUNfVEVTVF9WRUNUT1JTKTsKKwkJYnJlYWs7CisKIAljYXNlIDEwMDoKIAkJdGVzdF9oYXNoKCJobWFjKG1kNSkiLCBobWFjX21kNV90dl90ZW1wbGF0ZSwKIAkJCSAgSE1BQ19NRDVfVEVTVF9WRUNUT1JTKTsKQEAgLTExOTIsNiArMTI0MCwxNiBAQAogCQkJICBITUFDX1NIQTI1Nl9URVNUX1ZFQ1RPUlMpOwogCQlicmVhazsKIAorCWNhc2UgMTAzOgorCQl0ZXN0X2hhc2goImhtYWMoc2hhMzg0KSIsIGhtYWNfc2hhMzg0X3R2X3RlbXBsYXRlLAorCQkJICBITUFDX1NIQTM4NF9URVNUX1ZFQ1RPUlMpOworCQlicmVhazsKKworCWNhc2UgMTA0OgorCQl0ZXN0X2hhc2goImhtYWMoc2hhNTEyKSIsIGhtYWNfc2hhNTEyX3R2X3RlbXBsYXRlLAorCQkJICBITUFDX1NIQTUxMl9URVNUX1ZFQ1RPUlMpOworCQlicmVhazsKKwogCiAJY2FzZSAyMDA6CiAJCXRlc3RfY2lwaGVyX3NwZWVkKCJlY2IoYWVzKSIsIEVOQ1JZUFQsIHNlYywgTlVMTCwgMCwKQEAgLTEyNjAsNiArMTMxOCwxNyBAQAogCQkJCSAgZGVzX3NwZWVkX3RlbXBsYXRlKTsKIAkJYnJlYWs7CiAKKwljYXNlIDIwNToKKwkJdGVzdF9jaXBoZXJfc3BlZWQoImVjYihjYW1lbGxpYSkiLCBFTkNSWVBULCBzZWMsIE5VTEwsIDAsCisJCQkJY2FtZWxsaWFfc3BlZWRfdGVtcGxhdGUpOworCQl0ZXN0X2NpcGhlcl9zcGVlZCgiZWNiKGNhbWVsbGlhKSIsIERFQ1JZUFQsIHNlYywgTlVMTCwgMCwKKwkJCQljYW1lbGxpYV9zcGVlZF90ZW1wbGF0ZSk7CisJCXRlc3RfY2lwaGVyX3NwZWVkKCJjYmMoY2FtZWxsaWEpIiwgRU5DUllQVCwgc2VjLCBOVUxMLCAwLAorCQkJCWNhbWVsbGlhX3NwZWVkX3RlbXBsYXRlKTsKKwkJdGVzdF9jaXBoZXJfc3BlZWQoImNiYyhjYW1lbGxpYSkiLCBERUNSWVBULCBzZWMsIE5VTEwsIDAsCisJCQkJY2FtZWxsaWFfc3BlZWRfdGVtcGxhdGUpOworCQlicmVhazsKKwogCWNhc2UgMzAwOgogCQkvKiBmYWxsIHRocm91Z2ggKi8KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL3RjcnlwdC5oIGIvY3J5cHRvL3RjcnlwdC5oCmluZGV4IDQ4YTgxMzYuLjg4NzUyN2IgMTAwNjQ0Ci0tLSBhL2NyeXB0by90Y3J5cHQuaAorKysgYi9jcnlwdG8vdGNyeXB0LmgKQEAgLTEyLDYgKzEyLDcgQEAKICAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICoKKyAqIDIwMDYtMTItMDcgQWRkZWQgU0hBMzg0IEhNQUMgYW5kIFNIQTUxMiBITUFDIHRlc3RzCiAgKiAyMDA0LTA4LTA5IENpcGhlciBzcGVlZCB0ZXN0cyBieSBSZXlrIEZsb2V0ZXIgPHJleWtAdmFudHJvbml4Lm5ldD4KICAqIDIwMDMtMDktMTQgQ2hhbmdlcyBieSBLYXJ0aWtleSBNYWhlbmRyYSBCaGF0dAogICoKQEAgLTI3LDcgKzI4LDcgQEAKIAogc3RydWN0IGhhc2hfdGVzdHZlYyB7CiAJLyogb25seSB1c2VkIHdpdGgga2V5ZWQgaGFzaCBhbGdvcml0aG1zICovCi0JY2hhciBrZXlbMTI4XSBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oNCkpKTsKKwljaGFyIGtleVsxMzJdIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyg0KSkpOwogCWNoYXIgcGxhaW50ZXh0WzI0MF07CiAJY2hhciBkaWdlc3RbTUFYX0RJR0VTVF9TSVpFXTsKIAl1bnNpZ25lZCBjaGFyIHRhcFtNQVhfVEFQXTsKQEAgLTEwMDIsNiArMTAwMywyNDggQEAKIH07CiAKIC8qCisgKiBTSEEzODQgSE1BQyB0ZXN0IHZlY3RvcnMgZnJvbSBSRkM0MjMxCisgKi8KKworI2RlZmluZSBITUFDX1NIQTM4NF9URVNUX1ZFQ1RPUlMJNAorCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBobWFjX3NoYTM4NF90dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9IHsgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwKKwkJCSAgICAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLAorCQkJICAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIgfSwgLy8gKDIwIGJ5dGVzKQorCQkua3NpemUJPSAyMCwKKwkJLnBsYWludGV4dCA9IHsgMHg0OCwgMHg2OSwgMHgyMCwgMHg1NCwgMHg2OCwgMHg2NSwgMHg3MiwgMHg2NSB9LCAvLyAoIkhpIFRoZXJlIikKKwkJLnBzaXplCT0gOCwKKwkJLmRpZ2VzdAk9IHsgMHhhZiwgMHhkMCwgMHgzOSwgMHg0NCwgMHhkOCwgMHg0OCwgMHg5NSwgMHg2MiwKKwkJCSAgICAweDZiLCAweDA4LCAweDI1LCAweGY0LCAweGFiLCAweDQ2LCAweDkwLCAweDdmLAorCQkJICAgIDB4MTUsIDB4ZjksIDB4ZGEsIDB4ZGIsIDB4ZTQsIDB4MTAsIDB4MWUsIDB4YzYsCisJCQkgICAgMHg4MiwgMHhhYSwgMHgwMywgMHg0YywgMHg3YywgMHhlYiwgMHhjNSwgMHg5YywKKwkJCSAgICAweGZhLCAweGVhLCAweDllLCAweGE5LCAweDA3LCAweDZlLCAweGRlLCAweDdmLAorCQkJICAgIDB4NGEsIDB4ZjEsIDB4NTIsIDB4ZTgsIDB4YjIsIDB4ZmEsIDB4OWMsIDB4YjYgfSwKKwl9LCB7CisJCS5rZXkJPSB7IDB4NGEsIDB4NjUsIDB4NjYsIDB4NjUgfSwgLy8gKCJKZWZlIikKKwkJLmtzaXplCT0gNCwKKwkJLnBsYWludGV4dCA9IHsgMHg3NywgMHg2OCwgMHg2MSwgMHg3NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHgyMCwKKwkJCSAgICAgICAweDc5LCAweDYxLCAweDIwLCAweDc3LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAvLyAoIndoYXQgZG8geWEgd2FudCAiKQorCQkJICAgICAgIDB4NjYsIDB4NmYsIDB4NzIsIDB4MjAsIDB4NmUsIDB4NmYsIDB4NzQsIDB4NjgsCisJCQkgICAgICAgMHg2OSwgMHg2ZSwgMHg2NywgMHgzZiB9LCAvLyAoImZvciBub3RoaW5nPyIpCisJCS5wc2l6ZQk9IDI4LAorCQkuZGlnZXN0CT0geyAweGFmLCAweDQ1LCAweGQyLCAweGUzLCAweDc2LCAweDQ4LCAweDQwLCAweDMxLAorCQkJICAgIDB4NjEsIDB4N2YsIDB4NzgsIDB4ZDIsIDB4YjUsIDB4OGEsIDB4NmIsIDB4MWIsCisJCQkgICAgMHg5YywgMHg3ZSwgMHhmNCwgMHg2NCwgMHhmNSwgMHhhMCwgMHgxYiwgMHg0NywKKwkJCSAgICAweGU0LCAweDJlLCAweGMzLCAweDczLCAweDYzLCAweDIyLCAweDQ0LCAweDVlLAorCQkJICAgIDB4OGUsIDB4MjIsIDB4NDAsIDB4Y2EsIDB4NWUsIDB4NjksIDB4ZTIsIDB4YzcsCisJCQkgICAgMHg4YiwgMHgzMiwgMHgzOSwgMHhlYywgMHhmYSwgMHhiMiwgMHgxNiwgMHg0OSB9LAorCQkubnAJPSA0LAorCQkudGFwCT0geyA3LCA3LCA3LCA3IH0KKwl9LCB7CisJCS5rZXkJPSB7IDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSB9LCAvLyAoMTMxIGJ5dGVzKQorCQkua3NpemUJPSAxMzEsCisJCS5wbGFpbnRleHQgPSB7IDB4NTQsIDB4NjUsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NTUsIDB4NzMsIDB4NjksCisJCQkgICAgICAgMHg2ZSwgMHg2NywgMHgyMCwgMHg0YywgMHg2MSwgMHg3MiwgMHg2NywgMHg2NSwgLy8gKCJUZXN0IFVzaW5nIExhcmdlIikKKwkJCSAgICAgICAweDcyLCAweDIwLCAweDU0LCAweDY4LCAweDYxLCAweDZlLCAweDIwLCAweDQyLAorCQkJICAgICAgIDB4NmMsIDB4NmYsIDB4NjMsIDB4NmIsIDB4MmQsIDB4NTMsIDB4NjksIDB4N2EsIC8vICgiciBUaGFuIEJsb2NrLVNpeiIpCisJCQkgICAgICAgMHg2NSwgMHgyMCwgMHg0YiwgMHg2NSwgMHg3OSwgMHgyMCwgMHgyZCwgMHgyMCwKKwkJCSAgICAgICAweDQ4LCAweDYxLCAweDczLCAweDY4LCAweDIwLCAweDRiLCAweDY1LCAweDc5LCAvLyAoImUgS2V5IC0gSGFzaCBLZXkiKQorCQkJICAgICAgIDB4MjAsIDB4NDYsIDB4NjksIDB4NzIsIDB4NzMsIDB4NzQgfSwgLy8gKCIgRmlyc3QiKQorCQkucHNpemUJPSA1NCwKKwkJLmRpZ2VzdAk9IHsgMHg0ZSwgMHhjZSwgMHgwOCwgMHg0NCwgMHg4NSwgMHg4MSwgMHgzZSwgMHg5MCwKKwkJCSAgICAweDg4LCAweGQyLCAweGM2LCAweDNhLCAweDA0LCAweDFiLCAweGM1LCAweGI0LAorCQkJICAgIDB4NGYsIDB4OWUsIDB4ZjEsIDB4MDEsIDB4MmEsIDB4MmIsIDB4NTgsIDB4OGYsCisJCQkgICAgMHgzYywgMHhkMSwgMHgxZiwgMHgwNSwgMHgwMywgMHgzYSwgMHhjNCwgMHhjNiwKKwkJCSAgICAweDBjLCAweDJlLCAweGY2LCAweGFiLCAweDQwLCAweDMwLCAweGZlLCAweDgyLAorCQkJICAgIDB4OTYsIDB4MjQsIDB4OGQsIDB4ZjEsIDB4NjMsIDB4ZjQsIDB4NDksIDB4NTIgfSwKKwl9LCB7CisJCS5rZXkJPSB7IDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSB9LCAvLyAoMTMxIGJ5dGVzKQorCQkua3NpemUJPSAxMzEsCisJCS5wbGFpbnRleHQgPSB7IDB4NTQsIDB4NjgsIDB4NjksIDB4NzMsIDB4MjAsIDB4NjksIDB4NzMsIDB4MjAsCisJCQkgICAgICAgMHg2MSwgMHgyMCwgMHg3NCwgMHg2NSwgMHg3MywgMHg3NCwgMHgyMCwgMHg3NSwgLy8gKCJUaGlzIGlzIGEgdGVzdCB1IikKKwkJCSAgICAgICAweDczLCAweDY5LCAweDZlLCAweDY3LCAweDIwLCAweDYxLCAweDIwLCAweDZjLAorCQkJICAgICAgIDB4NjEsIDB4NzIsIDB4NjcsIDB4NjUsIDB4NzIsIDB4MjAsIDB4NzQsIDB4NjgsIC8vICgic2luZyBhIGxhcmdlciB0aCIpCisJCQkgICAgICAgMHg2MSwgMHg2ZSwgMHgyMCwgMHg2MiwgMHg2YywgMHg2ZiwgMHg2MywgMHg2YiwKKwkJCSAgICAgICAweDJkLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDIwLCAweDZiLCAweDY1LCAvLyAoImFuIGJsb2NrLXNpemUga2UiKQorCQkJICAgICAgIDB4NzksIDB4MjAsIDB4NjEsIDB4NmUsIDB4NjQsIDB4MjAsIDB4NjEsIDB4MjAsCisJCQkgICAgICAgMHg2YywgMHg2MSwgMHg3MiwgMHg2NywgMHg2NSwgMHg3MiwgMHgyMCwgMHg3NCwgLy8gKCJ5IGFuZCBhIGxhcmdlciB0IikKKwkJCSAgICAgICAweDY4LCAweDYxLCAweDZlLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLAorCQkJICAgICAgIDB4NmIsIDB4MmQsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjAsIDB4NjQsIC8vICgiaGFuIGJsb2NrLXNpemUgZCIpCisJCQkgICAgICAgMHg2MSwgMHg3NCwgMHg2MSwgMHgyZSwgMHgyMCwgMHg1NCwgMHg2OCwgMHg2NSwKKwkJCSAgICAgICAweDIwLCAweDZiLCAweDY1LCAweDc5LCAweDIwLCAweDZlLCAweDY1LCAweDY1LCAvLyAoImF0YS4gVGhlIGtleSBuZWUiKQorCQkJICAgICAgIDB4NjQsIDB4NzMsIDB4MjAsIDB4NzQsIDB4NmYsIDB4MjAsIDB4NjIsIDB4NjUsCisJCQkgICAgICAgMHgyMCwgMHg2OCwgMHg2MSwgMHg3MywgMHg2OCwgMHg2NSwgMHg2NCwgMHgyMCwgLy8gKCJkcyB0byBiZSBoYXNoZWQgIikKKwkJCSAgICAgICAweDYyLCAweDY1LCAweDY2LCAweDZmLCAweDcyLCAweDY1LCAweDIwLCAweDYyLAorCQkJICAgICAgIDB4NjUsIDB4NjksIDB4NmUsIDB4NjcsIDB4MjAsIDB4NzUsIDB4NzMsIDB4NjUsIC8vICgiYmVmb3JlIGJlaW5nIHVzZSIpCisJCQkgICAgICAgMHg2NCwgMHgyMCwgMHg2MiwgMHg3OSwgMHgyMCwgMHg3NCwgMHg2OCwgMHg2NSwKKwkJCSAgICAgICAweDIwLCAweDQ4LCAweDRkLCAweDQxLCAweDQzLCAweDIwLCAweDYxLCAweDZjLCAvLyAoImQgYnkgdGhlIEhNQUMgYWwiKQorCQkJICAgICAgIDB4NjcsIDB4NmYsIDB4NzIsIDB4NjksIDB4NzQsIDB4NjgsIDB4NmQsIDB4MmUgfSwgLy8gKCJnb3JpdGhtLiIpCisJCS5wc2l6ZQk9IDE1MiwKKwkJLmRpZ2VzdAk9IHsgMHg2NiwgMHgxNywgMHgxNywgMHg4ZSwgMHg5NCwgMHgxZiwgMHgwMiwgMHgwZCwKKwkJCSAgICAweDM1LCAweDFlLCAweDJmLCAweDI1LCAweDRlLCAweDhmLCAweGQzLCAweDJjLAorCQkJICAgIDB4NjAsIDB4MjQsIDB4MjAsIDB4ZmUsIDB4YjAsIDB4YjgsIDB4ZmIsIDB4OWEsCisJCQkgICAgMHhkYywgMHhjZSwgMHhiYiwgMHg4MiwgMHg0NiwgMHgxZSwgMHg5OSwgMHhjNSwKKwkJCSAgICAweGE2LCAweDc4LCAweGNjLCAweDMxLCAweGU3LCAweDk5LCAweDE3LCAweDZkLAorCQkJICAgIDB4MzgsIDB4NjAsIDB4ZTYsIDB4MTEsIDB4MGMsIDB4NDYsIDB4NTIsIDB4M2UgfSwKKwl9LAorfTsKKworLyoKKyAqIFNIQTUxMiBITUFDIHRlc3QgdmVjdG9ycyBmcm9tIFJGQzQyMzEKKyAqLworCisjZGVmaW5lIEhNQUNfU0hBNTEyX1RFU1RfVkVDVE9SUwk0CisKK3N0YXRpYyBzdHJ1Y3QgaGFzaF90ZXN0dmVjIGhtYWNfc2hhNTEyX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5CT0geyAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBiLAorCQkJICAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsCisJCQkgICAgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiB9LCAvLyAoMjAgYnl0ZXMpCisJCS5rc2l6ZQk9IDIwLAorCQkucGxhaW50ZXh0ID0geyAweDQ4LCAweDY5LCAweDIwLCAweDU0LCAweDY4LCAweDY1LCAweDcyLCAweDY1IH0sIC8vICgiSGkgVGhlcmUiKQorCQkucHNpemUJPSA4LAorCQkuZGlnZXN0CT0geyAweDg3LCAweGFhLCAweDdjLCAweGRlLCAweGE1LCAweGVmLCAweDYxLCAweDlkLAorCQkJICAgIDB4NGYsIDB4ZjAsIDB4YjQsIDB4MjQsIDB4MWEsIDB4MWQsIDB4NmMsIDB4YjAsCisJCQkgICAgMHgyMywgMHg3OSwgMHhmNCwgMHhlMiwgMHhjZSwgMHg0ZSwgMHhjMiwgMHg3OCwKKwkJCSAgICAweDdhLCAweGQwLCAweGIzLCAweDA1LCAweDQ1LCAweGUxLCAweDdjLCAweGRlLAorCQkJICAgIDB4ZGEsIDB4YTgsIDB4MzMsIDB4YjcsIDB4ZDYsIDB4YjgsIDB4YTcsIDB4MDIsCisJCQkgICAgMHgwMywgMHg4YiwgMHgyNywgMHg0ZSwgMHhhZSwgMHhhMywgMHhmNCwgMHhlNCwKKwkJCSAgICAweGJlLCAweDlkLCAweDkxLCAweDRlLCAweGViLCAweDYxLCAweGYxLCAweDcwLAorCQkJICAgIDB4MmUsIDB4NjksIDB4NmMsIDB4MjAsIDB4M2EsIDB4MTIsIDB4NjgsIDB4NTQgfSwKKwl9LCB7CisJCS5rZXkJPSB7IDB4NGEsIDB4NjUsIDB4NjYsIDB4NjUgfSwgLy8gKCJKZWZlIikKKwkJLmtzaXplCT0gNCwKKwkJLnBsYWludGV4dCA9IHsgMHg3NywgMHg2OCwgMHg2MSwgMHg3NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHgyMCwKKwkJCSAgICAgICAweDc5LCAweDYxLCAweDIwLCAweDc3LCAweDYxLCAweDZlLCAweDc0LCAweDIwLCAvLyAoIndoYXQgZG8geWEgd2FudCAiKQorCQkJICAgICAgIDB4NjYsIDB4NmYsIDB4NzIsIDB4MjAsIDB4NmUsIDB4NmYsIDB4NzQsIDB4NjgsCisJCQkgICAgICAgMHg2OSwgMHg2ZSwgMHg2NywgMHgzZiB9LCAvLyAoImZvciBub3RoaW5nPyIpCisJCS5wc2l6ZQk9IDI4LAorCQkuZGlnZXN0CT0geyAweDE2LCAweDRiLCAweDdhLCAweDdiLCAweGZjLCAweGY4LCAweDE5LCAweGUyLAorCQkJICAgIDB4ZTMsIDB4OTUsIDB4ZmIsIDB4ZTcsIDB4M2IsIDB4NTYsIDB4ZTAsIDB4YTMsCisJCQkgICAgMHg4NywgMHhiZCwgMHg2NCwgMHgyMiwgMHgyZSwgMHg4MywgMHgxZiwgMHhkNiwKKwkJCSAgICAweDEwLCAweDI3LCAweDBjLCAweGQ3LCAweGVhLCAweDI1LCAweDA1LCAweDU0LAorCQkJICAgIDB4OTcsIDB4NTgsIDB4YmYsIDB4NzUsIDB4YzAsIDB4NWEsIDB4OTksIDB4NGEsCisJCQkgICAgMHg2ZCwgMHgwMywgMHg0ZiwgMHg2NSwgMHhmOCwgMHhmMCwgMHhlNiwgMHhmZCwKKwkJCSAgICAweGNhLCAweGVhLCAweGIxLCAweGEzLCAweDRkLCAweDRhLCAweDZiLCAweDRiLAorCQkJICAgIDB4NjMsIDB4NmUsIDB4MDcsIDB4MGEsIDB4MzgsIDB4YmMsIDB4ZTcsIDB4MzcgfSwKKwkJLm5wCT0gNCwKKwkJLnRhcAk9IHsgNywgNywgNywgNyB9CisJfSwgeworCQkua2V5CT0geyAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEgfSwgLy8gKDEzMSBieXRlcykKKwkJLmtzaXplCT0gMTMxLAorCQkucGxhaW50ZXh0ID0geyAweDU0LCAweDY1LCAweDczLCAweDc0LCAweDIwLCAweDU1LCAweDczLCAweDY5LAorCQkJICAgICAgIDB4NmUsIDB4NjcsIDB4MjAsIDB4NGMsIDB4NjEsIDB4NzIsIDB4NjcsIDB4NjUsIC8vICgiVGVzdCBVc2luZyBMYXJnZSIpCisJCQkgICAgICAgMHg3MiwgMHgyMCwgMHg1NCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHgyMCwgMHg0MiwKKwkJCSAgICAgICAweDZjLCAweDZmLCAweDYzLCAweDZiLCAweDJkLCAweDUzLCAweDY5LCAweDdhLCAvLyAoInIgVGhhbiBCbG9jay1TaXoiKQorCQkJICAgICAgIDB4NjUsIDB4MjAsIDB4NGIsIDB4NjUsIDB4NzksIDB4MjAsIDB4MmQsIDB4MjAsCisJCQkgICAgICAgMHg0OCwgMHg2MSwgMHg3MywgMHg2OCwgMHgyMCwgMHg0YiwgMHg2NSwgMHg3OSwgLy8gKCJlIEtleSAtIEhhc2ggS2V5IikKKwkJCSAgICAgICAweDIwLCAweDQ2LCAweDY5LCAweDcyLCAweDczLCAweDc0IH0sIC8vICgiIEZpcnN0IikKKwkJLnBzaXplCT0gNTQsCisJCS5kaWdlc3QJPSB7IDB4ODAsIDB4YjIsIDB4NDIsIDB4NjMsIDB4YzcsIDB4YzEsIDB4YTMsIDB4ZWIsCisJCQkgICAgMHhiNywgMHgxNCwgMHg5MywgMHhjMSwgMHhkZCwgMHg3YiwgMHhlOCwgMHhiNCwKKwkJCSAgICAweDliLCAweDQ2LCAweGQxLCAweGY0LCAweDFiLCAweDRhLCAweGVlLCAweGMxLAorCQkJICAgIDB4MTIsIDB4MWIsIDB4MDEsIDB4MzcsIDB4ODMsIDB4ZjgsIDB4ZjMsIDB4NTIsCisJCQkgICAgMHg2YiwgMHg1NiwgMHhkMCwgMHgzNywgMHhlMCwgMHg1ZiwgMHgyNSwgMHg5OCwKKwkJCSAgICAweGJkLCAweDBmLCAweGQyLCAweDIxLCAweDVkLCAweDZhLCAweDFlLCAweDUyLAorCQkJICAgIDB4OTUsIDB4ZTYsIDB4NGYsIDB4NzMsIDB4ZjYsIDB4M2YsIDB4MGEsIDB4ZWMsCisJCQkgICAgMHg4YiwgMHg5MSwgMHg1YSwgMHg5OCwgMHg1ZCwgMHg3OCwgMHg2NSwgMHg5OCB9LAorCX0sIHsKKwkJLmtleQk9IHsgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLCAweGFhLAorCQkJICAgIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsCisJCQkgICAgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJCSAgICAweGFhLCAweGFhLCAweGFhIH0sIC8vICgxMzEgYnl0ZXMpCisJCS5rc2l6ZQk9IDEzMSwKKwkJLnBsYWludGV4dCA9IHsgMHg1NCwgMHg2OCwgMHg2OSwgMHg3MywgMHgyMCwgMHg2OSwgMHg3MywgMHgyMCwKKwkJCSAgICAgICAweDYxLCAweDIwLCAweDc0LCAweDY1LCAweDczLCAweDc0LCAweDIwLCAweDc1LCAvLyAoIlRoaXMgaXMgYSB0ZXN0IHUiKQorCQkJICAgICAgIDB4NzMsIDB4NjksIDB4NmUsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjAsIDB4NmMsCisJCQkgICAgICAgMHg2MSwgMHg3MiwgMHg2NywgMHg2NSwgMHg3MiwgMHgyMCwgMHg3NCwgMHg2OCwgLy8gKCJzaW5nIGEgbGFyZ2VyIHRoIikKKwkJCSAgICAgICAweDYxLCAweDZlLCAweDIwLCAweDYyLCAweDZjLCAweDZmLCAweDYzLCAweDZiLAorCQkJICAgICAgIDB4MmQsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjAsIDB4NmIsIDB4NjUsIC8vICgiYW4gYmxvY2stc2l6ZSBrZSIpCisJCQkgICAgICAgMHg3OSwgMHgyMCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHgyMCwgMHg2MSwgMHgyMCwKKwkJCSAgICAgICAweDZjLCAweDYxLCAweDcyLCAweDY3LCAweDY1LCAweDcyLCAweDIwLCAweDc0LCAvLyAoInkgYW5kIGEgbGFyZ2VyIHQiKQorCQkJICAgICAgIDB4NjgsIDB4NjEsIDB4NmUsIDB4MjAsIDB4NjIsIDB4NmMsIDB4NmYsIDB4NjMsCisJCQkgICAgICAgMHg2YiwgMHgyZCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyMCwgMHg2NCwgLy8gKCJoYW4gYmxvY2stc2l6ZSBkIikKKwkJCSAgICAgICAweDYxLCAweDc0LCAweDYxLCAweDJlLCAweDIwLCAweDU0LCAweDY4LCAweDY1LAorCQkJICAgICAgIDB4MjAsIDB4NmIsIDB4NjUsIDB4NzksIDB4MjAsIDB4NmUsIDB4NjUsIDB4NjUsIC8vICgiYXRhLiBUaGUga2V5IG5lZSIpCisJCQkgICAgICAgMHg2NCwgMHg3MywgMHgyMCwgMHg3NCwgMHg2ZiwgMHgyMCwgMHg2MiwgMHg2NSwKKwkJCSAgICAgICAweDIwLCAweDY4LCAweDYxLCAweDczLCAweDY4LCAweDY1LCAweDY0LCAweDIwLCAvLyAoImRzIHRvIGJlIGhhc2hlZCAiKQorCQkJICAgICAgIDB4NjIsIDB4NjUsIDB4NjYsIDB4NmYsIDB4NzIsIDB4NjUsIDB4MjAsIDB4NjIsCisJCQkgICAgICAgMHg2NSwgMHg2OSwgMHg2ZSwgMHg2NywgMHgyMCwgMHg3NSwgMHg3MywgMHg2NSwgLy8gKCJiZWZvcmUgYmVpbmcgdXNlIikKKwkJCSAgICAgICAweDY0LCAweDIwLCAweDYyLCAweDc5LCAweDIwLCAweDc0LCAweDY4LCAweDY1LAorCQkJICAgICAgIDB4MjAsIDB4NDgsIDB4NGQsIDB4NDEsIDB4NDMsIDB4MjAsIDB4NjEsIDB4NmMsIC8vICgiZCBieSB0aGUgSE1BQyBhbCIpCisJCQkgICAgICAgMHg2NywgMHg2ZiwgMHg3MiwgMHg2OSwgMHg3NCwgMHg2OCwgMHg2ZCwgMHgyZSB9LCAvLyAoImdvcml0aG0uIikKKwkJLnBzaXplCT0gMTUyLAorCQkuZGlnZXN0CT0geyAweGUzLCAweDdiLCAweDZhLCAweDc3LCAweDVkLCAweGM4LCAweDdkLCAweGJhLAorCQkJICAgIDB4YTQsIDB4ZGYsIDB4YTksIDB4ZjksIDB4NmUsIDB4NWUsIDB4M2YsIDB4ZmQsCisJCQkgICAgMHhkZSwgMHhiZCwgMHg3MSwgMHhmOCwgMHg4NiwgMHg3MiwgMHg4OSwgMHg4NiwKKwkJCSAgICAweDVkLCAweGY1LCAweGEzLCAweDJkLCAweDIwLCAweGNkLCAweGM5LCAweDQ0LAorCQkJICAgIDB4YjYsIDB4MDIsIDB4MmMsIDB4YWMsIDB4M2MsIDB4NDksIDB4ODIsIDB4YjEsCisJCQkgICAgMHgwZCwgMHg1ZSwgMHhlYiwgMHg1NSwgMHhjMywgMHhlNCwgMHhkZSwgMHgxNSwKKwkJCSAgICAweDEzLCAweDQ2LCAweDc2LCAweGZiLCAweDZkLCAweGUwLCAweDQ0LCAweDYwLAorCQkJICAgIDB4NjUsIDB4YzksIDB4NzQsIDB4NDAsIDB4ZmEsIDB4OGMsIDB4NmEsIDB4NTggfSwKKwl9LAorfTsKKworLyoKICAqIERFUyB0ZXN0IHZlY3RvcnMuCiAgKi8KICNkZWZpbmUgREVTX0VOQ19URVNUX1ZFQ1RPUlMJCTEwCkBAIC0zMzE2LDYgKzM1NTksMjc4IEBACiAJfQogfTsKIAorLyogCisgKiBGQ3J5cHQgdGVzdCB2ZWN0b3JzIAorICovCisjZGVmaW5lIEZDUllQVF9FTkNfVEVTVF9WRUNUT1JTCUFSUkFZX1NJWkUoZmNyeXB0X3BjYmNfZW5jX3R2X3RlbXBsYXRlKQorI2RlZmluZSBGQ1JZUFRfREVDX1RFU1RfVkVDVE9SUwlBUlJBWV9TSVpFKGZjcnlwdF9wY2JjX2RlY190dl90ZW1wbGF0ZSkKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBmY3J5cHRfcGNiY19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIGh0dHA6Ly93d3cub3BlbmFmcy5vcmcvcGlwZXJtYWlsL29wZW5hZnMtZGV2ZWwvMjAwMC1EZWNlbWJlci8wMDUzMjAuaHRtbCAqLworCQkua2V5CT0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisJCS5rbGVuCT0gOCwKKwkJLml2CT0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisJCS5pbnB1dAk9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSB7IDB4MEUsIDB4MDksIDB4MDAsIDB4QzcsIDB4M0UsIDB4RjcsIDB4RUQsIDB4NDEgfSwKKwkJLnJsZW4JPSA4LAorCX0sIHsKKwkJLmtleQk9IHsgMHgxMSwgMHg0NCwgMHg3NywgMHhBQSwgMHhERCwgMHgwMCwgMHgzMywgMHg2NiB9LAorCQkua2xlbgk9IDgsCisJCS5pdgk9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorCQkuaW5wdXQJPSB7IDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REUsIDB4RjAgfSwKKwkJLmlsZW4JPSA4LAorCQkucmVzdWx0CT0geyAweEQ4LCAweEVELCAweDc4LCAweDc0LCAweDc3LCAweEVDLCAweDA2LCAweDgwIH0sCisJCS5ybGVuCT0gOCwKKwl9LCB7IC8qIEZyb20gQXJsYSAqLworCQkua2V5CT0geyAweGYwLCAweGUxLCAweGQyLCAweGMzLCAweGI0LCAweGE1LCAweDk2LCAweDg3IH0sCisJCS5rbGVuCT0gOCwKKwkJLml2CT0geyAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwIH0sCisJCS5pbnB1dAk9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9ncy5cMFwwIiwKKwkJLmlsZW4JPSA0OCwKKwkJLnJlc3VsdAk9IHsgMHgwMCwgMHhmMCwgMHhlLCAgMHgxMSwgMHg3NSwgMHhlNiwgMHgyMywgMHg4MiwKKwkJCSAgICAweGVlLCAweGFjLCAweDk4LCAweDYyLCAweDQ0LCAweDUxLCAweGU0LCAweDg0LAorCQkJICAgIDB4YzMsIDB4NTksIDB4ZDgsIDB4YWEsIDB4NjQsIDB4NjAsIDB4YWUsIDB4ZjcsCisJCQkgICAgMHhkMiwgMHhkOSwgMHgxMywgMHg3OSwgMHg3MiwgMHhhMywgMHg0NSwgMHgwMywKKwkJCSAgICAweDIzLCAweGI1LCAweDYyLCAweGQ3LCAweDBjLCAweGY1LCAweDI3LCAweGQxLAorCQkJICAgIDB4ZjgsIDB4OTEsIDB4M2MsIDB4YWMsIDB4NDQsIDB4MjIsIDB4OTIsIDB4ZWYgfSwKKwkJLnJsZW4JPSA0OCwKKwl9LCB7CisJCS5rZXkJPSB7IDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSB7IDB4ZjAsIDB4ZTEsIDB4ZDIsIDB4YzMsIDB4YjQsIDB4YTUsIDB4OTYsIDB4ODcgfSwKKwkJLmlucHV0CT0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dzLlwwXDAiLAorCQkuaWxlbgk9IDQ4LAorCQkucmVzdWx0CT0geyAweGNhLCAweDkwLCAweGY1LCAweDlkLCAweGNiLCAweGQ0LCAweGQyLCAweDNjLAorCQkJICAgIDB4MDEsIDB4ODgsIDB4N2YsIDB4M2UsIDB4MzEsIDB4NmUsIDB4NjIsIDB4OWQsCisJCQkgICAgMHhkOCwgMHhlMCwgMHg1NywgMHhhMywgMHgwNiwgMHgzYSwgMHg0MiwgMHg1OCwKKwkJCSAgICAweDJhLCAweDI4LCAweGZlLCAweDcyLCAweDUyLCAweDJmLCAweGRkLCAweGUwLAorCQkJICAgIDB4MTksIDB4ODksIDB4MDksIDB4MWMsIDB4MmEsIDB4OGUsIDB4OGMsIDB4OTQsCisJCQkgICAgMHhmYywgMHhjNywgMHg2OCwgMHhlNCwgMHg4OCwgMHhhYSwgMHhkZSwgMHgwZiB9LAorCQkucmxlbgk9IDQ4LAorCX0sIHsgLyogc3BsaXQtcGFnZSB2ZXJzaW9uICovCisJCS5rZXkJPSB7IDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSB7IDB4ZjAsIDB4ZTEsIDB4ZDIsIDB4YzMsIDB4YjQsIDB4YTUsIDB4OTYsIDB4ODcgfSwKKwkJLmlucHV0CT0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dzLlwwXDAiLAorCQkuaWxlbgk9IDQ4LAorCQkucmVzdWx0CT0geyAweGNhLCAweDkwLCAweGY1LCAweDlkLCAweGNiLCAweGQ0LCAweGQyLCAweDNjLAorCQkJICAgIDB4MDEsIDB4ODgsIDB4N2YsIDB4M2UsIDB4MzEsIDB4NmUsIDB4NjIsIDB4OWQsCisJCQkgICAgMHhkOCwgMHhlMCwgMHg1NywgMHhhMywgMHgwNiwgMHgzYSwgMHg0MiwgMHg1OCwKKwkJCSAgICAweDJhLCAweDI4LCAweGZlLCAweDcyLCAweDUyLCAweDJmLCAweGRkLCAweGUwLAorCQkJICAgIDB4MTksIDB4ODksIDB4MDksIDB4MWMsIDB4MmEsIDB4OGUsIDB4OGMsIDB4OTQsCisJCQkgICAgMHhmYywgMHhjNywgMHg2OCwgMHhlNCwgMHg4OCwgMHhhYSwgMHhkZSwgMHgwZiB9LAorCQkucmxlbgk9IDQ4LAorCQkubnAJPSAyLAorCQkudGFwCT0geyAyMCwgMjggfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGZjcnlwdF9wY2JjX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogaHR0cDovL3d3dy5vcGVuYWZzLm9yZy9waXBlcm1haWwvb3BlbmFmcy1kZXZlbC8yMDAwLURlY2VtYmVyLzAwNTMyMC5odG1sICovCisJCS5rZXkJPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKwkJLmlucHV0CT0geyAweDBFLCAweDA5LCAweDAwLCAweEM3LCAweDNFLCAweEY3LCAweEVELCAweDQxIH0sCisJCS5pbGVuCT0gOCwKKwkJLnJlc3VsdAk9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorCQkucmxlbgk9IDgsCisJfSwgeworCQkua2V5CT0geyAweDExLCAweDQ0LCAweDc3LCAweEFBLCAweERELCAweDAwLCAweDMzLCAweDY2IH0sCisJCS5rbGVuCT0gOCwKKwkJLml2CT0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisJCS5pbnB1dAk9IHsgMHhEOCwgMHhFRCwgMHg3OCwgMHg3NCwgMHg3NywgMHhFQywgMHgwNiwgMHg4MCB9LAorCQkuaWxlbgk9IDgsCisJCS5yZXN1bHQJPSB7IDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OUEsIDB4QkMsIDB4REUsIDB4RjAgfSwKKwkJLnJsZW4JPSA4LAorCX0sIHsgLyogRnJvbSBBcmxhICovCisJCS5rZXkJPSB7IDB4ZjAsIDB4ZTEsIDB4ZDIsIDB4YzMsIDB4YjQsIDB4YTUsIDB4OTYsIDB4ODcgfSwKKwkJLmtsZW4JPSA4LAorCQkuaXYJPSB7IDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKwkJLmlucHV0CT0geyAweDAwLCAweGYwLCAweGUsICAweDExLCAweDc1LCAweGU2LCAweDIzLCAweDgyLAorCQkJICAgIDB4ZWUsIDB4YWMsIDB4OTgsIDB4NjIsIDB4NDQsIDB4NTEsIDB4ZTQsIDB4ODQsCisJCQkgICAgMHhjMywgMHg1OSwgMHhkOCwgMHhhYSwgMHg2NCwgMHg2MCwgMHhhZSwgMHhmNywKKwkJCSAgICAweGQyLCAweGQ5LCAweDEzLCAweDc5LCAweDcyLCAweGEzLCAweDQ1LCAweDAzLAorCQkJICAgIDB4MjMsIDB4YjUsIDB4NjIsIDB4ZDcsIDB4MGMsIDB4ZjUsIDB4MjcsIDB4ZDEsCisJCQkgICAgMHhmOCwgMHg5MSwgMHgzYywgMHhhYywgMHg0NCwgMHgyMiwgMHg5MiwgMHhlZiB9LAorCQkuaWxlbgk9IDQ4LAorCQkucmVzdWx0CT0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2dzLlwwXDAiLAorCQkucmxlbgk9IDQ4LAorCX0sIHsKKwkJLmtleQk9IHsgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkua2xlbgk9IDgsCisJCS5pdgk9IHsgMHhmMCwgMHhlMSwgMHhkMiwgMHhjMywgMHhiNCwgMHhhNSwgMHg5NiwgMHg4NyB9LAorCQkuaW5wdXQJPSB7IDB4Y2EsIDB4OTAsIDB4ZjUsIDB4OWQsIDB4Y2IsIDB4ZDQsIDB4ZDIsIDB4M2MsCisJCQkgICAgMHgwMSwgMHg4OCwgMHg3ZiwgMHgzZSwgMHgzMSwgMHg2ZSwgMHg2MiwgMHg5ZCwKKwkJCSAgICAweGQ4LCAweGUwLCAweDU3LCAweGEzLCAweDA2LCAweDNhLCAweDQyLCAweDU4LAorCQkJICAgIDB4MmEsIDB4MjgsIDB4ZmUsIDB4NzIsIDB4NTIsIDB4MmYsIDB4ZGQsIDB4ZTAsCisJCQkgICAgMHgxOSwgMHg4OSwgMHgwOSwgMHgxYywgMHgyYSwgMHg4ZSwgMHg4YywgMHg5NCwKKwkJCSAgICAweGZjLCAweGM3LCAweDY4LCAweGU0LCAweDg4LCAweGFhLCAweGRlLCAweDBmIH0sCisJCS5pbGVuCT0gNDgsCisJCS5yZXN1bHQJPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ3MuXDBcMCIsCisJCS5ybGVuCT0gNDgsCisJfSwgeyAvKiBzcGxpdC1wYWdlIHZlcnNpb24gKi8KKwkJLmtleQk9IHsgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkua2xlbgk9IDgsCisJCS5pdgk9IHsgMHhmMCwgMHhlMSwgMHhkMiwgMHhjMywgMHhiNCwgMHhhNSwgMHg5NiwgMHg4NyB9LAorCQkuaW5wdXQJPSB7IDB4Y2EsIDB4OTAsIDB4ZjUsIDB4OWQsIDB4Y2IsIDB4ZDQsIDB4ZDIsIDB4M2MsCisJCQkgICAgMHgwMSwgMHg4OCwgMHg3ZiwgMHgzZSwgMHgzMSwgMHg2ZSwgMHg2MiwgMHg5ZCwKKwkJCSAgICAweGQ4LCAweGUwLCAweDU3LCAweGEzLCAweDA2LCAweDNhLCAweDQyLCAweDU4LAorCQkJICAgIDB4MmEsIDB4MjgsIDB4ZmUsIDB4NzIsIDB4NTIsIDB4MmYsIDB4ZGQsIDB4ZTAsCisJCQkgICAgMHgxOSwgMHg4OSwgMHgwOSwgMHgxYywgMHgyYSwgMHg4ZSwgMHg4YywgMHg5NCwKKwkJCSAgICAweGZjLCAweGM3LCAweDY4LCAweGU0LCAweDg4LCAweGFhLCAweGRlLCAweDBmIH0sCisJCS5pbGVuCT0gNDgsCisJCS5yZXN1bHQJPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ3MuXDBcMCIsCisJCS5ybGVuCT0gNDgsCisJCS5ucAk9IDIsCisJCS50YXAJPSB7IDIwLCAyOCB9LAorCX0KK307CisKKy8qCisgKiBDQU1FTExJQSB0ZXN0IHZlY3RvcnMuCisgKi8KKyNkZWZpbmUgQ0FNRUxMSUFfRU5DX1RFU1RfVkVDVE9SUyAzCisjZGVmaW5lIENBTUVMTElBX0RFQ19URVNUX1ZFQ1RPUlMgMworI2RlZmluZSBDQU1FTExJQV9DQkNfRU5DX1RFU1RfVkVDVE9SUyAyCisjZGVmaW5lIENBTUVMTElBX0NCQ19ERUNfVEVTVF9WRUNUT1JTIDIKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYW1lbGxpYV9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0geyAweDY3LCAweDY3LCAweDMxLCAweDM4LCAweDU0LCAweDk2LCAweDY5LCAweDczLAorCQkJICAgIDB4MDgsIDB4NTcsIDB4MDYsIDB4NTYsIDB4NDgsIDB4ZWEsIDB4YmUsIDB4NDMgfSwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCwKKwkJCSAgICAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3IH0sCisJCS5rbGVuCT0gMjQsCisJCS5pbnB1dAk9IHsgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwKKwkJCSAgICAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwIH0sCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSB7IDB4YjQsIDB4OTksIDB4MzQsIDB4MDEsIDB4YjMsIDB4ZTksIDB4OTYsIDB4ZjgsCisJCQkgICAgMHg0ZSwgMHhlNSwgMHhjZSwgMHhlNywgMHhkNywgMHg5YiwgMHgwOSwgMHhiOSB9LAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9IHsgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwKKwkJCSAgICAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwLAorCQkJICAgIDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsCisJCQkgICAgMHg4OCwgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZiB9LAorCQkua2xlbgk9IDMyLAorCQkuaW5wdXQJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0geyAweDlhLCAweGNjLCAweDIzLCAweDdkLCAweGZmLCAweDE2LCAweGQ3LCAweDZjLAorCQkJICAgIDB4MjAsIDB4ZWYsIDB4N2MsIDB4OTEsIDB4OWUsIDB4M2EsIDB4NzUsIDB4MDkgfSwKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYW1lbGxpYV9kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkua2xlbgk9IDE2LAorCQkuaW5wdXQJPSB7IDB4NjcsIDB4NjcsIDB4MzEsIDB4MzgsIDB4NTQsIDB4OTYsIDB4NjksIDB4NzMsCisJCQkgICAgMHgwOCwgMHg1NywgMHgwNiwgMHg1NiwgMHg0OCwgMHhlYSwgMHhiZSwgMHg0MyB9LAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0geyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLAorCQkJICAgIDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKwkJLnJsZW4JPSAxNiwKKwl9LCB7CisJCS5rZXkJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCwKKwkJCSAgICAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3IH0sCisJCS5rbGVuCT0gMjQsCisJCS5pbnB1dAk9IHsgMHhiNCwgMHg5OSwgMHgzNCwgMHgwMSwgMHhiMywgMHhlOSwgMHg5NiwgMHhmOCwKKwkJCSAgICAweDRlLCAweGU1LCAweGNlLCAweGU3LCAweGQ3LCAweDliLCAweDA5LCAweGI5IH0sCisJCS5pbGVuCT0gMTYsCisJCS5yZXN1bHQJPSB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisJCQkgICAgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCB9LAorCQkucmxlbgk9IDE2LAorCX0sIHsKKwkJLmtleQk9IHsgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwKKwkJCSAgICAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwLAorCQkJICAgIDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsCisJCQkgICAgMHg4OCwgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZiB9LAorCQkua2xlbgk9IDMyLAorCQkuaW5wdXQJPSB7IDB4OWEsIDB4Y2MsIDB4MjMsIDB4N2QsIDB4ZmYsIDB4MTYsIDB4ZDcsIDB4NmMsCisJCQkgICAgMHgyMCwgMHhlZiwgMHg3YywgMHg5MSwgMHg5ZSwgMHgzYSwgMHg3NSwgMHgwOSB9LAorCQkuaWxlbgk9IDE2LAorCQkucmVzdWx0CT0geyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLAorCQkJICAgIDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKwkJLnJsZW4JPSAxNiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBjYW1lbGxpYV9jYmNfZW5jX3R2X3RlbXBsYXRlW10gPSB7CisJeworCQkua2V5ICAgID0geyAweDA2LCAweGE5LCAweDIxLCAweDQwLCAweDM2LCAweGI4LCAweGExLCAweDViLAorCQkJICAgIDB4NTEsIDB4MmUsIDB4MDMsIDB4ZDUsIDB4MzQsIDB4MTIsIDB4MDAsIDB4MDYgfSwKKwkJLmtsZW4gICA9IDE2LAorCQkuaXYJPSB7IDB4M2QsIDB4YWYsIDB4YmEsIDB4NDIsIDB4OWQsIDB4OWUsIDB4YjQsIDB4MzAsCisJCQkgICAgMHhiNCwgMHgyMiwgMHhkYSwgMHg4MCwgMHgyYywgMHg5ZiwgMHhhYywgMHg0MSB9LAorCQkuaW5wdXQJPSB7ICJTaW5nbGUgYmxvY2sgbXNnIiB9LAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSB7IDB4ZWEsIDB4MzIsIDB4MTIsIDB4NzYsIDB4M2IsIDB4NTAsIDB4MTAsIDB4ZTcsCisJCQkgICAgMHgxOCwgMHhmNiwgMHhmZCwgMHg1ZCwgMHhmNiwgMHg4ZiwgMHgxMywgMHg1MSB9LAorCQkucmxlbiAgID0gMTYsCisJfSwgeworCQkua2V5ICAgID0geyAweGMyLCAweDg2LCAweDY5LCAweDZkLCAweDg4LCAweDdjLCAweDlhLCAweGEwLAorCQkJICAgIDB4NjEsIDB4MWIsIDB4YmIsIDB4M2UsIDB4MjAsIDB4MjUsIDB4YTQsIDB4NWEgfSwKKwkJLmtsZW4gICA9IDE2LAorCQkuaXYgICAgID0geyAweDU2LCAweDJlLCAweDE3LCAweDk5LCAweDZkLCAweDA5LCAweDNkLCAweDI4LAorCQkJICAgIDB4ZGQsIDB4YjMsIDB4YmEsIDB4NjksIDB4NWEsIDB4MmUsIDB4NmYsIDB4NTggfSwKKwkJLmlucHV0ICA9IHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkJCSAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAorCQkJICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCisJCQkgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiB9LAorCQkuaWxlbiAgID0gMzIsCisJCS5yZXN1bHQgPSB7IDB4YTUsIDB4ZGYsIDB4NmUsIDB4NTAsIDB4ZGEsIDB4NzAsIDB4NmMsIDB4MDEsCisJCQkgICAgMHg0YSwgMHhhYiwgMHhmMywgMHhmMiwgMHhkNiwgMHhmYywgMHg2YywgMHhmZCwKKwkJCSAgICAweDE5LCAweGI0LCAweDNlLCAweDU3LCAweDFjLCAweDAyLCAweDVlLCAweGEwLAorCQkJICAgIDB4MTUsIDB4NzgsIDB4ZTAsIDB4NWUsIDB4ZjIsIDB4Y2IsIDB4ODcsIDB4MTYgfSwKKwkJLnJsZW4gICA9IDMyLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGNhbWVsbGlhX2NiY19kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7CisJCS5rZXkgICAgPSB7IDB4MDYsIDB4YTksIDB4MjEsIDB4NDAsIDB4MzYsIDB4YjgsIDB4YTEsIDB4NWIsCisJCQkgICAgMHg1MSwgMHgyZSwgMHgwMywgMHhkNSwgMHgzNCwgMHgxMiwgMHgwMCwgMHgwNiB9LAorCQkua2xlbiAgID0gMTYsCisJCS5pdgk9IHsgMHgzZCwgMHhhZiwgMHhiYSwgMHg0MiwgMHg5ZCwgMHg5ZSwgMHhiNCwgMHgzMCwKKwkJCSAgICAweGI0LCAweDIyLCAweGRhLCAweDgwLCAweDJjLCAweDlmLCAweGFjLCAweDQxIH0sCisJCS5pbnB1dAk9IHsgMHhlYSwgMHgzMiwgMHgxMiwgMHg3NiwgMHgzYiwgMHg1MCwgMHgxMCwgMHhlNywKKwkJCSAgICAweDE4LCAweGY2LCAweGZkLCAweDVkLCAweGY2LCAweDhmLCAweDEzLCAweDUxIH0sCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9IHsgIlNpbmdsZSBibG9jayBtc2ciIH0sCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7CisJCS5rZXkgICAgPSB7IDB4YzIsIDB4ODYsIDB4NjksIDB4NmQsIDB4ODgsIDB4N2MsIDB4OWEsIDB4YTAsCisJCQkgICAgMHg2MSwgMHgxYiwgMHhiYiwgMHgzZSwgMHgyMCwgMHgyNSwgMHhhNCwgMHg1YSB9LAorCQkua2xlbiAgID0gMTYsCisJCS5pdiAgICAgPSB7IDB4NTYsIDB4MmUsIDB4MTcsIDB4OTksIDB4NmQsIDB4MDksIDB4M2QsIDB4MjgsCisJCQkgICAgMHhkZCwgMHhiMywgMHhiYSwgMHg2OSwgMHg1YSwgMHgyZSwgMHg2ZiwgMHg1OCB9LAorCQkuaW5wdXQgPSB7IDB4YTUsIDB4ZGYsIDB4NmUsIDB4NTAsIDB4ZGEsIDB4NzAsIDB4NmMsIDB4MDEsCisJCQkgICAgMHg0YSwgMHhhYiwgMHhmMywgMHhmMiwgMHhkNiwgMHhmYywgMHg2YywgMHhmZCwKKwkJCSAgICAweDE5LCAweGI0LCAweDNlLCAweDU3LCAweDFjLCAweDAyLCAweDVlLCAweGEwLAorCQkJICAgIDB4MTUsIDB4NzgsIDB4ZTAsIDB4NWUsIDB4ZjIsIDB4Y2IsIDB4ODcsIDB4MTYgfSwKKwkJLmlsZW4gICA9IDMyLAorCQkucmVzdWx0ID0geyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCQkJICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsCisJCQkgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKKwkJCSAgICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmIH0sCisJCS5ybGVuICAgPSAzMiwKKwl9LAorfTsKKwogLyoKICAqIENvbXByZXNzaW9uIHN0dWZmLgogICovCkBAIC0zNzY5LDQgKzQyODQsMjUgQEAKIAl7ICAuYmxlbiA9IDAsCS5wbGVuID0gMCwgfQogfTsKIAorc3RhdGljIHN0cnVjdCBjaXBoZXJfc3BlZWQgY2FtZWxsaWFfc3BlZWRfdGVtcGxhdGVbXSA9IHsKKyAgICAgIHsgLmtsZW4gPSAxNiwgLmJsZW4gPSAxNiwgfSwKKyAgICAgIHsgLmtsZW4gPSAxNiwgLmJsZW4gPSA2NCwgfSwKKyAgICAgIHsgLmtsZW4gPSAxNiwgLmJsZW4gPSAyNTYsIH0sCisgICAgICB7IC5rbGVuID0gMTYsIC5ibGVuID0gMTAyNCwgfSwKKyAgICAgIHsgLmtsZW4gPSAxNiwgLmJsZW4gPSA4MTkyLCB9LAorICAgICAgeyAua2xlbiA9IDI0LCAuYmxlbiA9IDE2LCB9LAorICAgICAgeyAua2xlbiA9IDI0LCAuYmxlbiA9IDY0LCB9LAorICAgICAgeyAua2xlbiA9IDI0LCAuYmxlbiA9IDI1NiwgfSwKKyAgICAgIHsgLmtsZW4gPSAyNCwgLmJsZW4gPSAxMDI0LCB9LAorICAgICAgeyAua2xlbiA9IDI0LCAuYmxlbiA9IDgxOTIsIH0sCisgICAgICB7IC5rbGVuID0gMzIsIC5ibGVuID0gMTYsIH0sCisgICAgICB7IC5rbGVuID0gMzIsIC5ibGVuID0gNjQsIH0sCisgICAgICB7IC5rbGVuID0gMzIsIC5ibGVuID0gMjU2LCB9LAorICAgICAgeyAua2xlbiA9IDMyLCAuYmxlbiA9IDEwMjQsIH0sCisgICAgICB7IC5rbGVuID0gMzIsIC5ibGVuID0gODE5MiwgfSwKKworICAgICAgLyogRW5kIG1hcmtlciAqLworICAgICAgeyAgLmtsZW4gPSAwLCAuYmxlbiA9IDAsIH0KK307CisKICNlbmRpZgkvKiBfQ1JZUFRPX1RDUllQVF9IICovCmRpZmYgLS1naXQgYS9jcnlwdG8veGNiYy5jIGIvY3J5cHRvL3hjYmMuYwppbmRleCA5MzQ3ZWI2Li41M2U4Y2NiIDEwMDY0NAotLS0gYS9jcnlwdG8veGNiYy5jCisrKyBiL2NyeXB0by94Y2JjLmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgpAQCAtNDcsNyArNDgsNyBAQAogICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiBzdHJ1Y3QgY3J5cHRvX3hjYmNfY3R4IHsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqY2hpbGQ7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKmNoaWxkOwogCXU4ICpvZGRzOwogCXU4ICpwcmV2OwogCXU4ICprZXk7CkBAIC03NSw4ICs3Niw3IEBACiAJaWYgKChlcnIgPSBjcnlwdG9fY2lwaGVyX3NldGtleShjdHgtPmNoaWxkLCBjdHgtPmtleSwgY3R4LT5rZXlsZW4pKSkKIAkgICAgcmV0dXJuIGVycjsKIAotCWN0eC0+Y2hpbGQtPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdChjdHgtPmNoaWxkLCBrZXkxLAotCQkJY3R4LT5jb25zdHMpOworCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoY3R4LT5jaGlsZCwga2V5MSwgY3R4LT5jb25zdHMpOwogCiAJcmV0dXJuIGNyeXB0b19jaXBoZXJfc2V0a2V5KGN0eC0+Y2hpbGQsIGtleTEsIGJzKTsKIH0KQEAgLTg2LDcgKzg2LDcgQEAKIHsKIAlzdHJ1Y3QgY3J5cHRvX3hjYmNfY3R4ICpjdHggPSBjcnlwdG9faGFzaF9jdHhfYWxpZ25lZChwYXJlbnQpOwogCi0JaWYgKGtleWxlbiAhPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3R4LT5jaGlsZCkpCisJaWYgKGtleWxlbiAhPSBjcnlwdG9fY2lwaGVyX2Jsb2Nrc2l6ZShjdHgtPmNoaWxkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljdHgtPmtleWxlbiA9IGtleWxlbjsKQEAgLTEwOCwxMyArMTA4LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY3J5cHRvX3hjYmNfZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgaGFzaF9kZXNjICpwZGVzYywKLQkJCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQorc3RhdGljIGludCBjcnlwdG9feGNiY19kaWdlc3RfdXBkYXRlMihzdHJ1Y3QgaGFzaF9kZXNjICpwZGVzYywKKwkJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7CiAJc3RydWN0IGNyeXB0b19oYXNoICpwYXJlbnQgPSBwZGVzYy0+dGZtOwogCXN0cnVjdCBjcnlwdG9feGNiY19jdHggKmN0eCA9IGNyeXB0b19oYXNoX2N0eF9hbGlnbmVkKHBhcmVudCk7Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGN0eC0+Y2hpbGQ7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSA9IGN0eC0+Y2hpbGQ7CiAJaW50IGJzID0gY3J5cHRvX2hhc2hfYmxvY2tzaXplKHBhcmVudCk7CiAJdW5zaWduZWQgaW50IGkgPSAwOwogCkBAIC0xNDIsNyArMTQyLDcgQEAKIAkJCQkJb2Zmc2V0ICs9IGxlbjsKIAogCQkJCWNyeXB0b19rdW5tYXAocCwgMCk7Ci0JCQkJY3J5cHRvX3lpZWxkKHRmbS0+Y3J0X2ZsYWdzKTsKKwkJCQljcnlwdG9feWllbGQocGRlc2MtPmZsYWdzKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtMTUyLDcgKzE1Miw3IEBACiAJCQlwICs9IGJzIC0gY3R4LT5sZW47CiAKIAkJCWN0eC0+eG9yKGN0eC0+cHJldiwgY3R4LT5vZGRzLCBicyk7Ci0JCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIGN0eC0+cHJldiwgY3R4LT5wcmV2KTsKKwkJCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBjdHgtPnByZXYsIGN0eC0+cHJldik7CiAKIAkJCS8qIGNsZWFyaW5nIHRoZSBsZW5ndGggKi8KIAkJCWN0eC0+bGVuID0gMDsKQEAgLTE2MCw3ICsxNjAsOCBAQAogCQkJLyogZW5jcnlwdGluZyB0aGUgcmVzdCBvZiBkYXRhICovCiAJCQl3aGlsZSAobGVuID4gYnMpIHsKIAkJCQljdHgtPnhvcihjdHgtPnByZXYsIHAsIGJzKTsKLQkJCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIGN0eC0+cHJldiwgY3R4LT5wcmV2KTsKKwkJCQljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKHRmbSwgY3R4LT5wcmV2LAorCQkJCQkJCSAgY3R4LT5wcmV2KTsKIAkJCQlwICs9IGJzOwogCQkJCWxlbiAtPSBiczsKIAkJCX0KQEAgLTE3MSw3ICsxNzIsNyBAQAogCQkJCWN0eC0+bGVuID0gbGVuOwogCQkJfQogCQkJY3J5cHRvX2t1bm1hcChwLCAwKTsKLQkJCWNyeXB0b195aWVsZCh0Zm0tPmNydF9mbGFncyk7CisJCQljcnlwdG9feWllbGQocGRlc2MtPmZsYWdzKTsKIAkJCXNsZW4gLT0gbWluKHNsZW4sICgodW5zaWduZWQgaW50KShQQUdFX1NJWkUpKSAtIG9mZnNldCk7CiAJCQlvZmZzZXQgPSAwOwogCQkJcGcrKzsKQEAgLTE4MywxMSArMTg0LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY3J5cHRvX3hjYmNfZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgaGFzaF9kZXNjICpwZGVzYywKKwkJCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCWlmIChXQVJOX09OX09OQ0UoaW5faXJxKCkpKQorCQlyZXR1cm4gLUVERUFETEs7CisJcmV0dXJuIGNyeXB0b194Y2JjX2RpZ2VzdF91cGRhdGUyKHBkZXNjLCBzZywgbmJ5dGVzKTsKK30KKwogc3RhdGljIGludCBjcnlwdG9feGNiY19kaWdlc3RfZmluYWwoc3RydWN0IGhhc2hfZGVzYyAqcGRlc2MsIHU4ICpvdXQpCiB7CiAJc3RydWN0IGNyeXB0b19oYXNoICpwYXJlbnQgPSBwZGVzYy0+dGZtOwogCXN0cnVjdCBjcnlwdG9feGNiY19jdHggKmN0eCA9IGNyeXB0b19oYXNoX2N0eF9hbGlnbmVkKHBhcmVudCk7Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGN0eC0+Y2hpbGQ7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSA9IGN0eC0+Y2hpbGQ7CiAJaW50IGJzID0gY3J5cHRvX2hhc2hfYmxvY2tzaXplKHBhcmVudCk7CiAJaW50IGVyciA9IDA7CiAKQEAgLTE5NywxMyArMjA3LDE0IEBACiAJCWlmICgoZXJyID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkodGZtLCBjdHgtPmtleSwgY3R4LT5rZXlsZW4pKSAhPSAwKQogCQkJcmV0dXJuIGVycjsKIAotCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIGtleTIsIChjb25zdCB1OCopKGN0eC0+Y29uc3RzK2JzKSk7CisJCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBrZXkyLAorCQkJCQkgICh1OCAqKShjdHgtPmNvbnN0cyArIGJzKSk7CiAKIAkJY3R4LT54b3IoY3R4LT5wcmV2LCBjdHgtPm9kZHMsIGJzKTsKIAkJY3R4LT54b3IoY3R4LT5wcmV2LCBrZXkyLCBicyk7CiAJCV9jcnlwdG9feGNiY19kaWdlc3Rfc2V0a2V5KHBhcmVudCwgY3R4KTsKIAotCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIG91dCwgY3R4LT5wcmV2KTsKKwkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZSh0Zm0sIG91dCwgY3R4LT5wcmV2KTsKIAl9IGVsc2UgewogCQl1OCBrZXkzW2JzXTsKIAkJdW5zaWduZWQgaW50IHJsZW47CkBAIC0yMTgsMTQgKzIyOSwxNSBAQAogCQlpZiAoKGVyciA9IGNyeXB0b19jaXBoZXJfc2V0a2V5KHRmbSwgY3R4LT5rZXksIGN0eC0+a2V5bGVuKSkgIT0gMCkKIAkJCXJldHVybiBlcnI7CiAKLQkJdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQodGZtLCBrZXkzLCAoY29uc3QgdTgqKShjdHgtPmNvbnN0cyticyoyKSk7CisJCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBrZXkzLAorCQkJCQkgICh1OCAqKShjdHgtPmNvbnN0cyArIGJzICogMikpOwogCiAJCWN0eC0+eG9yKGN0eC0+cHJldiwgY3R4LT5vZGRzLCBicyk7CiAJCWN0eC0+eG9yKGN0eC0+cHJldiwga2V5MywgYnMpOwogCiAJCV9jcnlwdG9feGNiY19kaWdlc3Rfc2V0a2V5KHBhcmVudCwgY3R4KTsKIAotCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIG91dCwgY3R4LT5wcmV2KTsKKwkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZSh0Zm0sIG91dCwgY3R4LT5wcmV2KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIzNCwyMSArMjQ2LDI1IEBACiBzdGF0aWMgaW50IGNyeXB0b194Y2JjX2RpZ2VzdChzdHJ1Y3QgaGFzaF9kZXNjICpwZGVzYywKIAkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqb3V0KQogeworCWlmIChXQVJOX09OX09OQ0UoaW5faXJxKCkpKQorCQlyZXR1cm4gLUVERUFETEs7CisKIAljcnlwdG9feGNiY19kaWdlc3RfaW5pdChwZGVzYyk7Ci0JY3J5cHRvX3hjYmNfZGlnZXN0X3VwZGF0ZShwZGVzYywgc2csIG5ieXRlcyk7CisJY3J5cHRvX3hjYmNfZGlnZXN0X3VwZGF0ZTIocGRlc2MsIHNnLCBuYnl0ZXMpOwogCXJldHVybiBjcnlwdG9feGNiY19kaWdlc3RfZmluYWwocGRlc2MsIG91dCk7CiB9CiAKIHN0YXRpYyBpbnQgeGNiY19pbml0X3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogeworCXN0cnVjdCBjcnlwdG9fY2lwaGVyICpjaXBoZXI7CiAJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCA9ICh2b2lkICopdGZtLT5fX2NydF9hbGc7CiAJc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24gPSBjcnlwdG9faW5zdGFuY2VfY3R4KGluc3QpOwogCXN0cnVjdCBjcnlwdG9feGNiY19jdHggKmN0eCA9IGNyeXB0b19oYXNoX2N0eF9hbGlnbmVkKF9fY3J5cHRvX2hhc2hfY2FzdCh0Zm0pKTsKIAlpbnQgYnMgPSBjcnlwdG9faGFzaF9ibG9ja3NpemUoX19jcnlwdG9faGFzaF9jYXN0KHRmbSkpOwogCi0JdGZtID0gY3J5cHRvX3NwYXduX3RmbShzcGF3bik7Ci0JaWYgKElTX0VSUih0Zm0pKQotCQlyZXR1cm4gUFRSX0VSUih0Zm0pOworCWNpcGhlciA9IGNyeXB0b19zcGF3bl9jaXBoZXIoc3Bhd24pOworCWlmIChJU19FUlIoY2lwaGVyKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2lwaGVyKTsKIAogCXN3aXRjaChicykgewogCWNhc2UgMTY6CkBAIC0yNTgsNyArMjc0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY3R4LT5jaGlsZCA9IGNyeXB0b19jaXBoZXJfY2FzdCh0Zm0pOworCWN0eC0+Y2hpbGQgPSBjaXBoZXI7CiAJY3R4LT5vZGRzID0gKHU4KikoY3R4KzEpOwogCWN0eC0+cHJldiA9IGN0eC0+b2RkcyArIGJzOwogCWN0eC0+a2V5ID0gY3R4LT5wcmV2ICsgYnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF5LmMgYi9kcml2ZXJzL2FjcGkvYmF5LmMKaW5kZXggNjY3ZmExZC4uOTEwODJjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2JheS5jCisrKyBiL2RyaXZlcnMvYWNwaS9iYXkuYwpAQCAtMjk2LDcgKzI5Niw3IEBACiAJLyoKIAkgKiBJbml0aWFsaXplIGJheSBkZXZpY2Ugc3RydWN0dXJlCiAJICovCi0JbmV3X2JheSA9IGt6YWxsb2MoR0ZQX0FUT01JQywgc2l6ZW9mKCpuZXdfYmF5KSk7CisJbmV3X2JheSA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfYmF5KSwgR0ZQX0FUT01JQyk7CiAJSU5JVF9MSVNUX0hFQUQoJm5ld19iYXktPmxpc3QpOwogCW5ld19iYXktPmhhbmRsZSA9IGhhbmRsZTsKIAluZXdfYmF5LT5uYW1lID0gKGNoYXIgKiluYnVmZmVyLnBvaW50ZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmMgYi9kcml2ZXJzL2F0YS9haGNpLmMKaW5kZXggNDg2MTZjNi4uZTI3OTZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuYwpAQCAtMTE3Myw3ICsxMTczLDcgQEAKIAkJICogZGFuZ2Vyb3VzLCB3ZSBuZWVkIHRvIGtub3cgbW9yZSBhYm91dCB0aGVtLiAgUHJpbnQKIAkJICogbW9yZSBvZiBpdC4KIAkJICovCi0JCWNvbnN0IHUzMiAqZiA9IHBwLT5yeF9maXMgKyBSWF9GSVNfU0RCOworCQljb25zdCBfX2xlMzIgKmYgPSBwcC0+cnhfZmlzICsgUlhfRklTX1NEQjsKIAogCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywgIlNwdXJpb3VzIFNEQiBGSVMgZHVyaW5nIE5DUSAiCiAJCQkJImlzc3VlPTB4JXggU0FjdD0weCV4IEZJUz0lMDh4OiUwOHglc1xuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc3Z3LmMgYi9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jCmluZGV4IDQ2ZDhhOTQuLjVmNGU4MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc3Z3LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zdncuYwpAQCAtMTE2LDcgKzExNiw3IEBACiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQogCQlyZXR1cm4gMHhmZmZmZmZmZlU7Ci0JcmV0dXJuIHJlYWRsKCh2b2lkICopIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworCXJldHVybiByZWFkbCgodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOwogfQogCiAKQEAgLTEyNSw3ICsxMjUsNyBAQAogewogCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKIAkJcmV0dXJuOwotCXdyaXRlbCh2YWwsICh2b2lkICopIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOworCXdyaXRlbCh2YWwsICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CiB9CiAKIApAQCAtMjYyLDcgKzI2Miw3IEBACiAKIHN0YXRpYyB1OCBrMl9zdGF0X2NoZWNrX3N0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotICAgICAgIAlyZXR1cm4gcmVhZGwoKHZvaWQgKikgYXAtPmlvYWRkci5zdGF0dXNfYWRkcik7CisgICAgICAgCXJldHVybiByZWFkbCgodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuc3RhdHVzX2FkZHIpOwogfQogCiAjaWZkZWYgQ09ORklHX1BQQ19PRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21hY2h6d2QuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tYWNoendkLmMKaW5kZXggMjc2NTc3ZC4uNGQ3MzBmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21hY2h6d2QuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbWFjaHp3ZC5jCkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKIAogCQljYXNlIFdESU9DX0tFRVBBTElWRToKLQkJCXpmX3BpbmcoMCk7CisJCQl6Zl9waW5nKE5VTEwpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2dlb2RlLWFlcy5jIGIvZHJpdmVycy9jcnlwdG8vZ2VvZGUtYWVzLmMKaW5kZXggNDNhNjgzOS4uMzFlYTQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vZ2VvZGUtYWVzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vZ2VvZGUtYWVzLmMKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogc3RhdGljIGludCBfX2luaXQKIGdlb2RlX2Flc19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZ2VvZGVfYWVzX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmdlb2RlX2Flc19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1pbnB1dC5jIGIvZHJpdmVycy9od21vbi9hbXMvYW1zLWlucHV0LmMKaW5kZXggZjEyNmFhNC4uMTgyMTAxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hbXMvYW1zLWlucHV0LmMKKysrIGIvZHJpdmVycy9od21vbi9hbXMvYW1zLWlucHV0LmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogfQogCiAvKiBDYWxsIHdpdGggYW1zX2luZm8ubG9jayBoZWxkISAqLwotdm9pZCBhbXNfaW5wdXRfZXhpdCgpCit2b2lkIGFtc19pbnB1dF9leGl0KHZvaWQpCiB7CiAJYW1zX2lucHV0X2Rpc2FibGUoKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmFtc19pbmZvLm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfam95c3RpY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfaW5pdGlhdG9yLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYwppbmRleCAwYTdkMWFiLi44OWUzNzI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYwpAQCAtNTY3LDcgKzU2Nyw3IEBACiAJb3Bjb2RlID0gaGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSzsKIAogCWlmIChvcGNvZGUgPT0gSVNDU0lfT1BfU0NTSV9DTURfUlNQKSB7Ci0JICAgICAgICBpdHQgPSBoZHItPml0dCAmIElTQ1NJX0lUVF9NQVNLOyAvKiBtYXNrIG91dCBjaWQgYW5kIGFnZSBiaXRzICovCisJICAgICAgICBpdHQgPSBnZXRfaXR0KGhkci0+aXR0KTsgLyogbWFzayBvdXQgY2lkIGFuZCBhZ2UgYml0cyAqLwogCQlpZiAoIShpdHQgPCBzZXNzaW9uLT5jbWRzX21heCkpCiAJCQlpc2VyX2VycigiaXR0IGNhbid0IGJlIG1hdGNoZWQgdG8gdGFzayEhISIKIAkJCQkgImNvbm4gJXAgb3Bjb2RlICVkIGNtZHNfbWF4ICVkIGl0dCAlZFxuIiwKQEAgLTYyNSw3ICs2MjUsNyBAQAogCQkvKiB0aGlzIGFyaXRobWV0aWMgaXMgbGVnYWwgYnkgbGliaXNjc2kgZGRfZGF0YSBhbGxvY2F0aW9uICovCiAJCW10YXNrID0gKHZvaWQgKikgKChsb25nKSh2b2lkICopdHhfZGVzYyAtCiAJCQkJICBzaXplb2Yoc3RydWN0IGlzY3NpX21nbXRfdGFzaykpOwotCQlpZiAobXRhc2stPmhkci0+aXR0ID09IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRykpIHsKKwkJaWYgKG10YXNrLT5oZHItPml0dCA9PSBSRVNFUlZFRF9JVFQpIHsKIAkJCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKIAogCQkJc3Bpbl9sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKaW5kZXggNDM1OGEwYS4uYzdkYjQwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAogCiBzdHJ1Y3QgdWNiMTQwMCB7Ci0JYWM5N190CQkJKmFjOTc7CisJc3RydWN0IHNuZF9hYzk3CQkqYWM5NzsKIAlzdHJ1Y3QgaW5wdXRfZGV2CSp0c19pZGV2OwogCiAJaW50CQkJaXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0va3ZtX21haW4uYyBiL2RyaXZlcnMva3ZtL2t2bV9tYWluLmMKaW5kZXggYjEwOTcyZS4uMDk5ZjBhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9rdm0va3ZtX21haW4uYworKysgYi9kcml2ZXJzL2t2bS9rdm1fbWFpbi5jCkBAIC02Miw3ICs2Miw3IEBACiAJeyAiaGFsdF9leGl0cyIsICZrdm1fc3RhdC5oYWx0X2V4aXRzIH0sCiAJeyAicmVxdWVzdF9pcnEiLCAma3ZtX3N0YXQucmVxdWVzdF9pcnFfZXhpdHMgfSwKIAl7ICJpcnFfZXhpdHMiLCAma3ZtX3N0YXQuaXJxX2V4aXRzIH0sCi0JeyAwLCAwIH0KKwl7IE5VTEwsIE5VTEwgfQogfTsKIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAJbXV0ZXhfbG9jaygmdmNwdS0+bXV0ZXgpOwogCWlmICh1bmxpa2VseSghdmNwdS0+dm1jcykpIHsKIAkJbXV0ZXhfdW5sb2NrKCZ2Y3B1LT5tdXRleCk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gTlVMTDsKIAl9CiAJcmV0dXJuIGt2bV9hcmNoX29wcy0+dmNwdV9sb2FkKHZjcHUpOwogfQpAQCAtMjU3LDkgKzI1Nyw5IEBACiAJaWYgKCFkb250IHx8IGZyZWUtPmRpcnR5X2JpdG1hcCAhPSBkb250LT5kaXJ0eV9iaXRtYXApCiAJCXZmcmVlKGZyZWUtPmRpcnR5X2JpdG1hcCk7CiAKLQlmcmVlLT5waHlzX21lbSA9IDA7CisJZnJlZS0+cGh5c19tZW0gPSBOVUxMOwogCWZyZWUtPm5wYWdlcyA9IDA7Ci0JZnJlZS0+ZGlydHlfYml0bWFwID0gMDsKKwlmcmVlLT5kaXJ0eV9iaXRtYXAgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBrdm1fZnJlZV9waHlzbWVtKHN0cnVjdCBrdm0gKmt2bSkKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGt2bS0+bm1lbXNsb3RzOyArK2kpCi0JCWt2bV9mcmVlX3BoeXNtZW1fc2xvdCgma3ZtLT5tZW1zbG90c1tpXSwgMCk7CisJCWt2bV9mcmVlX3BoeXNtZW1fc2xvdCgma3ZtLT5tZW1zbG90c1tpXSwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGt2bV9mcmVlX3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtNjQwLDExICs2NDAsMTEgQEAKIAogCS8qIERlYWxsb2NhdGUgaWYgc2xvdCBpcyBiZWluZyByZW1vdmVkICovCiAJaWYgKCFucGFnZXMpCi0JCW5ldy5waHlzX21lbSA9IDA7CisJCW5ldy5waHlzX21lbSA9IE5VTEw7CiAKIAkvKiBGcmVlIHBhZ2UgZGlydHkgYml0bWFwIGlmIHVubmVlZGVkICovCiAJaWYgKCEobmV3LmZsYWdzICYgS1ZNX01FTV9MT0dfRElSVFlfUEFHRVMpKQotCQluZXcuZGlydHlfYml0bWFwID0gMDsKKwkJbmV3LmRpcnR5X2JpdG1hcCA9IE5VTEw7CiAKIAlyID0gLUVOT01FTTsKIApAQCAtNzk5LDE0ICs3OTksMTQgQEAKIAkJICAgICYmIGdmbiA8IG1lbXNsb3QtPmJhc2VfZ2ZuICsgbWVtc2xvdC0+bnBhZ2VzKQogCQkJcmV0dXJuIG1lbXNsb3Q7CiAJfQotCXJldHVybiAwOworCXJldHVybiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2ZuX3RvX21lbXNsb3QpOwogCiB2b2lkIG1hcmtfcGFnZV9kaXJ0eShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKIHsKIAlpbnQgaTsKLQlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90ID0gMDsKKwlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIHJlbF9nZm47CiAKIAlmb3IgKGkgPSAwOyBpIDwga3ZtLT5ubWVtc2xvdHM7ICsraSkgewpAQCAtMTc3OCw2ICsxNzc4LDcgQEAKIAkJCSAgdW5zaWduZWQgaW50IGlvY3RsLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3Qga3ZtICprdm0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IHIgPSAtRUlOVkFMOwogCiAJc3dpdGNoIChpb2N0bCkgewpAQCAtMTc5NCwxMiArMTc5NSwxMiBAQAogCQlzdHJ1Y3Qga3ZtX3J1biBrdm1fcnVuOwogCiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9ydW4sICh2b2lkICopYXJnLCBzaXplb2Yga3ZtX3J1bikpCisJCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3J1biwgYXJncCwgc2l6ZW9mIGt2bV9ydW4pKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fZGV2X2lvY3RsX3J1bihrdm0sICZrdm1fcnVuKTsKIAkJaWYgKHIgPCAwICYmICByICE9IC1FSU5UUikKIAkJCWdvdG8gb3V0OwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAma3ZtX3J1biwgc2l6ZW9mIGt2bV9ydW4pKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmt2bV9ydW4sIHNpemVvZiBrdm1fcnVuKSkgewogCQkJciA9IC1FRkFVTFQ7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTgwOSwxMyArMTgxMCwxMyBAQAogCQlzdHJ1Y3Qga3ZtX3JlZ3Mga3ZtX3JlZ3M7CiAKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3JlZ3MsICh2b2lkICopYXJnLCBzaXplb2Yga3ZtX3JlZ3MpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9yZWdzLCBhcmdwLCBzaXplb2Yga3ZtX3JlZ3MpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fZGV2X2lvY3RsX2dldF9yZWdzKGt2bSwgJmt2bV9yZWdzKTsKIAkJaWYgKHIpCiAJCQlnb3RvIG91dDsKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZrdm1fcmVncywgc2l6ZW9mIGt2bV9yZWdzKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAma3ZtX3JlZ3MsIHNpemVvZiBrdm1fcmVncykpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CiAJCWJyZWFrOwpAQCAtMTgyNCw3ICsxODI1LDcgQEAKIAkJc3RydWN0IGt2bV9yZWdzIGt2bV9yZWdzOwogCiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9yZWdzLCAodm9pZCAqKWFyZywgc2l6ZW9mIGt2bV9yZWdzKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fcmVncywgYXJncCwgc2l6ZW9mIGt2bV9yZWdzKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX2Rldl9pb2N0bF9zZXRfcmVncyhrdm0sICZrdm1fcmVncyk7CiAJCWlmIChyKQpAQCAtMTgzNiwxMyArMTgzNywxMyBAQAogCQlzdHJ1Y3Qga3ZtX3NyZWdzIGt2bV9zcmVnczsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fc3JlZ3MsICh2b2lkICopYXJnLCBzaXplb2Yga3ZtX3NyZWdzKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fc3JlZ3MsIGFyZ3AsIHNpemVvZiBrdm1fc3JlZ3MpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fZGV2X2lvY3RsX2dldF9zcmVncyhrdm0sICZrdm1fc3JlZ3MpOwogCQlpZiAocikKIAkJCWdvdG8gb3V0OwogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmt2bV9zcmVncywgc2l6ZW9mIGt2bV9zcmVncykpCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmt2bV9zcmVncywgc2l6ZW9mIGt2bV9zcmVncykpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CiAJCWJyZWFrOwpAQCAtMTg1MSw3ICsxODUyLDcgQEAKIAkJc3RydWN0IGt2bV9zcmVncyBrdm1fc3JlZ3M7CiAKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3NyZWdzLCAodm9pZCAqKWFyZywgc2l6ZW9mIGt2bV9zcmVncykpCisJCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3NyZWdzLCBhcmdwLCBzaXplb2Yga3ZtX3NyZWdzKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX2Rldl9pb2N0bF9zZXRfc3JlZ3Moa3ZtLCAma3ZtX3NyZWdzKTsKIAkJaWYgKHIpCkBAIC0xODYzLDEzICsxODY0LDEzIEBACiAJCXN0cnVjdCBrdm1fdHJhbnNsYXRpb24gdHI7CiAKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdHIsICh2b2lkICopYXJnLCBzaXplb2YgdHIpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJnRyLCBhcmdwLCBzaXplb2YgdHIpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fZGV2X2lvY3RsX3RyYW5zbGF0ZShrdm0sICZ0cik7CiAJCWlmIChyKQogCQkJZ290byBvdXQ7CiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmdHIsIHNpemVvZiB0cikpCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnRyLCBzaXplb2YgdHIpKQogCQkJZ290byBvdXQ7CiAJCXIgPSAwOwogCQlicmVhazsKQEAgLTE4NzgsNyArMTg3OSw3IEBACiAJCXN0cnVjdCBrdm1faW50ZXJydXB0IGlycTsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpcnEsICh2b2lkICopYXJnLCBzaXplb2YgaXJxKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpcnEsIGFyZ3AsIHNpemVvZiBpcnEpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fZGV2X2lvY3RsX2ludGVycnVwdChrdm0sICZpcnEpOwogCQlpZiAocikKQEAgLTE4OTAsNyArMTg5MSw3IEBACiAJCXN0cnVjdCBrdm1fZGVidWdfZ3Vlc3QgZGJnOwogCiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmRiZywgKHZvaWQgKilhcmcsIHNpemVvZiBkYmcpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmRiZywgYXJncCwgc2l6ZW9mIGRiZykpCiAJCQlnb3RvIG91dDsKIAkJciA9IGt2bV9kZXZfaW9jdGxfZGVidWdfZ3Vlc3Qoa3ZtLCAmZGJnKTsKIAkJaWYgKHIpCkBAIC0xOTAyLDcgKzE5MDMsNyBAQAogCQlzdHJ1Y3Qga3ZtX21lbW9yeV9yZWdpb24ga3ZtX21lbTsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fbWVtLCAodm9pZCAqKWFyZywgc2l6ZW9mIGt2bV9tZW0pKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9tZW0sIGFyZ3AsIHNpemVvZiBrdm1fbWVtKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX2Rldl9pb2N0bF9zZXRfbWVtb3J5X3JlZ2lvbihrdm0sICZrdm1fbWVtKTsKIAkJaWYgKHIpCkBAIC0xOTEzLDcgKzE5MTQsNyBAQAogCQlzdHJ1Y3Qga3ZtX2RpcnR5X2xvZyBsb2c7CiAKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmbG9nLCAodm9pZCAqKWFyZywgc2l6ZW9mIGxvZykpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbG9nLCBhcmdwLCBzaXplb2YgbG9nKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX2Rldl9pb2N0bF9nZXRfZGlydHlfbG9nKGt2bSwgJmxvZyk7CiAJCWlmIChyKQpAQCAtMTkyMSwxMyArMTkyMiwxMyBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBLVk1fR0VUX01TUlM6Ci0JCXIgPSBtc3JfaW8oa3ZtLCAodm9pZCBfX3VzZXIgKilhcmcsIGdldF9tc3IsIDEpOworCQlyID0gbXNyX2lvKGt2bSwgYXJncCwgZ2V0X21zciwgMSk7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX1NFVF9NU1JTOgotCQlyID0gbXNyX2lvKGt2bSwgKHZvaWQgX191c2VyICopYXJnLCBkb19zZXRfbXNyLCAwKTsKKwkJciA9IG1zcl9pbyhrdm0sIGFyZ3AsIGRvX3NldF9tc3IsIDApOwogCQlicmVhazsKIAljYXNlIEtWTV9HRVRfTVNSX0lOREVYX0xJU1Q6IHsKLQkJc3RydWN0IGt2bV9tc3JfbGlzdCBfX3VzZXIgKnVzZXJfbXNyX2xpc3QgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJCXN0cnVjdCBrdm1fbXNyX2xpc3QgX191c2VyICp1c2VyX21zcl9saXN0ID0gYXJncDsKIAkJc3RydWN0IGt2bV9tc3JfbGlzdCBtc3JfbGlzdDsKIAkJdW5zaWduZWQgbjsKIApAQCAtMjAxNCw3ICsyMDE1LDcgQEAKIAkJICogaW4gdm14IHJvb3QgbW9kZS4KIAkJICovCiAJCXByaW50ayhLRVJOX0lORk8gImt2bTogZXhpdGluZyBoYXJkd2FyZSB2aXJ0dWFsaXphdGlvblxuIik7Ci0JCW9uX2VhY2hfY3B1KGt2bV9hcmNoX29wcy0+aGFyZHdhcmVfZGlzYWJsZSwgMCwgMCwgMSk7CisJCW9uX2VhY2hfY3B1KGt2bV9hcmNoX29wcy0+aGFyZHdhcmVfZGlzYWJsZSwgTlVMTCwgMCwgMSk7CiAJfQogCXJldHVybiBOT1RJRllfT0s7CiB9CkBAIC0yMDI4LDcgKzIwMjksNyBAQAogewogCXN0cnVjdCBrdm1fc3RhdHNfZGVidWdmc19pdGVtICpwOwogCi0JZGVidWdmc19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImt2bSIsIDApOworCWRlYnVnZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJrdm0iLCBOVUxMKTsKIAlmb3IgKHAgPSBkZWJ1Z2ZzX2VudHJpZXM7IHAtPm5hbWU7ICsrcCkKIAkJcC0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfdTMyKHAtPm5hbWUsIDA0NDQsIGRlYnVnZnNfZGlyLAogCQkJCQkgICAgICAgcC0+ZGF0YSk7CkBAIC0yMDY5LDcgKzIwNzAsNyBAQAogCWlmIChyIDwgMCkKIAkgICAgcmV0dXJuIHI7CiAKLQlvbl9lYWNoX2NwdShrdm1fYXJjaF9vcHMtPmhhcmR3YXJlX2VuYWJsZSwgMCwgMCwgMSk7CisJb25fZWFjaF9jcHUoa3ZtX2FyY2hfb3BzLT5oYXJkd2FyZV9lbmFibGUsIE5VTEwsIDAsIDEpOwogCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigma3ZtX3JlYm9vdF9ub3RpZmllcik7CiAKIAlrdm1fY2hhcmRldl9vcHMub3duZXIgPSBtb2R1bGU7CkBAIC0yMDg0LDcgKzIwODUsNyBAQAogCiBvdXRfZnJlZToKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigma3ZtX3JlYm9vdF9ub3RpZmllcik7Ci0Jb25fZWFjaF9jcHUoa3ZtX2FyY2hfb3BzLT5oYXJkd2FyZV9kaXNhYmxlLCAwLCAwLCAxKTsKKwlvbl9lYWNoX2NwdShrdm1fYXJjaF9vcHMtPmhhcmR3YXJlX2Rpc2FibGUsIE5VTEwsIDAsIDEpOwogCWt2bV9hcmNoX29wcy0+aGFyZHdhcmVfdW5zZXR1cCgpOwogCXJldHVybiByOwogfQpAQCAtMjA5NCw3ICsyMDk1LDcgQEAKIAltaXNjX2RlcmVnaXN0ZXIoJmt2bV9kZXYpOwogCiAJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmt2bV9yZWJvb3Rfbm90aWZpZXIpOwotCW9uX2VhY2hfY3B1KGt2bV9hcmNoX29wcy0+aGFyZHdhcmVfZGlzYWJsZSwgMCwgMCwgMSk7CisJb25fZWFjaF9jcHUoa3ZtX2FyY2hfb3BzLT5oYXJkd2FyZV9kaXNhYmxlLCBOVUxMLCAwLCAxKTsKIAlrdm1fYXJjaF9vcHMtPmhhcmR3YXJlX3Vuc2V0dXAoKTsKIAlrdm1fYXJjaF9vcHMgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0vbW11LmMgYi9kcml2ZXJzL2t2bS9tbXUuYwppbmRleCAyMmM0MjZjLi5iZTc5Mzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2t2bS9tbXUuYworKysgYi9kcml2ZXJzL2t2bS9tbXUuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJZm9yIChqID0gUk1BUF9FWFQgLSAxOyAhZGVzYy0+c2hhZG93X3B0ZXNbal0gJiYgaiA+IGk7IC0taikKIAkJOwogCWRlc2MtPnNoYWRvd19wdGVzW2ldID0gZGVzYy0+c2hhZG93X3B0ZXNbal07Ci0JZGVzYy0+c2hhZG93X3B0ZXNbal0gPSAwOworCWRlc2MtPnNoYWRvd19wdGVzW2pdID0gTlVMTDsKIAlpZiAoaiAhPSAwKQogCQlyZXR1cm47CiAJaWYgKCFwcmV2X2Rlc2MgJiYgIWRlc2MtPm1vcmUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2t2bS9zdm0uYyBiL2RyaXZlcnMva3ZtL3N2bS5jCmluZGV4IGM3OWRmNzkuLjg1ZjYxZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMva3ZtL3N2bS5jCisrKyBiL2RyaXZlcnMva3ZtL3N2bS5jCkBAIC0yNzQsNyArMjc0LDcgQEAKIAkJd3Jtc3JsKE1TUl9WTV9IU0FWRV9QQSwgMCk7CiAJCXJkbXNybChNU1JfRUZFUiwgZWZlcik7CiAJCXdybXNybChNU1JfRUZFUiwgZWZlciAmIH5NU1JfRUZFUl9TVk1FX01BU0spOwotCQlwZXJfY3B1KHN2bV9kYXRhLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IDA7CisJCXBlcl9jcHUoc3ZtX2RhdGEsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpID0gTlVMTDsKIAkJX19mcmVlX3BhZ2Uoc3ZtX2RhdGEtPnNhdmVfYXJlYSk7CiAJCWtmcmVlKHN2bV9kYXRhKTsKIAl9CkBAIC02NDIsNyArNjQyLDcgQEAKIAljYXNlIFZDUFVfU1JFR19MRFRSOiByZXR1cm4gJnNhdmUtPmxkdHI7CiAJfQogCUJVRygpOwotCXJldHVybiAwOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdTY0IHN2bV9nZXRfc2VnbWVudF9iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHNlZykKQEAgLTkzNCw3ICs5MzQsNyBAQAogCQlyZXR1cm4gMDsKIAogCSphZGRyX292ZXJyaWRlID0gMDsKLQkqc2VnID0gMDsKKwkqc2VnID0gTlVMTDsKIAlmb3IgKGkgPSAwOyBpIDwgaW5zX2xlbmd0aDsgaSsrKQogCQlzd2l0Y2ggKGluc3RbaV0pIHsKIAkJY2FzZSAweGYwOgpAQCAtMTA4Nyw3ICsxMDg3LDcgQEAKIAogc3RhdGljIGludCBlbXVsYXRlX29uX2ludGVyY2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQogewotCWlmIChlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDAsIDAsIDApICE9IEVNVUxBVEVfRE9ORSkKKwlpZiAoZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCBOVUxMLCAwLCAwKSAhPSBFTVVMQVRFX0RPTkUpCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMva3ZtL3ZteC5jIGIvZHJpdmVycy9rdm0vdm14LmMKaW5kZXggNTRjMzVjMC4uMjdlMDVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9rdm0vdm14LmMKKysrIGIvZHJpdmVycy9rdm0vdm14LmMKQEAgLTk4LDcgKzk4LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgdmNwdS0+bm1zcnM7ICsraSkKIAkJaWYgKHZjcHUtPmd1ZXN0X21zcnNbaV0uaW5kZXggPT0gbXNyKQogCQkJcmV0dXJuICZ2Y3B1LT5ndWVzdF9tc3JzW2ldOwotCXJldHVybiAwOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCB2bWNzX2NsZWFyKHN0cnVjdCB2bWNzICp2bWNzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvcmFjay1tZXRlci5jIGIvZHJpdmVycy9tYWNpbnRvc2gvcmFjay1tZXRlci5jCmluZGV4IDVlZDQxZmUuLmY4M2ZhZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3JhY2stbWV0ZXIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9yYWNrLW1ldGVyLmMKQEAgLTE3MSwxMSArMTcxLDExIEBACiAJLyogTWFrZSBzdXJlIGRiZG1hIGlzIHJlc2V0ICovCiAJREJETUFfRE9fUkVTRVQocm0tPmRtYV9yZWdzKTsKIAotCXByX2RlYnVnKCJyYWNrbWV0ZXI6IG1hcmsgb2Zmc2V0PTB4JWx4XG4iLAorCXByX2RlYnVnKCJyYWNrbWV0ZXI6IG1hcmsgb2Zmc2V0PTB4JXp4XG4iLAogCQkgb2Zmc2V0b2Yoc3RydWN0IHJhY2ttZXRlcl9kbWEsIG1hcmspKTsKLQlwcl9kZWJ1ZygicmFja21ldGVyOiBidWYxIG9mZnNldD0weCVseFxuIiwKKwlwcl9kZWJ1ZygicmFja21ldGVyOiBidWYxIG9mZnNldD0weCV6eFxuIiwKIAkJIG9mZnNldG9mKHN0cnVjdCByYWNrbWV0ZXJfZG1hLCBidWYxKSk7Ci0JcHJfZGVidWcoInJhY2ttZXRlcjogYnVmMiBvZmZzZXQ9MHglbHhcbiIsCisJcHJfZGVidWcoInJhY2ttZXRlcjogYnVmMiBvZmZzZXQ9MHglenhcbiIsCiAJCSBvZmZzZXRvZihzdHJ1Y3QgcmFja21ldGVyX2RtYSwgYnVmMikpOwogCiAJLyogUHJlcGFyZSA0IGRiZG1hIGNvbW1hbmRzIGZvciB0aGUgMiBidWZmZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMKaW5kZXggZjUxZTAyZmUuLjBlOTQ4YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMKQEAgLTY5OCw3ICs2OTgsNiBAQAogCVsgMHgyOSBdID0gS0VZX1RFWFQsCiAJWyAweDJhIF0gPSBLRVlfTUVESUEsCiAJWyAweDE4IF0gPSBLRVlfRVBHLAotCVsgMHgyNyBdID0gS0VZX1JFQ09SRCwKIH07CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX3Bpbm5hY2xlX2dyZXkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYwppbmRleCA3MjQzMzM3Li5iZGQ2MzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYwpAQCAtMTA3Miw3ICsxMDcyLDcgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCB1c2J2aXNpb25fdjRsMl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsCitzdGF0aWMgc3NpemVfdCB1c2J2aXNpb25fdjRsMl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL0tjb25maWcgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwppbmRleCA4OWJiYTI3Li5iZWRhZTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21pc2MvS2NvbmZpZwpAQCAtNDIsNyArNDIsNyBAQAogCiBjb25maWcgVElGTV9DT1JFCiAJdHJpc3RhdGUgIlRJIEZsYXNoIE1lZGlhIGludGVyZmFjZSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgUENJCiAJaGVscAogCSAgSWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMoUikgRmxhc2ggTWVkaWEgYWRhcHRlcnMKIAkgIHlvdSBzaG91bGQgc2VsZWN0IHRoaXMgb3B0aW9uIGFuZCB0aGVuIGFsc28gY2hvb3NlIGFuIGFwcHJvcHJpYXRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGtkdG0uYyBiL2RyaXZlcnMvbWlzYy9sa2R0bS5jCmluZGV4IGRiOWQ3ZGYuLjU1MmI3OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9sa2R0bS5jCisrKyBiL2RyaXZlcnMvbWlzYy9sa2R0bS5jCkBAIC0xMDgsOCArMTA4LDggQEAKIHN0YXRpYyBpbnQgbGtkdG1fcGFyc2VfY29tbWFuZGxpbmUodm9pZCk7CiBzdGF0aWMgdm9pZCBsa2R0bV9oYW5kbGVyKHZvaWQpOwogCi1zdGF0aWMgY2hhciogY3BvaW50X25hbWUgPSBJTlZBTElEOwotc3RhdGljIGNoYXIqIGNwb2ludF90eXBlID0gTk9ORTsKK3N0YXRpYyBjaGFyKiBjcG9pbnRfbmFtZTsKK3N0YXRpYyBjaGFyKiBjcG9pbnRfdHlwZTsKIHN0YXRpYyBpbnQgY3BvaW50X2NvdW50ID0gREVGQVVMVF9DT1VOVDsKIHN0YXRpYyBpbnQgcmVjdXJfY291bnQgPSBSRUNfTlVNX0RFRkFVTFQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL0tjb25maWcgYi9kcml2ZXJzL21tYy9LY29uZmlnCmluZGV4IDQyMjQ2ODYuLjEyYWY5YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL0tjb25maWcKKysrIGIvZHJpdmVycy9tbWMvS2NvbmZpZwpAQCAtMTExLDcgKzExMSw3IEBACiAKIGNvbmZpZyBNTUNfVElGTV9TRAogCXRyaXN0YXRlICJUSSBGbGFzaCBNZWRpYSBNTUMvU0QgSW50ZXJmYWNlIHN1cHBvcnQgIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gTU1DICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gTU1DICYmIEVYUEVSSU1FTlRBTCAmJiBQQ0kKIAlzZWxlY3QgVElGTV9DT1JFCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGFjY2VzcyBNTUMvU0QgY2FyZHMgd2l0aApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDMuYyBiL2RyaXZlcnMvbmV0LzNjNTAzLmMKaW5kZXggN2UzNGM0Zi4uYmM3ZTkwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDMuYworKysgYi9kcml2ZXJzL25ldC8zYzUwMy5jCkBAIC02MDAsOCArNjAwLDcgQEAKIAkgICAgY291bnQgLT0gc2VtaV9jb3VudDsKIAkgICAgbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LCBiYXNlICsgZWlfc3RhdHVzLnByaXYsIGNvdW50KTsKIAl9IGVsc2UgewotCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCi0JCWV0aF9pb19jb3B5X2FuZF9zdW0oc2tiLCBiYXNlICsgcmluZ19vZmZzZXQsIGNvdW50LCAwKTsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIGJhc2UgKyByaW5nX29mZnNldCwgY291bnQpOwogCX0KIAlyZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggYjc5NzExZC4uMzhmNDFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0yMzM1LDYgKzIzMzUsMTcgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHFsYTN4eHguCiAKK2NvbmZpZyBBVEwxCisJdHJpc3RhdGUgIkF0dGFuc2ljIEwxIEdpZ2FiaXQgRXRoZXJuZXQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgQXR0YW5zaWMgTDEgZ2lnYWJpdCBldGhlcm5ldCBhZGFwdGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXRsMS4KKwogZW5kbWVudQogCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCmluZGV4IDA4NzhlM2QuLjMzYWY4MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogb2JqLSQoQ09ORklHX0NIRUxTSU9fVDMpICs9IGN4Z2IzLwogb2JqLSQoQ09ORklHX0VIRUEpICs9IGVoZWEvCiBvYmotJChDT05GSUdfQk9ORElORykgKz0gYm9uZGluZy8KK29iai0kKENPTkZJR19BVEwxKSArPSBhdGwxLwogb2JqLSQoQ09ORklHX0dJQU5GQVIpICs9IGdpYW5mYXJfZHJpdmVyLm8KIAogZ2lhbmZhcl9kcml2ZXItb2JqcyA6PSBnaWFuZmFyLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWMzMjAwLmMgYi9kcml2ZXJzL25ldC9hYzMyMDAuYwppbmRleCBjMDFmODdmLi42NDRjNDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hYzMyMDAuYworKysgYi9kcml2ZXJzL25ldC9hYzMyMDAuYwpAQCAtMzI3LDggKzMyNyw3IEBACiAJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwKIAkJCQllaV9zdGF0dXMubWVtICsgVFhfUEFHRVMqMjU2LCBjb3VudCk7CiAJfSBlbHNlIHsKLQkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLwotCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgc3RhcnQsIGNvdW50LCAwKTsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHN0YXJ0LCBjb3VudCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvYXRsMS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI3MDdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXRsMS9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19BVEwxKQkrPSBhdGwxLm8KK2F0bDEteQkJCSs9IGF0bDFfbWFpbi5vIGF0bDFfaHcubyBhdGwxX2V0aHRvb2wubyBhdGwxX3BhcmFtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMS5oIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjNjAzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMS5oCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDA2IEF0dGFuc2ljIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMDYgQ2hyaXMgU25vb2sgPGNzbm9va0ByZWRoYXQuY29tPgorICogQ29weXJpZ2h0KGMpIDIwMDYgSmF5IENsaWJ1cm4gPGpjbGlidXJuQGdtYWlsLmNvbT4KKyAqCisgKiBEZXJpdmVkIGZyb20gSW50ZWwgZTEwMDAgZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVRMMV9IXworI2RlZmluZSBfQVRMMV9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKyNpbmNsdWRlICJhdGwxX2h3LmgiCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgbmVlZGVkIGJ5IG11bHRpcGxlIGZpbGVzICovCitzMzIgYXRsMV91cChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgYXRsMV9kb3duKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IGF0bDFfcmVzZXQoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcik7CitzMzIgYXRsMV9zZXR1cF9yaW5nX3Jlc291cmNlcyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgYXRsMV9mcmVlX3JpbmdfcmVzb3VyY2VzKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpOworCitleHRlcm4gY2hhciBhdGwxX2RyaXZlcl9uYW1lW107CitleHRlcm4gY2hhciBhdGwxX2RyaXZlcl92ZXJzaW9uW107CitleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGF0bDFfZXRodG9vbF9vcHM7CisKK3N0cnVjdCBhdGwxX2FkYXB0ZXI7CisKKyNkZWZpbmUgQVRMMV9NQVhfSU5UUgkJMworCisjZGVmaW5lIEFUTDFfREVGQVVMVF9UUEQJMjU2CisjZGVmaW5lIEFUTDFfTUFYX1RQRAkJMTAyNAorI2RlZmluZSBBVEwxX01JTl9UUEQJCTY0CisjZGVmaW5lIEFUTDFfREVGQVVMVF9SRkQJNTEyCisjZGVmaW5lIEFUTDFfTUlOX1JGRAkJMTI4CisjZGVmaW5lIEFUTDFfTUFYX1JGRAkJMjA0OAorCisjZGVmaW5lIEFUTDFfR0VUX0RFU0MoUiwgaSwgdHlwZSkJKCYoKCh0eXBlICopKChSKS0+ZGVzYykpW2ldKSkKKyNkZWZpbmUgQVRMMV9SRkRfREVTQyhSLCBpKQlBVEwxX0dFVF9ERVNDKFIsIGksIHN0cnVjdCByeF9mcmVlX2Rlc2MpCisjZGVmaW5lIEFUTDFfVFBEX0RFU0MoUiwgaSkJQVRMMV9HRVRfREVTQyhSLCBpLCBzdHJ1Y3QgdHhfcGFja2V0X2Rlc2MpCisjZGVmaW5lIEFUTDFfUlJEX0RFU0MoUiwgaSkJQVRMMV9HRVRfREVTQyhSLCBpLCBzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MpCisKKy8qCisgKiBTb21lIHdvcmthcm91bmRzIHJlcXVpcmUgbWlsbGlzZWNvbmQgZGVsYXlzIGFuZCBhcmUgcnVuIGR1cmluZyBpbnRlcnJ1cHQKKyAqIGNvbnRleHQuICBNb3N0IG5vdGFibHksIHdoZW4gZXN0YWJsaXNoaW5nIGxpbmssIHRoZSBwaHkgbWF5IG5lZWQgdHdlYWtpbmcKKyAqIGJ1dCBjYW5ub3QgcHJvY2VzcyBwaHkgcmVnaXN0ZXIgcmVhZHMvd3JpdGVzIGZhc3RlciB0aGFuIG1pbGxpc2Vjb25kCisgKiBpbnRlcnZhbHMuLi5hbmQgd2UgZXN0YWJsaXNoIGxpbmsgZHVlIHRvIGEgImxpbmsgc3RhdHVzIGNoYW5nZSIgaW50ZXJydXB0LgorICovCisKKy8qCisgKiB3cmFwcGVyIGFyb3VuZCBhIHBvaW50ZXIgdG8gYSBzb2NrZXQgYnVmZmVyLAorICogc28gYSBETUEgaGFuZGxlIGNhbiBiZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgYnVmZmVyCisgKi8KK3N0cnVjdCBhdGwxX2J1ZmZlciB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MTYgbGVuZ3RoOworCXUxNiBhbGxvY2VkOworCWRtYV9hZGRyX3QgZG1hOworfTsKKworI2RlZmluZSBNQVhfVFhfQlVGX0xFTgkJMHgzMDAwCS8qIDEyS0IgKi8KKworc3RydWN0IGF0bDFfdHBkX3JpbmcgeworCXZvaWQgKmRlc2M7CQkvKiBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIHJpbmcgbWVtb3J5ICovCisJZG1hX2FkZHJfdCBkbWE7CQkvKiBwaHlzaWNhbCBhZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCXUxNiBzaXplOwkJLyogbGVuZ3RoIG9mIGRlc2NyaXB0b3IgcmluZyBpbiBieXRlcyAqLworCXUxNiBjb3VudDsJCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyAqLworCXUxNiBod19pZHg7CQkvKiBoYXJkd2FyZSBpbmRleCAqLworCWF0b21pY190IG5leHRfdG9fY2xlYW47CisJYXRvbWljX3QgbmV4dF90b191c2U7CisJc3RydWN0IGF0bDFfYnVmZmVyICpidWZmZXJfaW5mbzsKK307CisKK3N0cnVjdCBhdGwxX3JmZF9yaW5nIHsKKwl2b2lkICpkZXNjOworCWRtYV9hZGRyX3QgZG1hOworCXUxNiBzaXplOworCXUxNiBjb3VudDsKKwlhdG9taWNfdCBuZXh0X3RvX3VzZTsKKwl1MTYgbmV4dF90b19jbGVhbjsKKwlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOworfTsKKworc3RydWN0IGF0bDFfcnJkX3JpbmcgeworCXZvaWQgKmRlc2M7CisJZG1hX2FkZHJfdCBkbWE7CisJdW5zaWduZWQgaW50IHNpemU7CisJdTE2IGNvdW50OworCXUxNiBuZXh0X3RvX3VzZTsKKwlhdG9taWNfdCBuZXh0X3RvX2NsZWFuOworfTsKKworc3RydWN0IGF0bDFfcmluZ19oZWFkZXIgeworCXZvaWQgKmRlc2M7CQkvKiBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIHJpbmcgbWVtb3J5ICovCisJZG1hX2FkZHJfdCBkbWE7CQkvKiBwaHlzaWNhbCBhZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCXVuc2lnbmVkIGludCBzaXplOwkvKiBsZW5ndGggb2YgZGVzY3JpcHRvciByaW5nIGluIGJ5dGVzICovCit9OworCitzdHJ1Y3QgYXRsMV9jbWIgeworCXN0cnVjdCBjb2Fsc19tc2dfYmxvY2sgKmNtYjsKKwlkbWFfYWRkcl90IGRtYTsKK307CisKK3N0cnVjdCBhdGwxX3NtYiB7CisJc3RydWN0IHN0YXRzX21zZ19ibG9jayAqc21iOworCWRtYV9hZGRyX3QgZG1hOworfTsKKworLyogU3RhdGlzdGljcyBjb3VudGVycyAqLworc3RydWN0IGF0bDFfc2Z0X3N0YXRzIHsKKwl1NjQgcnhfcGFja2V0czsKKwl1NjQgdHhfcGFja2V0czsKKwl1NjQgcnhfYnl0ZXM7CisJdTY0IHR4X2J5dGVzOworCXU2NCBtdWx0aWNhc3Q7CisJdTY0IGNvbGxpc2lvbnM7CisJdTY0IHJ4X2Vycm9yczsKKwl1NjQgcnhfbGVuZ3RoX2Vycm9yczsKKwl1NjQgcnhfY3JjX2Vycm9yczsKKwl1NjQgcnhfZnJhbWVfZXJyb3JzOworCXU2NCByeF9maWZvX2Vycm9yczsKKwl1NjQgcnhfbWlzc2VkX2Vycm9yczsKKwl1NjQgdHhfZXJyb3JzOworCXU2NCB0eF9maWZvX2Vycm9yczsKKwl1NjQgdHhfYWJvcnRlZF9lcnJvcnM7CisJdTY0IHR4X3dpbmRvd19lcnJvcnM7CisJdTY0IHR4X2NhcnJpZXJfZXJyb3JzOworCisJdTY0IHR4X3BhdXNlOwkJLyogbnVtIFBhdXNlIHBhY2tldCB0cmFuc21pdHRlZC4gKi8KKwl1NjQgZXhjZWNvbDsJCS8qIG51bSB0eCBwYWNrZXRzIGFib3J0ZWQgZHVlIHRvIGV4Y2Vzc2l2ZSBjb2xsaXNpb25zLiAqLworCXU2NCBkZWZmZXI7CQkvKiBudW0gZGVmZXJyZWQgdHggcGFja2V0cyAqLworCXU2NCBzY2M7CQkvKiBudW0gcGFja2V0cyBzdWJzZXF1ZW50bHkgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5IHcvIHNpbmdsZSBwcmlvciBjb2xsaXNpb24uICovCisJdTY0IG1jYzsJCS8qIG51bSBwYWNrZXRzIHN1YnNlcXVlbnRseSB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgdy8gbXVsdGlwbGUgcHJpb3IgY29sbGlzaW9ucy4gKi8KKwl1NjQgbGF0ZWNvbDsJCS8qIG51bSB0eCBwYWNrZXRzICB3LyBsYXRlIGNvbGxpc2lvbnMuICovCisJdTY0IHR4X3VuZGVydW47CQkvKiBudW0gdHggcGFja2V0cyBhYm9ydGVkIGR1ZSB0byB0cmFuc21pdCBGSUZPIHVuZGVycnVuLCBvciBUUkQgRklGTyB1bmRlcnJ1biAqLworCXU2NCB0eF90cnVuYzsJCS8qIG51bSB0eCBwYWNrZXRzIHRydW5jYXRlZCBkdWUgdG8gc2l6ZSBleGNlZWRpbmcgTVRVLCByZWdhcmRsZXNzIHdoZXRoZXIgdHJ1bmNhdGVkIGJ5IFNlbGVuZSBvciBub3QuIChUaGUgbmFtZSBkb2Vzbid0IHJlYWxseSByZWZsZWN0IHRoZSBtZWFuaW5nIGluIHRoaXMgY2FzZS4pICovCisJdTY0IHJ4X3BhdXNlOwkJLyogbnVtIFBhdXNlIHBhY2tldHMgcmVjZWl2ZWQuICovCisJdTY0IHJ4X3JyZF9vdjsKKwl1NjQgcnhfdHJ1bmM7Cit9OworCisvKiBib2FyZCBzcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCisjZGVmaW5lIEFUTDFfUkVHU19MRU4JOAorCisvKiBTdHJ1Y3R1cmUgY29udGFpbmluZyB2YXJpYWJsZXMgdXNlZCBieSB0aGUgc2hhcmVkIGNvZGUgKi8KK3N0cnVjdCBhdGwxX2h3IHsKKwl1OCBfX2lvbWVtICpod19hZGRyOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmJhY2s7CisJZW51bSBhdGwxX2RtYV9vcmRlciBkbWFfb3JkOworCWVudW0gYXRsMV9kbWFfcmNiIHJjYl92YWx1ZTsKKwllbnVtIGF0bDFfZG1hX3JlcV9ibG9jayBkbWFyX2Jsb2NrOworCWVudW0gYXRsMV9kbWFfcmVxX2Jsb2NrIGRtYXdfYmxvY2s7CisJdTggcHJlYW1ibGVfbGVuOworCXU4IG1heF9yZXRyeTsJCS8qIFJldHJhbnNtaXNzaW9uIG1heGltdW0sIGFmdGVyIHdoaWNoIHRoZSBwYWNrZXQgd2lsbCBiZSBkaXNjYXJkZWQgKi8KKwl1OCBqYW1faXBnOwkJLyogSVBHIHRvIHN0YXJ0IEpBTSBmb3IgY29sbGlzaW9uIGJhc2VkIGZsb3cgY29udHJvbCBpbiBoYWxmLWR1cGxleCBtb2RlLiBJbiB1bml0cyBvZiA4LWJpdCB0aW1lICovCisJdTggaXBndDsJCS8qIERlc2lyZWQgYmFjayB0byBiYWNrIGludGVyLXBhY2tldCBnYXAuIFRoZSBkZWZhdWx0IGlzIDk2LWJpdCB0aW1lICovCisJdTggbWluX2lmZzsJCS8qIE1pbmltdW0gbnVtYmVyIG9mIElGRyB0byBlbmZvcmNlIGluIGJldHdlZW4gUlggZnJhbWVzLiBGcmFtZSBnYXAgYmVsb3cgc3VjaCBJRlAgaXMgZHJvcHBlZCAqLworCXU4IGlwZ3IxOwkJLyogNjRiaXQgQ2Fycmllci1TZW5zZSB3aW5kb3cgKi8KKwl1OCBpcGdyMjsJCS8qIDk2LWJpdCBJUEcgd2luZG93ICovCisJdTggdHBkX2J1cnN0OwkJLyogTnVtYmVyIG9mIFRQRCB0byBwcmVmZXRjaCBpbiBjYWNoZS1hbGlnbmVkIGJ1cnN0LiBFYWNoIFRQRCBpcyAxNiBieXRlcyBsb25nICovCisJdTggcmZkX2J1cnN0OwkJLyogTnVtYmVyIG9mIFJGRCB0byBwcmVmZXRjaCBpbiBjYWNoZS1hbGlnbmVkIGJ1cnN0LiBFYWNoIFJGRCBpcyAxMiBieXRlcyBsb25nICovCisJdTggcmZkX2ZldGNoX2dhcDsKKwl1OCBycmRfYnVyc3Q7CQkvKiBUaHJlc2hvbGQgbnVtYmVyIG9mIFJSRHMgdGhhdCBjYW4gYmUgcmV0aXJlZCBpbiBhIGJ1cnN0LiBFYWNoIFJSRCBpcyAxNiBieXRlcyBsb25nICovCisJdTggdHBkX2ZldGNoX3RoOworCXU4IHRwZF9mZXRjaF9nYXA7CisJdTE2IHR4X2p1bWJvX3Rhc2tfdGg7CisJdTE2IHR4Zl9idXJzdDsJCS8qIE51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIHJlYWQgaW4gYSBjYWNoZS1hbGlnbmVkIGJ1cnN0LiBFYWNoIFNSQU0gZW50cnkgaXMKKwkJCQkgICA4IGJ5dGVzIGxvbmcgKi8KKwl1MTYgcnhfanVtYm9fdGg7CS8qIEp1bWJvIHBhY2tldCBzaXplIGZvciBub24tVkxBTiBwYWNrZXQuIFZMQU4gcGFja2V0cyBzaG91bGQgYWRkIDQgYnl0ZXMgKi8KKwl1MTYgcnhfanVtYm9fbGthaDsKKwl1MTYgcnJkX3JldF90aW1lcjsJLyogUlJEIHJldGlyZW1lbnQgdGltZXIuIERlY3JlbWVudCBieSAxIGFmdGVyIGV2ZXJ5IDUxMm5zIHBhc3Nlcy4gKi8KKwl1MTYgbGNvbDsJCS8qIENvbGxpc2lvbiBXaW5kb3cgKi8KKworCXUxNiBjbWJfdHBkOworCXUxNiBjbWJfcnJkOworCXUxNiBjbWJfcnhfdGltZXI7CisJdTE2IGNtYl90eF90aW1lcjsKKwl1MzIgc21iX3RpbWVyOworCXUxNiBtZWRpYV90eXBlOworCXUxNiBhdXRvbmVnX2FkdmVydGlzZWQ7CisJdTE2IHBjaV9jbWRfd29yZDsKKworCXUxNiBtaWlfYXV0b25lZ19hZHZfcmVnOworCXUxNiBtaWlfMTAwMHRfY3RybF9yZWc7CisKKwl1MzIgbWVtX3Jhbmc7CisJdTMyIHR4Y3c7CisJdTMyIG1heF9mcmFtZV9zaXplOworCXUzMiBtaW5fZnJhbWVfc2l6ZTsKKwl1MzIgbWNfZmlsdGVyX3R5cGU7CisJdTMyIG51bV9tY19hZGRyczsKKwl1MzIgY29sbGlzaW9uX2RlbHRhOworCXUzMiB0eF9wYWNrZXRfZGVsdGE7CisJdTE2IHBoeV9zcGRfZGVmYXVsdDsKKworCXUxNiBkZXZfcmV2OworCXU4IHJldmlzaW9uX2lkOworCisJLyogc3BpIGZsYXNoICovCisJdTggZmxhc2hfdmVuZG9yOworCisJdTggZG1hX2ZhaXJuZXNzOworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBwZXJtX21hY19hZGRyW0VUSF9BTEVOXTsKKworCS8qIGJvb2wgcGh5X3ByZWFtYmxlX3N1cDsgKi8KKwlib29sIHBoeV9jb25maWd1cmVkOworfTsKKworc3RydWN0IGF0bDFfYWRhcHRlciB7CisJLyogT1MgZGVmaW5lZCBzdHJ1Y3RzICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CisJc3RydWN0IGF0bDFfc2Z0X3N0YXRzIHNvZnRfc3RhdHM7CisKKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CisJdTMyIHJ4X2J1ZmZlcl9sZW47CisJdTMyIHdvbDsKKwl1MTYgbGlua19zcGVlZDsKKwl1MTYgbGlua19kdXBsZXg7CisJc3BpbmxvY2tfdCBsb2NrOworCWF0b21pY190IGlycV9zZW07CisJc3RydWN0IHdvcmtfc3RydWN0IHR4X3RpbWVvdXRfdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGlua19jaGdfdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcGNpZV9kbWFfdG9fcnN0X3Rhc2s7CisJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgcGh5X2NvbmZpZ190aW1lcjsKKwlib29sIHBoeV90aW1lcl9wZW5kaW5nOworCisJYm9vbCBtYWNfZGlzYWJsZWQ7CisKKwkvKiBBbGwgZGVzY3JpcHRvciByaW5ncycgbWVtb3J5ICovCisJc3RydWN0IGF0bDFfcmluZ19oZWFkZXIgcmluZ19oZWFkZXI7CisKKwkvKiBUWCAqLworCXN0cnVjdCBhdGwxX3RwZF9yaW5nIHRwZF9yaW5nOworCXNwaW5sb2NrX3QgbWJfbG9jazsKKworCS8qIFJYICovCisJc3RydWN0IGF0bDFfcmZkX3JpbmcgcmZkX3Jpbmc7CisJc3RydWN0IGF0bDFfcnJkX3JpbmcgcnJkX3Jpbmc7CisJdTY0IGh3X2NzdW1fZXJyOworCXU2NCBod19jc3VtX2dvb2Q7CisKKwl1MzIgZ29yY2w7CisJdTY0IGdvcmNsX29sZDsKKworCS8qIEludGVycnVwdCBNb2RlcmF0b3IgdGltZXIgKCAydXMgcmVzb2x1dGlvbikgKi8KKwl1MTYgaW10OworCS8qIEludGVycnVwdCBDbGVhciB0aW1lciAoMnVzIHJlc29sdXRpb24pICovCisJdTE2IGljdDsKKworCS8qIE1JSSBpbnRlcmZhY2UgaW5mbyAqLworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWk7CisKKwkvKiBzdHJ1Y3RzIGRlZmluZWQgaW4gYXRsMV9ody5oICovCisJdTMyIGJkX251bWJlcjsJCS8qIGJvYXJkIG51bWJlciAqLworCWJvb2wgcGNpX3VzaW5nXzY0OworCXN0cnVjdCBhdGwxX2h3IGh3OworCXN0cnVjdCBhdGwxX3NtYiBzbWI7CisJc3RydWN0IGF0bDFfY21iIGNtYjsKKworCXUzMiBwY2lfc3RhdGVbMTZdOworfTsKKworI2VuZGlmCS8qIF9BVEwxX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX2V0aHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTFjMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX2V0aHRvb2wuYwpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAwNiBBdHRhbnNpYyBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDA2IENocmlzIFNub29rIDxjc25vb2tAcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodChjKSAyMDA2IEpheSBDbGlidXJuIDxqY2xpYnVybkBnbWFpbC5jb20+CisgKgorICogRGVyaXZlZCBmcm9tIEludGVsIGUxMDAwIGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiYXRsMS5oIgorCitzdHJ1Y3QgYXRsMV9zdGF0cyB7CisJY2hhciBzdGF0X3N0cmluZ1tFVEhfR1NUUklOR19MRU5dOworCWludCBzaXplb2Zfc3RhdDsKKwlpbnQgc3RhdF9vZmZzZXQ7Cit9OworCisjZGVmaW5lIEFUTDFfU1RBVChtKSBzaXplb2YoKChzdHJ1Y3QgYXRsMV9hZGFwdGVyICopMCktPm0pLCBcCisJb2Zmc2V0b2Yoc3RydWN0IGF0bDFfYWRhcHRlciwgbSkKKworc3RhdGljIHN0cnVjdCBhdGwxX3N0YXRzIGF0bDFfZ3N0cmluZ3Nfc3RhdHNbXSA9IHsKKwl7InJ4X3BhY2tldHMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5yeF9wYWNrZXRzKX0sCisJeyJ0eF9wYWNrZXRzIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMudHhfcGFja2V0cyl9LAorCXsicnhfYnl0ZXMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5yeF9ieXRlcyl9LAorCXsidHhfYnl0ZXMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy50eF9ieXRlcyl9LAorCXsicnhfZXJyb3JzIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMucnhfZXJyb3JzKX0sCisJeyJ0eF9lcnJvcnMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy50eF9lcnJvcnMpfSwKKwl7InJ4X2Ryb3BwZWQiLCBBVEwxX1NUQVQobmV0X3N0YXRzLnJ4X2Ryb3BwZWQpfSwKKwl7InR4X2Ryb3BwZWQiLCBBVEwxX1NUQVQobmV0X3N0YXRzLnR4X2Ryb3BwZWQpfSwKKwl7Im11bHRpY2FzdCIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLm11bHRpY2FzdCl9LAorCXsiY29sbGlzaW9ucyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLmNvbGxpc2lvbnMpfSwKKwl7InJ4X2xlbmd0aF9lcnJvcnMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKX0sCisJeyJyeF9vdmVyX2Vycm9ycyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMpfSwKKwl7InJ4X2NyY19lcnJvcnMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5yeF9jcmNfZXJyb3JzKX0sCisJeyJyeF9mcmFtZV9lcnJvcnMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMpfSwKKwl7InJ4X2ZpZm9fZXJyb3JzIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMucnhfZmlmb19lcnJvcnMpfSwKKwl7InJ4X21pc3NlZF9lcnJvcnMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzKX0sCisJeyJ0eF9hYm9ydGVkX2Vycm9ycyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKX0sCisJeyJ0eF9jYXJyaWVyX2Vycm9ycyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKX0sCisJeyJ0eF9maWZvX2Vycm9ycyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzKX0sCisJeyJ0eF93aW5kb3dfZXJyb3JzIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMudHhfd2luZG93X2Vycm9ycyl9LAorCXsidHhfYWJvcnRfZXhjZV9jb2xsIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMuZXhjZWNvbCl9LAorCXsidHhfYWJvcnRfbGF0ZV9jb2xsIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMubGF0ZWNvbCl9LAorCXsidHhfZGVmZXJyZWRfb2siLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5kZWZmZXIpfSwKKwl7InR4X3NpbmdsZV9jb2xsX29rIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMuc2NjKX0sCisJeyJ0eF9tdWx0aV9jb2xsX29rIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMubWNjKX0sCisJeyJ0eF91bmRlcnVuIiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMudHhfdW5kZXJ1bil9LAorCXsidHhfdHJ1bmMiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy50eF90cnVuYyl9LAorCXsidHhfcGF1c2UiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy50eF9wYXVzZSl9LAorCXsicnhfcGF1c2UiLCBBVEwxX1NUQVQoc29mdF9zdGF0cy5yeF9wYXVzZSl9LAorCXsicnhfcnJkX292IiwgQVRMMV9TVEFUKHNvZnRfc3RhdHMucnhfcnJkX292KX0sCisJeyJyeF90cnVuYyIsIEFUTDFfU1RBVChzb2Z0X3N0YXRzLnJ4X3RydW5jKX0KK307CisKK3N0YXRpYyB2b2lkIGF0bDFfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgaTsKKwljaGFyICpwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXRsMV9nc3RyaW5nc19zdGF0cyk7IGkrKykgeworCQlwID0gKGNoYXIgKilhZGFwdGVyK2F0bDFfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7CisJCWRhdGFbaV0gPSAoYXRsMV9nc3RyaW5nc19zdGF0c1tpXS5zaXplb2Zfc3RhdCA9PQorCQkJc2l6ZW9mKHU2NCkpID8gKih1NjQgKilwIDogKih1MzIgKilwOworCX0KKworfQorCitzdGF0aWMgaW50IGF0bDFfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEFSUkFZX1NJWkUoYXRsMV9nc3RyaW5nc19zdGF0cyk7Cit9CisKK3N0YXRpYyBpbnQgYXRsMV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJZWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkgICBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCQkgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJICAgU1VQUE9SVEVEX0F1dG9uZWcgfCBTVVBQT1JURURfVFApOworCWVjbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF9UUDsKKwlpZiAoaHctPm1lZGlhX3R5cGUgPT0gTUVESUFfVFlQRV9BVVRPX1NFTlNPUiB8fAorCSAgICBody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFXzEwMDBNX0ZVTEwpIHsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCQlpZiAoaHctPm1lZGlhX3R5cGUgPT0gTUVESUFfVFlQRV9BVVRPX1NFTlNPUikgeworCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0KKwkJCSAgICAoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfAorCQkJICAgICBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCQkgICAgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQkgICAgIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCQkgICAgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOworCQl9CisJCWVsc2UKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IChBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKTsKKwl9CisJZWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJZWNtZC0+cGh5X2FkZHJlc3MgPSAwOworCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKworCWlmIChuZXRpZl9jYXJyaWVyX29rKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJdTE2IGxpbmtfc3BlZWQsIGxpbmtfZHVwbGV4OworCQlhdGwxX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmbGlua19zcGVlZCwgJmxpbmtfZHVwbGV4KTsKKwkJZWNtZC0+c3BlZWQgPSBsaW5rX3NwZWVkOworCQlpZiAobGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVgpCisJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJfSBlbHNlIHsKKwkJZWNtZC0+c3BlZWQgPSAtMTsKKwkJZWNtZC0+ZHVwbGV4ID0gLTE7CisJfQorCWlmIChody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFX0FVVE9fU0VOU09SIHx8CisJICAgIGh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfMTAwME1fRlVMTCkKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCWVsc2UKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bDFfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MTYgcGh5X2RhdGE7CisJaW50IHJldF92YWwgPSAwOworCXUxNiBvbGRfbWVkaWFfdHlwZSA9IGh3LT5tZWRpYV90eXBlOworCisJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV0aHRvb2wgc2h1dHRpbmcgZG93biBhZGFwdGVyXG4iLAorCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCWF0bDFfZG93bihhZGFwdGVyKTsKKwl9CisKKwlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKKwkJaHctPm1lZGlhX3R5cGUgPSBNRURJQV9UWVBFX0FVVE9fU0VOU09SOworCWVsc2UgeworCQlpZiAoZWNtZC0+c3BlZWQgPT0gU1BFRURfMTAwMCkgeworCQkJaWYgKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIiVzOiBjYW4ndCBmb3JjZSB0byAxMDAwTSBoYWxmIGR1cGxleFxuIiwKKwkJCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCQkJcmV0X3ZhbCA9IC1FSU5WQUw7CisJCQkJZ290byBleGl0X3NzZXQ7CisJCQl9CisJCQlody0+bWVkaWFfdHlwZSA9IE1FRElBX1RZUEVfMTAwME1fRlVMTDsKKwkJfSBlbHNlIGlmIChlY21kLT5zcGVlZCA9PSBTUEVFRF8xMDApIHsKKwkJCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKKwkJCQlody0+bWVkaWFfdHlwZSA9IE1FRElBX1RZUEVfMTAwTV9GVUxMOworCQkJfSBlbHNlCisJCQkJaHctPm1lZGlhX3R5cGUgPSBNRURJQV9UWVBFXzEwME1fSEFMRjsKKwkJfSBlbHNlIHsKKwkJCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQkJaHctPm1lZGlhX3R5cGUgPSBNRURJQV9UWVBFXzEwTV9GVUxMOworCQkJZWxzZQorCQkJCWh3LT5tZWRpYV90eXBlID0gTUVESUFfVFlQRV8xME1fSEFMRjsKKwkJfQorCX0KKwlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7CisJY2FzZSBNRURJQV9UWVBFX0FVVE9fU0VOU09SOgorCQllY21kLT5hZHZlcnRpc2luZyA9CisJCSAgICBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CisJCSAgICBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCSAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfAorCQkgICAgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKKwkJICAgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkgICAgQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9UUDsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwMDBNX0ZVTEw6CisJCWVjbWQtPmFkdmVydGlzaW5nID0KKwkJICAgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkgICAgQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9UUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSAwOworCQlicmVhazsKKwl9CisJaWYgKGF0bDFfcGh5X3NldHVwX2F1dG9uZWdfYWR2KGh3KSkgeworCQlyZXRfdmFsID0gLUVJTlZBTDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIiVzOiBpbnZhbGlkIGV0aHRvb2wgc3BlZWQvZHVwbGV4IHNldHRpbmdcbiIsCisJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJZ290byBleGl0X3NzZXQ7CisJfQorCWlmIChody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFX0FVVE9fU0VOU09SIHx8CisJICAgIGh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfMTAwME1fRlVMTCkKKwkJcGh5X2RhdGEgPSBNSUlfQ1JfUkVTRVQgfCBNSUlfQ1JfQVVUT19ORUdfRU47CisJZWxzZSB7CisJCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwkJY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKKwkJCXBoeV9kYXRhID0KKwkJCSAgICBNSUlfQ1JfRlVMTF9EVVBMRVggfCBNSUlfQ1JfU1BFRURfMTAwIHwKKwkJCSAgICBNSUlfQ1JfUkVTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKKwkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwMCB8IE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6CisJCQlwaHlfZGF0YSA9CisJCQkgICAgTUlJX0NSX0ZVTExfRFVQTEVYIHwgTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIE1FRElBX1RZUEVfMTBNX0hBTEY6ICovCisJCQlwaHlfZGF0YSA9IE1JSV9DUl9TUEVFRF8xMCB8IE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQl9CisJfQorCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIHBoeV9kYXRhKTsKK2V4aXRfc3NldDoKKwlpZiAocmV0X3ZhbCkKKwkJaHctPm1lZGlhX3R5cGUgPSBvbGRfbWVkaWFfdHlwZTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBldGh0b29sIHN0YXJ0aW5nIGFkYXB0ZXJcbiIsCisJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJYXRsMV91cChhZGFwdGVyKTsKKwl9IGVsc2UgaWYgKCFyZXRfdmFsKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXRodG9vbCByZXNldHRpbmcgYWRhcHRlclxuIiwKKwkJCWF0bDFfZHJpdmVyX25hbWUpOworCQlhdGwxX3Jlc2V0KGFkYXB0ZXIpOworCX0KKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIHZvaWQgYXRsMV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgYXRsMV9kcml2ZXJfbmFtZSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgYXRsMV9kcml2ZXJfdmVyc2lvbiwKKwkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJOL0EiLCBzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbikpOworCXN0cm5jcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pKTsKKwlkcnZpbmZvLT5lZWR1bXBfbGVuID0gQVRMMV9FRURVTVBfTEVOOworfQorCitzdGF0aWMgdm9pZCBhdGwxX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfVUNBU1QgfCBXQUtFX01DQVNUIHwgV0FLRV9CQ0FTVCB8IFdBS0VfTUFHSUM7CisJd29sLT53b2xvcHRzID0gMDsKKwlpZiAoYWRhcHRlci0+d29sICYgQVRMMV9XVUZDX0VYKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9VQ0FTVDsKKwlpZiAoYWRhcHRlci0+d29sICYgQVRMMV9XVUZDX01DKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQ0FTVDsKKwlpZiAoYWRhcHRlci0+d29sICYgQVRMMV9XVUZDX0JDKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9CQ0FTVDsKKwlpZiAoYWRhcHRlci0+d29sICYgQVRMMV9XVUZDX01BRykKKwkJd29sLT53b2xvcHRzIHw9IFdBS0VfTUFHSUM7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGF0bDFfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKHdvbC0+d29sb3B0cyAmIChXQUtFX1BIWSB8IFdBS0VfQVJQIHwgV0FLRV9NQUdJQ1NFQ1VSRSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlhZGFwdGVyLT53b2wgPSAwOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1VDQVNUKQorCQlhZGFwdGVyLT53b2wgfD0gQVRMMV9XVUZDX0VYOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01DQVNUKQorCQlhZGFwdGVyLT53b2wgfD0gQVRMMV9XVUZDX01DOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX0JDQVNUKQorCQlhZGFwdGVyLT53b2wgfD0gQVRMMV9XVUZDX0JDOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKQorCQlhZGFwdGVyLT53b2wgfD0gQVRMMV9XVUZDX01BRzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRsMV9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0eGRyID0gJmFkYXB0ZXItPnRwZF9yaW5nOworCXN0cnVjdCBhdGwxX3JmZF9yaW5nICpyeGRyID0gJmFkYXB0ZXItPnJmZF9yaW5nOworCisJcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBBVEwxX01BWF9SRkQ7CisJcmluZy0+dHhfbWF4X3BlbmRpbmcgPSBBVEwxX01BWF9UUEQ7CisJcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7CisJcmluZy0+cnhfanVtYm9fbWF4X3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X3BlbmRpbmcgPSByeGRyLT5jb3VudDsKKwlyaW5nLT50eF9wZW5kaW5nID0gdHhkci0+Y291bnQ7CisJcmluZy0+cnhfbWluaV9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9qdW1ib19wZW5kaW5nID0gMDsKK30KKworc3RhdGljIGludCBhdGwxX3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZHIgPSAmYWRhcHRlci0+dHBkX3Jpbmc7CisJc3RydWN0IGF0bDFfcnJkX3JpbmcgKnJyZHIgPSAmYWRhcHRlci0+cnJkX3Jpbmc7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZHIgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisKKwlzdHJ1Y3QgYXRsMV90cGRfcmluZyB0cGRfb2xkLCB0cGRfbmV3OworCXN0cnVjdCBhdGwxX3JmZF9yaW5nIHJmZF9vbGQsIHJmZF9uZXc7CisJc3RydWN0IGF0bDFfcnJkX3JpbmcgcnJkX29sZCwgcnJkX25ldzsKKwlzdHJ1Y3QgYXRsMV9yaW5nX2hlYWRlciByaGRyX29sZCwgcmhkcl9uZXc7CisJaW50IGVycjsKKworCXRwZF9vbGQgPSBhZGFwdGVyLT50cGRfcmluZzsKKwlyZmRfb2xkID0gYWRhcHRlci0+cmZkX3Jpbmc7CisJcnJkX29sZCA9IGFkYXB0ZXItPnJyZF9yaW5nOworCXJoZHJfb2xkID0gYWRhcHRlci0+cmluZ19oZWFkZXI7CisKKwlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKQorCQlhdGwxX2Rvd24oYWRhcHRlcik7CisKKwlyZmRyLT5jb3VudCA9ICh1MTYpIG1heChyaW5nLT5yeF9wZW5kaW5nLCAodTMyKSBBVEwxX01JTl9SRkQpOworCXJmZHItPmNvdW50ID0gcmZkci0+Y291bnQgPiBBVEwxX01BWF9SRkQgPyBBVEwxX01BWF9SRkQgOgorCQkJcmZkci0+Y291bnQ7CisJcmZkci0+Y291bnQgPSAocmZkci0+Y291bnQgKyAzKSAmIH4zOworCXJyZHItPmNvdW50ID0gcmZkci0+Y291bnQ7CisKKwl0cGRyLT5jb3VudCA9ICh1MTYpIG1heChyaW5nLT50eF9wZW5kaW5nLCAodTMyKSBBVEwxX01JTl9UUEQpOworCXRwZHItPmNvdW50ID0gdHBkci0+Y291bnQgPiBBVEwxX01BWF9UUEQgPyBBVEwxX01BWF9UUEQgOgorCQkJdHBkci0+Y291bnQ7CisJdHBkci0+Y291bnQgPSAodHBkci0+Y291bnQgKyAzKSAmIH4zOworCisJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQkvKiB0cnkgdG8gZ2V0IG5ldyByZXNvdXJjZXMgYmVmb3JlIGRlbGV0aW5nIG9sZCAqLworCQllcnIgPSBhdGwxX3NldHVwX3JpbmdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfc2V0dXBfcmluZzsKKworCQkvKgorCQkgKiBzYXZlIHRoZSBuZXcsIHJlc3RvcmUgdGhlIG9sZCBpbiBvcmRlciB0byBmcmVlIGl0LAorCQkgKiB0aGVuIHJlc3RvcmUgdGhlIG5ldyBiYWNrIGFnYWluCisJCSAqLworCisJCXJmZF9uZXcgPSBhZGFwdGVyLT5yZmRfcmluZzsKKwkJcnJkX25ldyA9IGFkYXB0ZXItPnJyZF9yaW5nOworCQl0cGRfbmV3ID0gYWRhcHRlci0+dHBkX3Jpbmc7CisJCXJoZHJfbmV3ID0gYWRhcHRlci0+cmluZ19oZWFkZXI7CisJCWFkYXB0ZXItPnJmZF9yaW5nID0gcmZkX29sZDsKKwkJYWRhcHRlci0+cnJkX3JpbmcgPSBycmRfb2xkOworCQlhZGFwdGVyLT50cGRfcmluZyA9IHRwZF9vbGQ7CisJCWFkYXB0ZXItPnJpbmdfaGVhZGVyID0gcmhkcl9vbGQ7CisJCWF0bDFfZnJlZV9yaW5nX3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJYWRhcHRlci0+cmZkX3JpbmcgPSByZmRfbmV3OworCQlhZGFwdGVyLT5ycmRfcmluZyA9IHJyZF9uZXc7CisJCWFkYXB0ZXItPnRwZF9yaW5nID0gdHBkX25ldzsKKwkJYWRhcHRlci0+cmluZ19oZWFkZXIgPSByaGRyX25ldzsKKworCQllcnIgPSBhdGwxX3VwKGFkYXB0ZXIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7CisKK2Vycl9zZXR1cF9yaW5nOgorCWFkYXB0ZXItPnJmZF9yaW5nID0gcmZkX29sZDsKKwlhZGFwdGVyLT5ycmRfcmluZyA9IHJyZF9vbGQ7CisJYWRhcHRlci0+dHBkX3JpbmcgPSB0cGRfb2xkOworCWFkYXB0ZXItPnJpbmdfaGVhZGVyID0gcmhkcl9vbGQ7CisJYXRsMV91cChhZGFwdGVyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBhdGwxX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlpZiAoaHctPm1lZGlhX3R5cGUgPT0gTUVESUFfVFlQRV9BVVRPX1NFTlNPUiB8fAorCSAgICBody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFXzEwMDBNX0ZVTEwpIHsKKwkJZXBhdXNlLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJfSBlbHNlIHsKKwkJZXBhdXNlLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCX0KKwllcGF1c2UtPnJ4X3BhdXNlID0gMTsKKwllcGF1c2UtPnR4X3BhdXNlID0gMTsKK30KKworc3RhdGljIGludCBhdGwxX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlpZiAoaHctPm1lZGlhX3R5cGUgPT0gTUVESUFfVFlQRV9BVVRPX1NFTlNPUiB8fAorCSAgICBody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFXzEwMDBNX0ZVTEwpIHsKKwkJZXBhdXNlLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJfSBlbHNlIHsKKwkJZXBhdXNlLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCX0KKworCWVwYXVzZS0+cnhfcGF1c2UgPSAxOworCWVwYXVzZS0+dHhfcGF1c2UgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYXRsMV9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBhdGwxX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBzdHJpbmdzZXQsCisJCQkJdTggKmRhdGEpCit7CisJdTggKnAgPSBkYXRhOworCWludCBpOworCisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXRsMV9nc3RyaW5nc19zdGF0cyk7IGkrKykgeworCQkJbWVtY3B5KHAsIGF0bDFfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9zdHJpbmcsCisJCQkJRVRIX0dTVFJJTkdfTEVOKTsKKwkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBhdGwxX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCXUxNiBwaHlfZGF0YTsKKwkJYXRsMV9kb3duKGFkYXB0ZXIpOworCisJCWlmIChody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFX0FVVE9fU0VOU09SIHx8CisJCQlody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFXzEwMDBNX0ZVTEwpIHsKKwkJCXBoeV9kYXRhID0gTUlJX0NSX1JFU0VUIHwgTUlJX0NSX0FVVE9fTkVHX0VOOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChody0+bWVkaWFfdHlwZSkgeworCQkJY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKKwkJCQlwaHlfZGF0YSA9IE1JSV9DUl9GVUxMX0RVUExFWCB8CisJCQkJCU1JSV9DUl9TUEVFRF8xMDAgfCBNSUlfQ1JfUkVTRVQ7CisJCQkJYnJlYWs7CisJCQljYXNlIE1FRElBX1RZUEVfMTAwTV9IQUxGOgorCQkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwMCB8IE1JSV9DUl9SRVNFVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgTUVESUFfVFlQRV8xME1fRlVMTDoKKwkJCQlwaHlfZGF0YSA9IE1JSV9DUl9GVUxMX0RVUExFWCB8CisJCQkJCU1JSV9DUl9TUEVFRF8xMCB8IE1JSV9DUl9SRVNFVDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6ICAvKiBNRURJQV9UWVBFXzEwTV9IQUxGICovCisJCQkJcGh5X2RhdGEgPSBNSUlfQ1JfU1BFRURfMTAgfCBNSUlfQ1JfUkVTRVQ7CisJCQl9CisJCX0KKwkJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQk1DUiwgcGh5X2RhdGEpOworCQlhdGwxX3VwKGFkYXB0ZXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGF0bDFfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBhdGwxX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IGF0bDFfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSBhdGwxX2dldF9kcnZpbmZvLAorCS5nZXRfd29sCQk9IGF0bDFfZ2V0X3dvbCwKKwkuc2V0X3dvbAkJPSBhdGwxX3NldF93b2wsCisJLmdldF9yaW5ncGFyYW0JCT0gYXRsMV9nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtCQk9IGF0bDFfc2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3BhdXNlcGFyYW0JCT0gYXRsMV9nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0gCT0gYXRsMV9zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3J4X2NzdW0JCT0gYXRsMV9nZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9zZXRfdHhfaHdfY3N1bSwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3N0cmluZ3MJCT0gYXRsMV9nZXRfc3RyaW5ncywKKwkubndheV9yZXNldAkJPSBhdGwxX253YXlfcmVzZXQsCisJLmdldF9ldGh0b29sX3N0YXRzCT0gYXRsMV9nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3N0YXRzX2NvdW50CT0gYXRsMV9nZXRfc3RhdHNfY291bnQsCisJLmdldF90c28JCT0gZXRodG9vbF9vcF9nZXRfdHNvLAorCS5zZXRfdHNvCQk9IGV0aHRvb2xfb3Bfc2V0X3RzbywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfaHcuYyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9ody5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YjJkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfaHcuYwpAQCAtMCwwICsxLDcxOCBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAwNiBBdHRhbnNpYyBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDA2IENocmlzIFNub29rIDxjc25vb2tAcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodChjKSAyMDA2IEpheSBDbGlidXJuIDxqY2xpYnVybkBnbWFpbC5jb20+CisgKiAKKyAqIERlcml2ZWQgZnJvbSBJbnRlbCBlMTAwMCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSAiYXRsMS5oIgorCisvKgorICogUmVzZXQgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHVuaXRzOyBtYXNrIGFuZCBjbGVhciBhbGwgaW50ZXJydXB0cy4KKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiByZXR1cm4gOiBBVEwxX1NVQ0NFU1MgIG9yICBpZGxlIHN0YXR1cyAoaWYgZXJyb3IpCisgKi8KK3MzMiBhdGwxX3Jlc2V0X2h3KHN0cnVjdCBhdGwxX2h3ICpodykKK3sKKwl1MzIgaWNyOworCWludCBpOworCisJLyogCisJICogQ2xlYXIgSW50ZXJydXB0IG1hc2sgdG8gc3RvcCBib2FyZCBmcm9tIGdlbmVyYXRpbmcKKwkgKiBpbnRlcnJ1cHRzICYgQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IGV2ZW50cyAKKwkgKi8KKwkvKgorCSAqIGlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19JTVIpOworCSAqIGlvd3JpdGUzMigweGZmZmZmZmZmLCBody0+aHdfYWRkciArIFJFR19JU1IpOworCSAqLworCisJLyoKKwkgKiBJc3N1ZSBTb2Z0IFJlc2V0IHRvIHRoZSBNQUMuICBUaGlzIHdpbGwgcmVzZXQgdGhlIGNoaXAncworCSAqIHRyYW5zbWl0LCByZWNlaXZlLCBETUEuICBJdCB3aWxsIG5vdCBlZmZlY3QKKwkgKiB0aGUgY3VycmVudCBQQ0kgY29uZmlndXJhdGlvbi4gIFRoZSBnbG9iYWwgcmVzZXQgYml0IGlzIHNlbGYtCisJICogY2xlYXJpbmcsIGFuZCBzaG91bGQgY2xlYXIgd2l0aGluIGEgbWljcm9zZWNvbmQuCisJICovCisJaW93cml0ZTMyKE1BU1RFUl9DVFJMX1NPRlRfUlNULCBody0+aHdfYWRkciArIFJFR19NQVNURVJfQ1RSTCk7CisJaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTUFTVEVSX0NUUkwpOworCisJaW93cml0ZTE2KDEsIGh3LT5od19hZGRyICsgUkVHX0dQSFlfRU5BQkxFKTsKKwlpb3JlYWQxNihody0+aHdfYWRkciArIFJFR19HUEhZX0VOQUJMRSk7CisKKwltc2xlZXAoMSk7CQkvKiBkZWxheSBhYm91dCAxbXMgKi8KKworCS8qIFdhaXQgYXQgbGVhc3QgMTBtcyBmb3IgQWxsIG1vZHVsZSB0byBiZSBJZGxlICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJaWNyID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfSURMRV9TVEFUVVMpOworCQlpZiAoIWljcikKKwkJCWJyZWFrOworCQltc2xlZXAoMSk7CS8qIGRlbGF5IDEgbXMgKi8KKwkJY3B1X3JlbGF4KCk7CS8qIEZJWE1FOiBpcyB0aGlzIHN0aWxsIHRoZSByaWdodCB3YXkgdG8gZG8gdGhpcz8gKi8KKwl9CisKKwlpZiAoaWNyKSB7CisJCXByaW50ayAoS0VSTl9ERUJVRyAiaWNyID0gJXhcbiIsIGljcik7IAorCQlyZXR1cm4gaWNyOworCX0KKworCXJldHVybiBBVEwxX1NVQ0NFU1M7Cit9CisKKy8qIGZ1bmN0aW9uIGFib3V0IEVFUFJPTQorICoKKyAqIGNoZWNrX2VlcHJvbV9leGlzdAorICogcmV0dXJuIDAgaWYgZWVwcm9tIGV4aXN0CisgKi8KK3N0YXRpYyBpbnQgYXRsMV9jaGVja19lZXByb21fZXhpc3Qoc3RydWN0IGF0bDFfaHcgKmh3KQoreworCXUzMiB2YWx1ZTsKKwl2YWx1ZSA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX1NQSV9GTEFTSF9DVFJMKTsKKwlpZiAodmFsdWUgJiBTUElfRkxBU0hfQ1RSTF9FTl9WUEQpIHsKKwkJdmFsdWUgJj0gflNQSV9GTEFTSF9DVFJMX0VOX1ZQRDsKKwkJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19TUElfRkxBU0hfQ1RSTCk7CisJfQorCisJdmFsdWUgPSBpb3JlYWQxNihody0+aHdfYWRkciArIFJFR19QQ0lFX0NBUF9MSVNUKTsKKwlyZXR1cm4gKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHg2QzAwKSA/IDAgOiAxOworfQorCitzdGF0aWMgYm9vbCBhdGwxX3JlYWRfZWVwcm9tKHN0cnVjdCBhdGwxX2h3ICpodywgdTMyIG9mZnNldCwgdTMyICpwX3ZhbHVlKQoreworCWludCBpOworCXUzMiBjb250cm9sOworCisJaWYgKG9mZnNldCAmIDMpCisJCXJldHVybiBmYWxzZTsJLyogYWRkcmVzcyBkbyBub3QgYWxpZ24gKi8KKworCWlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19WUERfREFUQSk7CisJY29udHJvbCA9IChvZmZzZXQgJiBWUERfQ0FQX1ZQRF9BRERSX01BU0spIDw8IFZQRF9DQVBfVlBEX0FERFJfU0hJRlQ7CisJaW93cml0ZTMyKGNvbnRyb2wsIGh3LT5od19hZGRyICsgUkVHX1ZQRF9DQVApOworCWlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX1ZQRF9DQVApOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJbXNsZWVwKDIpOworCQljb250cm9sID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfVlBEX0NBUCk7CisJCWlmIChjb250cm9sICYgVlBEX0NBUF9WUERfRkxBRykKKwkJCWJyZWFrOworCX0KKwlpZiAoY29udHJvbCAmIFZQRF9DQVBfVlBEX0ZMQUcpIHsKKwkJKnBfdmFsdWUgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19WUERfREFUQSk7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7CQkvKiB0aW1lb3V0ICovCit9CisKKy8qCisgKiBSZWFkcyB0aGUgdmFsdWUgZnJvbSBhIFBIWSByZWdpc3RlcgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHJlZ19hZGRyIC0gYWRkcmVzcyBvZiB0aGUgUEhZIHJlZ2lzdGVyIHRvIHJlYWQKKyAqLworczMyIGF0bDFfcmVhZF9waHlfcmVnKHN0cnVjdCBhdGwxX2h3ICpodywgdTE2IHJlZ19hZGRyLCB1MTYgKnBoeV9kYXRhKQoreworCXUzMiB2YWw7CisJaW50IGk7CisKKwl2YWwgPSAoKHUzMikgKHJlZ19hZGRyICYgTURJT19SRUdfQUREUl9NQVNLKSkgPDwgTURJT19SRUdfQUREUl9TSElGVCB8CisJICAgIAlNRElPX1NUQVJUIHwgTURJT19TVVBfUFJFQU1CTEUgfCBNRElPX1JXIHwgTURJT19DTEtfMjVfNCA8PAorIAkJTURJT19DTEtfU0VMX1NISUZUOworCWlvd3JpdGUzMih2YWwsIGh3LT5od19hZGRyICsgUkVHX01ESU9fQ1RSTCk7CisJaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTURJT19DVFJMKTsKKworCWZvciAoaSA9IDA7IGkgPCBNRElPX1dBSVRfVElNRVM7IGkrKykgeworCQl1ZGVsYXkoMik7CisJCXZhbCA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX01ESU9fQ1RSTCk7CisJCWlmICghKHZhbCAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSkpCisJCQlicmVhazsKKwl9CisJaWYgKCEodmFsICYgKE1ESU9fU1RBUlQgfCBNRElPX0JVU1kpKSkgeworCQkqcGh5X2RhdGEgPSAodTE2KSB2YWw7CisJCXJldHVybiBBVEwxX1NVQ0NFU1M7CisJfQorCXJldHVybiBBVEwxX0VSUl9QSFk7Cit9CisKKyNkZWZpbmUgQ1VTVE9NX1NQSV9DU19TRVRVUAkyCisjZGVmaW5lIENVU1RPTV9TUElfQ0xLX0hJCTIKKyNkZWZpbmUgQ1VTVE9NX1NQSV9DTEtfTE8JMgorI2RlZmluZSBDVVNUT01fU1BJX0NTX0hPTEQJMgorI2RlZmluZSBDVVNUT01fU1BJX0NTX0hJCTMKKworc3RhdGljIGJvb2wgYXRsMV9zcGlfcmVhZChzdHJ1Y3QgYXRsMV9odyAqaHcsIHUzMiBhZGRyLCB1MzIgKmJ1ZikKK3sKKwlpbnQgaTsKKwl1MzIgdmFsdWU7CisKKwlpb3dyaXRlMzIoMCwgaHctPmh3X2FkZHIgKyBSRUdfU1BJX0RBVEEpOworCWlvd3JpdGUzMihhZGRyLCBody0+aHdfYWRkciArIFJFR19TUElfQUREUik7CisKKwl2YWx1ZSA9IFNQSV9GTEFTSF9DVFJMX1dBSVRfUkVBRFkgfAorCSAgICAoQ1VTVE9NX1NQSV9DU19TRVRVUCAmIFNQSV9GTEFTSF9DVFJMX0NTX1NFVFVQX01BU0spIDw8CisJICAgIFNQSV9GTEFTSF9DVFJMX0NTX1NFVFVQX1NISUZUIHwgKENVU1RPTV9TUElfQ0xLX0hJICYKKwkJCQkJICAgICBTUElfRkxBU0hfQ1RSTF9DTEtfSElfTUFTSykgPDwKKwkgICAgU1BJX0ZMQVNIX0NUUkxfQ0xLX0hJX1NISUZUIHwgKENVU1RPTV9TUElfQ0xLX0xPICYKKwkJCQkJICAgU1BJX0ZMQVNIX0NUUkxfQ0xLX0xPX01BU0spIDw8CisJICAgIFNQSV9GTEFTSF9DVFJMX0NMS19MT19TSElGVCB8IChDVVNUT01fU1BJX0NTX0hPTEQgJgorCQkJCQkgICBTUElfRkxBU0hfQ1RSTF9DU19IT0xEX01BU0spIDw8CisJICAgIFNQSV9GTEFTSF9DVFJMX0NTX0hPTERfU0hJRlQgfCAoQ1VTVE9NX1NQSV9DU19ISSAmCisJCQkJCSAgICBTUElfRkxBU0hfQ1RSTF9DU19ISV9NQVNLKSA8PAorCSAgICBTUElfRkxBU0hfQ1RSTF9DU19ISV9TSElGVCB8ICgxICYgU1BJX0ZMQVNIX0NUUkxfSU5TX01BU0spIDw8CisJICAgIFNQSV9GTEFTSF9DVFJMX0lOU19TSElGVDsKKworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfU1BJX0ZMQVNIX0NUUkwpOworCisJdmFsdWUgfD0gU1BJX0ZMQVNIX0NUUkxfU1RBUlQ7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19TUElfRkxBU0hfQ1RSTCk7CisJaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfU1BJX0ZMQVNIX0NUUkwpOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJbXNsZWVwKDEpOwkvKiAxbXMgKi8KKwkJdmFsdWUgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19TUElfRkxBU0hfQ1RSTCk7CisJCWlmICghKHZhbHVlICYgU1BJX0ZMQVNIX0NUUkxfU1RBUlQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHZhbHVlICYgU1BJX0ZMQVNIX0NUUkxfU1RBUlQpCisJCXJldHVybiBmYWxzZTsKKworCSpidWYgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19TUElfREFUQSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIGdldF9wZXJtYW5lbnRfYWRkcmVzcworICogcmV0dXJuIDAgaWYgZ2V0IHZhbGlkIG1hYyBhZGRyZXNzLCAKKyAqLworc3RhdGljIGludCBhdGwxX2dldF9wZXJtYW5lbnRfYWRkcmVzcyhzdHJ1Y3QgYXRsMV9odyAqaHcpCit7CisJdTMyIGFkZHJbMl07CisJdTMyIGksIGNvbnRyb2w7CisJdTE2IHJlZzsKKwl1OCBldGhfYWRkcltFVEhfQUxFTl07CisJYm9vbCBrZXlfdmFsaWQ7CisKKwlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihody0+cGVybV9tYWNfYWRkcikpCisJCXJldHVybiAwOworCisJLyogaW5pdCAqLworCWFkZHJbMF0gPSBhZGRyWzFdID0gMDsKKworCWlmICghYXRsMV9jaGVja19lZXByb21fZXhpc3QoaHcpKSB7CS8qIGVlcHJvbSBleGlzdCAqLworCQlyZWcgPSAwOworCQlrZXlfdmFsaWQgPSBmYWxzZTsKKwkJLyogUmVhZCBvdXQgYWxsIEVFUFJPTSBjb250ZW50ICovCisJCWkgPSAwOworCQl3aGlsZSAoMSkgeworCQkJaWYgKGF0bDFfcmVhZF9lZXByb20oaHcsIGkgKyAweDEwMCwgJmNvbnRyb2wpKSB7CisJCQkJaWYgKGtleV92YWxpZCkgeworCQkJCQlpZiAocmVnID09IFJFR19NQUNfU1RBX0FERFIpCisJCQkJCQlhZGRyWzBdID0gY29udHJvbDsKKwkJCQkJZWxzZSBpZiAocmVnID09IChSRUdfTUFDX1NUQV9BRERSICsgNCkpCisJCQkJCQlhZGRyWzFdID0gY29udHJvbDsKKwkJCQkJa2V5X3ZhbGlkID0gZmFsc2U7CisJCQkJfSBlbHNlIGlmICgoY29udHJvbCAmIDB4ZmYpID09IDB4NUEpIHsKKwkJCQkJa2V5X3ZhbGlkID0gdHJ1ZTsKKwkJCQkJcmVnID0gKHUxNikgKGNvbnRyb2wgPj4gMTYpOworCQkJCX0gZWxzZQorCQkJCQlicmVhazsJLyogYXNzdW1lIGRhdGEgZW5kIHdoaWxlIGVuY291bnQgYW4gaW52YWxpZCBLRVlXT1JEICovCisJCQl9IGVsc2UKKwkJCQlicmVhazsJLyogcmVhZCBlcnJvciAqLworCQkJaSArPSA0OworCQl9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIDIgbGluZXMgYXJlIHRoZSBBdHRhbnNpYyBvcmlnaW5hbHMuICBTYXZpbmcgZm9yIHBvc3Rlcml0eS4KKyAqCQkqKHUzMiAqKSAmIGV0aF9hZGRyWzJdID0gTE9OR1NXQVAoYWRkclswXSk7CisgKgkJKih1MTYgKikgJiBldGhfYWRkclswXSA9IFNIT1JUU1dBUCgqKHUxNiAqKSAmIGFkZHJbMV0pOworICovCisJCSoodTMyICopICYgZXRoX2FkZHJbMl0gPSBzd2FiMzIoYWRkclswXSk7CisJCSoodTE2ICopICYgZXRoX2FkZHJbMF0gPSBzd2FiMTYoKih1MTYgKikgJiBhZGRyWzFdKTsKKworCQlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihldGhfYWRkcikpIHsKKwkJCW1lbWNweShody0+cGVybV9tYWNfYWRkciwgZXRoX2FkZHIsIEVUSF9BTEVOKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAxOworCX0KKworCS8qIHNlZSBpZiBTUEkgRkxBR1MgZXhpc3QgPyAqLworCWFkZHJbMF0gPSBhZGRyWzFdID0gMDsKKwlyZWcgPSAwOworCWtleV92YWxpZCA9IGZhbHNlOworCWkgPSAwOworCXdoaWxlICgxKSB7CisJCWlmIChhdGwxX3NwaV9yZWFkKGh3LCBpICsgMHgxZjAwMCwgJmNvbnRyb2wpKSB7CisJCQlpZiAoa2V5X3ZhbGlkKSB7CisJCQkJaWYgKHJlZyA9PSBSRUdfTUFDX1NUQV9BRERSKQorCQkJCQlhZGRyWzBdID0gY29udHJvbDsKKwkJCQllbHNlIGlmIChyZWcgPT0gKFJFR19NQUNfU1RBX0FERFIgKyA0KSkKKwkJCQkJYWRkclsxXSA9IGNvbnRyb2w7CisJCQkJa2V5X3ZhbGlkID0gZmFsc2U7CisJCQl9IGVsc2UgaWYgKChjb250cm9sICYgMHhmZikgPT0gMHg1QSkgeworCQkJCWtleV92YWxpZCA9IHRydWU7CisJCQkJcmVnID0gKHUxNikgKGNvbnRyb2wgPj4gMTYpOworCQkJfSBlbHNlCisJCQkJYnJlYWs7CS8qIGRhdGEgZW5kICovCisJCX0gZWxzZQorCQkJYnJlYWs7CS8qIHJlYWQgZXJyb3IgKi8KKwkJaSArPSA0OworCX0KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgMiBsaW5lcyBhcmUgdGhlIEF0dGFuc2ljIG9yaWdpbmFscy4gIFNhdmluZyBmb3IgcG9zdGVyaXR5LgorICoJKih1MzIgKikgJiBldGhfYWRkclsyXSA9IExPTkdTV0FQKGFkZHJbMF0pOworICoJKih1MTYgKikgJiBldGhfYWRkclswXSA9IFNIT1JUU1dBUCgqKHUxNiAqKSAmIGFkZHJbMV0pOworICovCisJKih1MzIgKikgJiBldGhfYWRkclsyXSA9IHN3YWIzMihhZGRyWzBdKTsKKwkqKHUxNiAqKSAmIGV0aF9hZGRyWzBdID0gc3dhYjE2KCoodTE2ICopICYgYWRkclsxXSk7CisJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoZXRoX2FkZHIpKSB7CisJCW1lbWNweShody0+cGVybV9tYWNfYWRkciwgZXRoX2FkZHIsIEVUSF9BTEVOKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKgorICogUmVhZHMgdGhlIGFkYXB0ZXIncyBNQUMgYWRkcmVzcyBmcm9tIHRoZSBFRVBST00gCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICovCitzMzIgYXRsMV9yZWFkX21hY19hZGRyKHN0cnVjdCBhdGwxX2h3ICpodykKK3sKKwl1MTYgaTsKKworCWlmIChhdGwxX2dldF9wZXJtYW5lbnRfYWRkcmVzcyhodykpCisJCXJhbmRvbV9ldGhlcl9hZGRyKGh3LT5wZXJtX21hY19hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlody0+bWFjX2FkZHJbaV0gPSBody0+cGVybV9tYWNfYWRkcltpXTsKKwlyZXR1cm4gQVRMMV9TVUNDRVNTOworfQorCisvKgorICogSGFzaGVzIGFuIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIGl0cyBsb2NhdGlvbiBpbiB0aGUgbXVsdGljYXN0IHRhYmxlCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogbWNfYWRkciAtIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyB0byBoYXNoCisgKgorICogYXRsMV9oYXNoX21jX2FkZHIKKyAqICBwdXJwb3NlCisgKiAgICAgIHNldCBoYXNoIHZhbHVlIGZvciBhIG11bHRpY2FzdCBhZGRyZXNzCisgKiAgICAgIGhhc2ggY2FsY3UgcHJvY2Vzc2luZyA6CisgKiAgICAgICAgICAxLiBjYWxjdSAzMmJpdCBDUkMgZm9yIG11bHRpY2FzdCBhZGRyZXNzCisgKiAgICAgICAgICAyLiByZXZlcnNlIGNyYyB3aXRoIE1TQiB0byBMU0IKKyAqLwordTMyIGF0bDFfaGFzaF9tY19hZGRyKHN0cnVjdCBhdGwxX2h3ICpodywgdTggKm1jX2FkZHIpCit7CisJdTMyIGNyYzMyLCB2YWx1ZSA9IDA7CisJaW50IGk7CisKKwljcmMzMiA9IGV0aGVyX2NyY19sZSg2LCBtY19hZGRyKTsKKwljcmMzMiA9IH5jcmMzMjsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJdmFsdWUgfD0gKCgoY3JjMzIgPj4gaSkgJiAxKSA8PCAoMzEgLSBpKSk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBTZXRzIHRoZSBiaXQgaW4gdGhlIG11bHRpY2FzdCB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYXNoIHZhbHVlLgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGhhc2hfdmFsdWUgLSBNdWx0aWNhc3QgYWRkcmVzcyBoYXNoIHZhbHVlCisgKi8KK3ZvaWQgYXRsMV9oYXNoX3NldChzdHJ1Y3QgYXRsMV9odyAqaHcsIHUzMiBoYXNoX3ZhbHVlKQoreworCXUzMiBoYXNoX2JpdCwgaGFzaF9yZWc7CisJdTMyIG10YTsKKworCS8qCisJICogVGhlIEhBU0ggVGFibGUgIGlzIGEgcmVnaXN0ZXIgYXJyYXkgb2YgMiAzMi1iaXQgcmVnaXN0ZXJzLgorCSAqIEl0IGlzIHRyZWF0ZWQgbGlrZSBhbiBhcnJheSBvZiA2NCBiaXRzLiAgV2Ugd2FudCB0byBzZXQKKwkgKiBiaXQgQml0QXJyYXlbaGFzaF92YWx1ZV0uIFNvIHdlIGZpZ3VyZSBvdXQgd2hhdCByZWdpc3RlcgorCSAqIHRoZSBiaXQgaXMgaW4sIHJlYWQgaXQsIE9SIGluIHRoZSBuZXcgYml0LCB0aGVuIHdyaXRlCisJICogYmFjayB0aGUgbmV3IHZhbHVlLiAgVGhlIHJlZ2lzdGVyIGlzIGRldGVybWluZWQgYnkgdGhlCisJICogdXBwZXIgNyBiaXRzIG9mIHRoZSBoYXNoIHZhbHVlIGFuZCB0aGUgYml0IHdpdGhpbiB0aGF0CisJICogcmVnaXN0ZXIgYXJlIGRldGVybWluZWQgYnkgdGhlIGxvd2VyIDUgYml0cyBvZiB0aGUgdmFsdWUuCisJICovCisJaGFzaF9yZWcgPSAoaGFzaF92YWx1ZSA+PiAzMSkgJiAweDE7CisJaGFzaF9iaXQgPSAoaGFzaF92YWx1ZSA+PiAyNikgJiAweDFGOworCW10YSA9IGlvcmVhZDMyKChodyArIFJFR19SWF9IQVNIX1RBQkxFKSArIChoYXNoX3JlZyA8PCAyKSk7CisJbXRhIHw9ICgxIDw8IGhhc2hfYml0KTsKKwlpb3dyaXRlMzIobXRhLCAoaHctPmh3X2FkZHIgKyBSRUdfUlhfSEFTSF9UQUJMRSkgKyAoaGFzaF9yZWcgPDwgMikpOworfQorCisvKgorICogV3JpdGVzIGEgdmFsdWUgdG8gYSBQSFkgcmVnaXN0ZXIKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiByZWdfYWRkciAtIGFkZHJlc3Mgb2YgdGhlIFBIWSByZWdpc3RlciB0byB3cml0ZQorICogZGF0YSAtIGRhdGEgdG8gd3JpdGUgdG8gdGhlIFBIWQorICovCitzMzIgYXRsMV93cml0ZV9waHlfcmVnKHN0cnVjdCBhdGwxX2h3ICpodywgdTMyIHJlZ19hZGRyLCB1MTYgcGh5X2RhdGEpCit7CisJaW50IGk7CisJdTMyIHZhbDsKKworCXZhbCA9ICgodTMyKSAocGh5X2RhdGEgJiBNRElPX0RBVEFfTUFTSykpIDw8IE1ESU9fREFUQV9TSElGVCB8CisJICAgIChyZWdfYWRkciAmIE1ESU9fUkVHX0FERFJfTUFTSykgPDwgTURJT19SRUdfQUREUl9TSElGVCB8CisJICAgIE1ESU9fU1VQX1BSRUFNQkxFIHwKKwkgICAgTURJT19TVEFSVCB8IE1ESU9fQ0xLXzI1XzQgPDwgTURJT19DTEtfU0VMX1NISUZUOworCWlvd3JpdGUzMih2YWwsIGh3LT5od19hZGRyICsgUkVHX01ESU9fQ1RSTCk7CisJaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTURJT19DVFJMKTsKKworCWZvciAoaSA9IDA7IGkgPCBNRElPX1dBSVRfVElNRVM7IGkrKykgeworCQl1ZGVsYXkoMik7CisJCXZhbCA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX01ESU9fQ1RSTCk7CisJCWlmICghKHZhbCAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoISh2YWwgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpKQorCQlyZXR1cm4gQVRMMV9TVUNDRVNTOworCisJcmV0dXJuIEFUTDFfRVJSX1BIWTsKK30KKworLyoKKyAqIE1ha2UgTDAwMSdzIFBIWSBvdXQgb2YgUG93ZXIgU2F2aW5nIFN0YXRlIChidWcpCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogd2hlbiBwb3dlciBvbiwgTDAwMSdzIFBIWSBhbHdheXMgb24gUG93ZXIgc2F2aW5nIFN0YXRlCisgKiAoR2lnYWJpdCBMaW5rIGZvcmJpZGRlbikKKyAqLworc3RhdGljIHMzMiBhdGwxX3BoeV9sZWF2ZV9wb3dlcl9zYXZpbmcoc3RydWN0IGF0bDFfaHcgKmh3KQoreworCXMzMiByZXQ7CisJcmV0ID0gYXRsMV93cml0ZV9waHlfcmVnKGh3LCAyOSwgMHgwMDI5KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIDMwLCAwKTsKK30KKworLyoKKyAqVE9ETzogZG8gc29tZXRoaW5nIG9yIGdldCByaWQgb2YgdGhpcworICovCitzMzIgYXRsMV9waHlfZW50ZXJfcG93ZXJfc2F2aW5nKHN0cnVjdCBhdGwxX2h3ICpodykKK3sKKy8qICAgIHMzMiByZXRfdmFsOworICogICAgdTE2IHBoeV9kYXRhOworICovCisKKy8qCisgICAgcmV0X3ZhbCA9IGF0bDFfd3JpdGVfcGh5X3JlZyhodywgLi4uKTsKKyAgICByZXRfdmFsID0gYXRsMV93cml0ZV9waHlfcmVnKGh3LCAuLi4pOworICAgIC4uLi4KKyovCisJcmV0dXJuIEFUTDFfU1VDQ0VTUzsKK30KKworLyoKKyAqIFJlc2V0cyB0aGUgUEhZIGFuZCBtYWtlIGFsbCBjb25maWcgdmFsaWRhdGUKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogU2V0cyBiaXQgMTUgYW5kIDEyIG9mIHRoZSBNSUkgQ29udHJvbCByZWdpc2VyIChmb3IgRjAwMSBidWcpCisgKi8KK3N0YXRpYyBzMzIgYXRsMV9waHlfcmVzZXQoc3RydWN0IGF0bDFfaHcgKmh3KQoreworCXMzMiByZXRfdmFsOworCXUxNiBwaHlfZGF0YTsKKworCWlmIChody0+bWVkaWFfdHlwZSA9PSBNRURJQV9UWVBFX0FVVE9fU0VOU09SIHx8CisJICAgIGh3LT5tZWRpYV90eXBlID09IE1FRElBX1RZUEVfMTAwME1fRlVMTCkKKwkJcGh5X2RhdGEgPSBNSUlfQ1JfUkVTRVQgfCBNSUlfQ1JfQVVUT19ORUdfRU47CisJZWxzZSB7CisJCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwkJY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKKwkJCXBoeV9kYXRhID0KKwkJCSAgICBNSUlfQ1JfRlVMTF9EVVBMRVggfCBNSUlfQ1JfU1BFRURfMTAwIHwKKwkJCSAgICBNSUlfQ1JfUkVTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKKwkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwMCB8IE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6CisJCQlwaHlfZGF0YSA9CisJCQkgICAgTUlJX0NSX0ZVTExfRFVQTEVYIHwgTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIE1FRElBX1RZUEVfMTBNX0hBTEY6ICovCisJCQlwaHlfZGF0YSA9IE1JSV9DUl9TUEVFRF8xMCB8IE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0X3ZhbCA9IGF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIHBoeV9kYXRhKTsKKwlpZiAocmV0X3ZhbCkgeworCQl1MzIgdmFsOworCQlpbnQgaTsKKwkJLyogcGNpZSBzZXJkZXMgbGluayBtYXkgYmUgZG93biEgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBhdXRvbmVnIGNhdXNlZCBwY2llIHBoeSBsaW5rIGRvd25cbiIsIAorCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IDI1OyBpKyspIHsKKwkJCW1zbGVlcCgxKTsKKwkJCXZhbCA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX01ESU9fQ1RSTCk7CisJCQlpZiAoISh2YWwgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKCh2YWwgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkJIiVzOiBwY2llIGxpbmsgZG93biBhdCBsZWFzdCBmb3IgMjVtc1xuIiwgCisJCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJfQorCX0KKwlyZXR1cm4gQVRMMV9TVUNDRVNTOworfQorCisvKgorICogQ29uZmlndXJlcyBQSFkgYXV0b25lZyBhbmQgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnQgc2V0dGluZ3MKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKi8KK3MzMiBhdGwxX3BoeV9zZXR1cF9hdXRvbmVnX2FkdihzdHJ1Y3QgYXRsMV9odyAqaHcpCit7CisJczMyIHJldF92YWw7CisJczE2IG1paV9hdXRvbmVnX2Fkdl9yZWc7CisJczE2IG1paV8xMDAwdF9jdHJsX3JlZzsKKworCS8qIFJlYWQgdGhlIE1JSSBBdXRvLU5lZyBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyIChBZGRyZXNzIDQpLiAqLworCW1paV9hdXRvbmVnX2Fkdl9yZWcgPSBNSUlfQVJfREVGQVVMVF9DQVBfTUFTSzsKKworCS8qIFJlYWQgdGhlIE1JSSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKEFkZHJlc3MgOSkuICovCisJbWlpXzEwMDB0X2N0cmxfcmVnID0gTUlJX0FUMDAxX0NSXzEwMDBUX0RFRkFVTFRfQ0FQX01BU0s7CisKKwkvKgorCSAqIEZpcnN0IHdlIGNsZWFyIGFsbCB0aGUgMTAvMTAwIG1iIHNwZWVkIGJpdHMgaW4gdGhlIEF1dG8tTmVnCisJICogQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoQWRkcmVzcyA0KSBhbmQgdGhlIDEwMDAgbWIgc3BlZWQgYml0cyBpbgorCSAqIHRoZSAgMTAwMEJhc2UtVCBDb250cm9sIFJlZ2lzdGVyIChBZGRyZXNzIDkpLgorCSAqLworCW1paV9hdXRvbmVnX2Fkdl9yZWcgJj0gfk1JSV9BUl9TUEVFRF9NQVNLOworCW1paV8xMDAwdF9jdHJsX3JlZyAmPSB+TUlJX0FUMDAxX0NSXzEwMDBUX1NQRUVEX01BU0s7CisKKwkvKgorCSAqIE5lZWQgdG8gcGFyc2UgbWVkaWFfdHlwZSAgYW5kIHNldCB1cAorCSAqIHRoZSBhcHByb3ByaWF0ZSBQSFkgcmVnaXN0ZXJzLgorCSAqLworCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwljYXNlIE1FRElBX1RZUEVfQVVUT19TRU5TT1I6CisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE1JSV9BUl8xMFRfSERfQ0FQUyB8CisJCQkJCU1JSV9BUl8xMFRfRkRfQ0FQUyB8CisJCQkJCU1JSV9BUl8xMDBUWF9IRF9DQVBTIHwKKwkJCQkJTUlJX0FSXzEwMFRYX0ZEX0NBUFMpOworCQltaWlfMTAwMHRfY3RybF9yZWcgfD0gTUlJX0FUMDAxX0NSXzEwMDBUX0ZEX0NBUFM7CisJCWJyZWFrOworCisJY2FzZSBNRURJQV9UWVBFXzEwMDBNX0ZVTEw6CisJCW1paV8xMDAwdF9jdHJsX3JlZyB8PSBNSUlfQVQwMDFfQ1JfMTAwMFRfRkRfQ0FQUzsKKwkJYnJlYWs7CisKKwljYXNlIE1FRElBX1RZUEVfMTAwTV9GVUxMOgorCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE1JSV9BUl8xMDBUWF9GRF9DQVBTOworCQlicmVhazsKKworCWNhc2UgTUVESUFfVFlQRV8xMDBNX0hBTEY6CisJCW1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTUlJX0FSXzEwMFRYX0hEX0NBUFM7CisJCWJyZWFrOworCisJY2FzZSBNRURJQV9UWVBFXzEwTV9GVUxMOgorCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE1JSV9BUl8xMFRfRkRfQ0FQUzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQltaWlfYXV0b25lZ19hZHZfcmVnIHw9IE1JSV9BUl8xMFRfSERfQ0FQUzsKKwkJYnJlYWs7CisJfQorCisJLyogZmxvdyBjb250cm9sIGZpeGVkIHRvIGVuYWJsZSBhbGwgKi8KKwltaWlfYXV0b25lZ19hZHZfcmVnIHw9IChNSUlfQVJfQVNNX0RJUiB8IE1JSV9BUl9QQVVTRSk7CisKKwlody0+bWlpX2F1dG9uZWdfYWR2X3JlZyA9IG1paV9hdXRvbmVnX2Fkdl9yZWc7CisJaHctPm1paV8xMDAwdF9jdHJsX3JlZyA9IG1paV8xMDAwdF9jdHJsX3JlZzsKKworCXJldF92YWwgPSBhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9BRFZFUlRJU0UsIG1paV9hdXRvbmVnX2Fkdl9yZWcpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXJldF92YWwgPSBhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9BVDAwMV9DUiwgbWlpXzEwMDB0X2N0cmxfcmVnKTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlyZXR1cm4gQVRMMV9TVUNDRVNTOworfQorCisvKgorICogQ29uZmlndXJlcyBsaW5rIHNldHRpbmdzLgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIEFzc3VtZXMgdGhlIGhhcmR3YXJlIGhhcyBwcmV2aW91c2x5IGJlZW4gcmVzZXQgYW5kIHRoZQorICogdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyIGFyZSBub3QgZW5hYmxlZC4KKyAqLworc3RhdGljIHMzMiBhdGwxX3NldHVwX2xpbmsoc3RydWN0IGF0bDFfaHcgKmh3KQoreworCXMzMiByZXRfdmFsOworCisJLyoKKwkgKiBPcHRpb25zOgorCSAqICBQSFkgd2lsbCBhZHZlcnRpc2UgdmFsdWUocykgcGFyc2VkIGZyb20KKwkgKiAgYXV0b25lZ19hZHZlcnRpc2VkIGFuZCBmYworCSAqICBubyBtYXR0ZXIgd2hhdCBhdXRvbmVnIGlzICwgV2Ugd2lsbCBub3Qgd2FpdCBsaW5rIHJlc3VsdC4KKwkgKi8KKwlyZXRfdmFsID0gYXRsMV9waHlfc2V0dXBfYXV0b25lZ19hZHYoaHcpOworCWlmIChyZXRfdmFsKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXJyb3Igc2V0dGluZyB1cCBhdXRvbmVnb3RpYXRpb25cbiIsIAorCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCXJldHVybiByZXRfdmFsOworCX0KKwkvKiBTVy5SZXNldCAsIEVuLUF1dG8tTmVnIGlmIG5lZWRlZCAqLworCXJldF92YWwgPSBhdGwxX3BoeV9yZXNldChodyk7CisJaWYgKHJldF92YWwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlcnJvciByZXNldHRpbmcgdGhlIHBoeVxuIiwgCisJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCWh3LT5waHlfY29uZmlndXJlZCA9IHRydWU7CisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXRsMV9zcGlfZmxhc2hfZGV2IGZsYXNoX3RhYmxlW10gPSB7CisvKglNRlJfTkFNRSAgV1JTUiAgUkVBRCAgUFJHTSAgV1JFTiAgV1JESSAgUkRTUiAgUkRJRCAgU0VDVE9SX0VSQVNFIENISVBfRVJBU0UgKi8KKwl7IkF0bWVsIiwgMHgwMCwgMHgwMywgMHgwMiwgMHgwNiwgMHgwNCwgMHgwNSwgMHgxNSwgMHg1MiwgICAgICAgIDB4NjJ9LAorCXsiU1NUIiwgICAweDAxLCAweDAzLCAweDAyLCAweDA2LCAweDA0LCAweDA1LCAweDkwLCAweDIwLCAgICAgICAgMHg2MH0sCisJeyJTVCIsICAgIDB4MDEsIDB4MDMsIDB4MDIsIDB4MDYsIDB4MDQsIDB4MDUsIDB4QUIsIDB4RDgsICAgICAgICAweEM3fSwKK307CisKK3N0YXRpYyB2b2lkIGF0bDFfaW5pdF9mbGFzaF9vcGNvZGUoc3RydWN0IGF0bDFfaHcgKmh3KQoreworCWlmIChody0+Zmxhc2hfdmVuZG9yID49IHNpemVvZihmbGFzaF90YWJsZSkgLyBzaXplb2YoZmxhc2hfdGFibGVbMF0pKQorCQlody0+Zmxhc2hfdmVuZG9yID0gMDsJLyogQVRNRUwgKi8KKworCS8qIEluaXQgT1AgdGFibGUgKi8KKwlpb3dyaXRlOChmbGFzaF90YWJsZVtody0+Zmxhc2hfdmVuZG9yXS5jbWRfcHJvZ3JhbSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfU1BJX0ZMQVNIX09QX1BST0dSQU0pOworCWlvd3JpdGU4KGZsYXNoX3RhYmxlW2h3LT5mbGFzaF92ZW5kb3JdLmNtZF9zZWN0b3JfZXJhc2UsCisJCWh3LT5od19hZGRyICsgUkVHX1NQSV9GTEFTSF9PUF9TQ19FUkFTRSk7CisJaW93cml0ZTgoZmxhc2hfdGFibGVbaHctPmZsYXNoX3ZlbmRvcl0uY21kX2NoaXBfZXJhc2UsCisJCWh3LT5od19hZGRyICsgUkVHX1NQSV9GTEFTSF9PUF9DSElQX0VSQVNFKTsKKwlpb3dyaXRlOChmbGFzaF90YWJsZVtody0+Zmxhc2hfdmVuZG9yXS5jbWRfcmRpZCwKKwkJaHctPmh3X2FkZHIgKyBSRUdfU1BJX0ZMQVNIX09QX1JESUQpOworCWlvd3JpdGU4KGZsYXNoX3RhYmxlW2h3LT5mbGFzaF92ZW5kb3JdLmNtZF93cmVuLAorCQlody0+aHdfYWRkciArIFJFR19TUElfRkxBU0hfT1BfV1JFTik7CisJaW93cml0ZTgoZmxhc2hfdGFibGVbaHctPmZsYXNoX3ZlbmRvcl0uY21kX3Jkc3IsCisJCWh3LT5od19hZGRyICsgUkVHX1NQSV9GTEFTSF9PUF9SRFNSKTsKKwlpb3dyaXRlOChmbGFzaF90YWJsZVtody0+Zmxhc2hfdmVuZG9yXS5jbWRfd3JzciwKKwkJaHctPmh3X2FkZHIgKyBSRUdfU1BJX0ZMQVNIX09QX1dSU1IpOworCWlvd3JpdGU4KGZsYXNoX3RhYmxlW2h3LT5mbGFzaF92ZW5kb3JdLmNtZF9yZWFkLAorCQlody0+aHdfYWRkciArIFJFR19TUElfRkxBU0hfT1BfUkVBRCk7Cit9CisKKy8qCisgKiBQZXJmb3JtcyBiYXNpYyBjb25maWd1cmF0aW9uIG9mIHRoZSBhZGFwdGVyLgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIEFzc3VtZXMgdGhhdCB0aGUgY29udHJvbGxlciBoYXMgcHJldmlvdXNseSBiZWVuIHJlc2V0IGFuZCBpcyBpbiBhCisgKiBwb3N0LXJlc2V0IHVuaW5pdGlhbGl6ZWQgc3RhdGUuIEluaXRpYWxpemVzIG11bHRpY2FzdCB0YWJsZSwgCisgKiBhbmQgIENhbGxzIHJvdXRpbmVzIHRvIHNldHVwIGxpbmsKKyAqIExlYXZlcyB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHMgZGlzYWJsZWQgYW5kIHVuaW5pdGlhbGl6ZWQuCisgKi8KK3MzMiBhdGwxX2luaXRfaHcoc3RydWN0IGF0bDFfaHcgKmh3KQoreworCXUzMiByZXRfdmFsID0gMDsKKworCS8qIFplcm8gb3V0IHRoZSBNdWx0aWNhc3QgSEFTSCB0YWJsZSAqLworCWlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19SWF9IQVNIX1RBQkxFKTsKKwkvKiBjbGVhciB0aGUgb2xkIHNldHRpbmdzIGZyb20gdGhlIG11bHRpY2FzdCBoYXNoIHRhYmxlICovCisJaW93cml0ZTMyKDAsIChody0+aHdfYWRkciArIFJFR19SWF9IQVNIX1RBQkxFKSArICgxIDw8IDIpKTsKKworCWF0bDFfaW5pdF9mbGFzaF9vcGNvZGUoaHcpOworCisJaWYgKCFody0+cGh5X2NvbmZpZ3VyZWQpIHsKKwkJLyogZW5hYmxlIEdQSFkgTGlua0NoYW5nZSBJbnRlcnJydXB0ICovCisJCXJldF92YWwgPSBhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIDE4LCAweEMwMCk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCS8qIG1ha2UgUEhZIG91dCBvZiBwb3dlci1zYXZpbmcgc3RhdGUgKi8KKwkJcmV0X3ZhbCA9IGF0bDFfcGh5X2xlYXZlX3Bvd2VyX3NhdmluZyhodyk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCS8qIENhbGwgYSBzdWJyb3V0aW5lIHRvIGNvbmZpZ3VyZSB0aGUgbGluayAqLworCQlyZXRfdmFsID0gYXRsMV9zZXR1cF9saW5rKGh3KTsKKwl9CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qCisgKiBEZXRlY3RzIHRoZSBjdXJyZW50IHNwZWVkIGFuZCBkdXBsZXggc2V0dGluZ3Mgb2YgdGhlIGhhcmR3YXJlLgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHNwZWVkIC0gU3BlZWQgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIGR1cGxleCAtIER1cGxleCBzZXR0aW5nIG9mIHRoZSBjb25uZWN0aW9uCisgKi8KK3MzMiBhdGwxX2dldF9zcGVlZF9hbmRfZHVwbGV4KHN0cnVjdCBhdGwxX2h3ICpodywgdTE2ICpzcGVlZCwgdTE2ICpkdXBsZXgpCit7CisJczMyIHJldF92YWw7CisJdTE2IHBoeV9kYXRhOworCisJLyogOyAtLS0gUmVhZCAgIFBIWSBTcGVjaWZpYyBTdGF0dXMgUmVnaXN0ZXIgKDE3KSAqLworCXJldF92YWwgPSBhdGwxX3JlYWRfcGh5X3JlZyhodywgTUlJX0FUMDAxX1BTU1IsICZwaHlfZGF0YSk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCisJaWYgKCEocGh5X2RhdGEgJiBNSUlfQVQwMDFfUFNTUl9TUERfRFBMWF9SRVNPTFZFRCkpCisJCXJldHVybiBBVEwxX0VSUl9QSFlfUkVTOworCisJc3dpdGNoIChwaHlfZGF0YSAmIE1JSV9BVDAwMV9QU1NSX1NQRUVEKSB7CisJY2FzZSBNSUlfQVQwMDFfUFNTUl8xMDAwTUJTOgorCQkqc3BlZWQgPSBTUEVFRF8xMDAwOworCQlicmVhazsKKwljYXNlIE1JSV9BVDAwMV9QU1NSXzEwME1CUzoKKwkJKnNwZWVkID0gU1BFRURfMTAwOworCQlicmVhazsKKwljYXNlIE1JSV9BVDAwMV9QU1NSXzEwTUJTOgorCQkqc3BlZWQgPSBTUEVFRF8xMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlcnJvciBnZXR0aW5nIHNwZWVkXG4iLCAKKwkJCWF0bDFfZHJpdmVyX25hbWUpOworCQlyZXR1cm4gQVRMMV9FUlJfUEhZX1NQRUVEOworCQlicmVhazsKKwl9CisJaWYgKHBoeV9kYXRhICYgTUlJX0FUMDAxX1BTU1JfRFBMWCkKKwkJKmR1cGxleCA9IEZVTExfRFVQTEVYOworCWVsc2UKKwkJKmR1cGxleCA9IEhBTEZfRFVQTEVYOworCisJcmV0dXJuIEFUTDFfU1VDQ0VTUzsKK30KKwordm9pZCBhdGwxX3NldF9tYWNfYWRkcihzdHJ1Y3QgYXRsMV9odyAqaHcpCit7CisJdTMyIHZhbHVlOworCS8qCisJICogMDAtMEItNkEtRjYtMDAtREMKKwkgKiAwOiAgNkFGNjAwREMgICAxOiAwMDBCCisJICogbG93IGR3b3JkCisJICovCisJdmFsdWUgPSAoKCh1MzIpIGh3LT5tYWNfYWRkclsyXSkgPDwgMjQpIHwKKwkgICAgKCgodTMyKSBody0+bWFjX2FkZHJbM10pIDw8IDE2KSB8CisJICAgICgoKHUzMikgaHctPm1hY19hZGRyWzRdKSA8PCA4KSB8ICgoKHUzMikgaHctPm1hY19hZGRyWzVdKSk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19NQUNfU1RBX0FERFIpOworCS8qIGhpZ2ggZHdvcmQgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPm1hY19hZGRyWzBdKSA8PCA4KSB8ICgoKHUzMikgaHctPm1hY19hZGRyWzFdKSk7CisJaW93cml0ZTMyKHZhbHVlLCAoaHctPmh3X2FkZHIgKyBSRUdfTUFDX1NUQV9BRERSKSArICgxIDw8IDIpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9ody5oIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwYzA5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9ody5oCkBAIC0wLDAgKzEsOTUxIEBACisvKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDA2IEF0dGFuc2ljIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMDYgQ2hyaXMgU25vb2sgPGNzbm9va0ByZWRoYXQuY29tPgorICogQ29weXJpZ2h0KGMpIDIwMDYgSmF5IENsaWJ1cm4gPGpjbGlidXJuQGdtYWlsLmNvbT4KKyAqCisgKiBEZXJpdmVkIGZyb20gSW50ZWwgZTEwMDAgZHJpdmVyCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGhlcmUgYXJlIGEgbG90IG9mIGRlZmluZXMgaW4gaGVyZSB0aGF0IGFyZSB1bnVzZWQgYW5kL29yIGhhdmUgY3J5cHRpYworICogbmFtZXMuICBQbGVhc2UgbGVhdmUgdGhlbSBhbG9uZSwgYXMgdGhleSdyZSB0aGUgY2xvc2VzdCB0aGluZyB3ZSBoYXZlCisgKiB0byBhIHNwZWMgZnJvbSBBdHRhbnNpYyBhdCBwcmVzZW50LiAqYWhlbSogLS0gQ0hTCisgKi8KKworI2lmbmRlZiBfQVRMMV9IV19IXworI2RlZmluZSBfQVRMMV9IV19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKworc3RydWN0IGF0bDFfYWRhcHRlcjsKK3N0cnVjdCBhdGwxX2h3OworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzIG5lZWRlZCBieSBtdWx0aXBsZSBmaWxlcyAqLworczMyIGF0bDFfcGh5X3NldHVwX2F1dG9uZWdfYWR2KHN0cnVjdCBhdGwxX2h3ICpodyk7CitzMzIgYXRsMV93cml0ZV9waHlfcmVnKHN0cnVjdCBhdGwxX2h3ICpodywgdTMyIHJlZ19hZGRyLCB1MTYgcGh5X2RhdGEpOworczMyIGF0bDFfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGF0bDFfaHcgKmh3LCB1MTYgKnNwZWVkLCB1MTYgKmR1cGxleCk7CitzMzIgYXRsMV9yZWFkX21hY19hZGRyKHN0cnVjdCBhdGwxX2h3ICpodyk7CitzMzIgYXRsMV9pbml0X2h3KHN0cnVjdCBhdGwxX2h3ICpodyk7CitzMzIgYXRsMV9nZXRfc3BlZWRfYW5kX2R1cGxleChzdHJ1Y3QgYXRsMV9odyAqaHcsIHUxNiAqc3BlZWQsIHUxNiAqZHVwbGV4KTsKK3MzMiBhdGwxX3NldF9zcGVlZF9hbmRfZHVwbGV4KHN0cnVjdCBhdGwxX2h3ICpodywgdTE2IHNwZWVkLCB1MTYgZHVwbGV4KTsKK3UzMiBhdGwxX2hhc2hfbWNfYWRkcihzdHJ1Y3QgYXRsMV9odyAqaHcsIHU4ICptY19hZGRyKTsKK3ZvaWQgYXRsMV9oYXNoX3NldChzdHJ1Y3QgYXRsMV9odyAqaHcsIHUzMiBoYXNoX3ZhbHVlKTsKK3MzMiBhdGwxX3JlYWRfcGh5X3JlZyhzdHJ1Y3QgYXRsMV9odyAqaHcsIHUxNiByZWdfYWRkciwgdTE2ICpwaHlfZGF0YSk7Cit2b2lkIGF0bDFfc2V0X21hY19hZGRyKHN0cnVjdCBhdGwxX2h3ICpodyk7CitzMzIgYXRsMV9waHlfZW50ZXJfcG93ZXJfc2F2aW5nKHN0cnVjdCBhdGwxX2h3ICpodyk7CitzMzIgYXRsMV9yZXNldF9odyhzdHJ1Y3QgYXRsMV9odyAqaHcpOwordm9pZCBhdGwxX2NoZWNrX29wdGlvbnMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcik7CisKKy8qIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFJFR19QQ0lFX0NBUF9MSVNUCQkJMHg1OAorCisjZGVmaW5lIFJFR19WUERfQ0FQCQkJCTB4NkMKKyNkZWZpbmUgVlBEX0NBUF9JRF9NQVNLCQkJCTB4ZmYKKyNkZWZpbmUgVlBEX0NBUF9JRF9TSElGVAkJCTAKKyNkZWZpbmUgVlBEX0NBUF9ORVhUX1BUUl9NQVNLCQkJMHhGRgorI2RlZmluZSBWUERfQ0FQX05FWFRfUFRSX1NISUZUCQkJOAorI2RlZmluZSBWUERfQ0FQX1ZQRF9BRERSX01BU0sJCQkweDdGRkYKKyNkZWZpbmUgVlBEX0NBUF9WUERfQUREUl9TSElGVAkJCTE2CisjZGVmaW5lIFZQRF9DQVBfVlBEX0ZMQUcJCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgUkVHX1ZQRF9EQVRBCQkJCTB4NzAKKworI2RlZmluZSBSRUdfU1BJX0ZMQVNIX0NUUkwJCQkweDIwMAorI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9TVFNfTk9OX1JEWQkJMHgxCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX1NUU19XRU4JCQkweDIKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfU1RTX1dQRU4JCQkweDgwCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0RFVl9TVFNfTUFTSwkJMHhGRgorI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9ERVZfU1RTX1NISUZUCQkwCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0lOU19NQVNLCQkJMHg3CisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0lOU19TSElGVAkJOAorI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9TVEFSVAkJCTB4ODAwCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0VOX1ZQRAkJCTB4MjAwMAorI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9MRFNUQVJUCQkJMHg4MDAwCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0NTX0hJX01BU0sJCTB4MworI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9DU19ISV9TSElGVAkJMTYKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfQ1NfSE9MRF9NQVNLCQkweDMKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfQ1NfSE9MRF9TSElGVAkJMTgKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfQ0xLX0xPX01BU0sJCTB4MworI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9DTEtfTE9fU0hJRlQJCTIwCisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0NMS19ISV9NQVNLCQkweDMKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfQ0xLX0hJX1NISUZUCQkyMgorI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9DU19TRVRVUF9NQVNLCQkweDMKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfQ1NfU0VUVVBfU0hJRlQJCTI0CisjZGVmaW5lIFNQSV9GTEFTSF9DVFJMX0VST01fUEdTWl9NQVNLCQkweDMKKyNkZWZpbmUgU1BJX0ZMQVNIX0NUUkxfRVJPTV9QR1NaX1NISUZUCQkyNgorI2RlZmluZSBTUElfRkxBU0hfQ1RSTF9XQUlUX1JFQURZCQkweDEwMDAwMDAwCisKKyNkZWZpbmUgUkVHX1NQSV9BRERSCQkJCTB4MjA0CisKKyNkZWZpbmUgUkVHX1NQSV9EQVRBCQkJCTB4MjA4CisKKyNkZWZpbmUgUkVHX1NQSV9GTEFTSF9DT05GSUcJCQkweDIwQworI2RlZmluZSBTUElfRkxBU0hfQ09ORklHX0xEX0FERFJfTUFTSwkJMHhGRkZGRkYKKyNkZWZpbmUgU1BJX0ZMQVNIX0NPTkZJR19MRF9BRERSX1NISUZUCQkwCisjZGVmaW5lIFNQSV9GTEFTSF9DT05GSUdfVlBEX0FERFJfTUFTSwkJMHgzCisjZGVmaW5lIFNQSV9GTEFTSF9DT05GSUdfVlBEX0FERFJfU0hJRlQJCTI0CisjZGVmaW5lIFNQSV9GTEFTSF9DT05GSUdfTERfRVhJU1QJCTB4NDAwMDAwMAorCisjZGVmaW5lIFJFR19TUElfRkxBU0hfT1BfUFJPR1JBTQkJMHgyMTAKKyNkZWZpbmUgUkVHX1NQSV9GTEFTSF9PUF9TQ19FUkFTRQkJMHgyMTEKKyNkZWZpbmUgUkVHX1NQSV9GTEFTSF9PUF9DSElQX0VSQVNFCQkweDIxMgorI2RlZmluZSBSRUdfU1BJX0ZMQVNIX09QX1JESUQJCQkweDIxMworI2RlZmluZSBSRUdfU1BJX0ZMQVNIX09QX1dSRU4JCQkweDIxNAorI2RlZmluZSBSRUdfU1BJX0ZMQVNIX09QX1JEU1IJCQkweDIxNQorI2RlZmluZSBSRUdfU1BJX0ZMQVNIX09QX1dSU1IJCQkweDIxNgorI2RlZmluZSBSRUdfU1BJX0ZMQVNIX09QX1JFQUQJCQkweDIxNworCisjZGVmaW5lIFJFR19UV1NJX0NUUkwJCQkJMHgyMTgKKyNkZWZpbmUgVFdTSV9DVFJMX0xEX09GRlNFVF9NQVNLCQkweEZGCisjZGVmaW5lIFRXU0lfQ1RSTF9MRF9PRkZTRVRfU0hJRlQJCTAKKyNkZWZpbmUgVFdTSV9DVFJMX0xEX1NMVl9BRERSX01BU0sJCTB4NworI2RlZmluZSBUV1NJX0NUUkxfTERfU0xWX0FERFJfU0hJRlQJCTgKKyNkZWZpbmUgVFdTSV9DVFJMX1NXX0xEU1RBUlQJCQkweDgwMAorI2RlZmluZSBUV1NJX0NUUkxfSFdfTERTVEFSVAkJCTB4MTAwMAorI2RlZmluZSBUV1NJX0NUUkxfU01CX1NMVl9BRERSX01BU0sJCTB4N0YKKyNkZWZpbmUgVFdTSV9DVFJMX1NNQl9TTFZfQUREUl9TSElGVAkJMTUKKyNkZWZpbmUgVFdTSV9DVFJMX0xEX0VYSVNUCQkJMHg0MDAwMDAKKyNkZWZpbmUgVFdTSV9DVFJMX1JFQURfRlJFUV9TRUxfTUFTSwkJMHgzCisjZGVmaW5lIFRXU0lfQ1RSTF9SRUFEX0ZSRVFfU0VMX1NISUZUCQkyMworI2RlZmluZSBUV1NJX0NUUkxfRlJFUV9TRUxfMTAwSwkJCTAKKyNkZWZpbmUgVFdTSV9DVFJMX0ZSRVFfU0VMXzIwMEsJCQkxCisjZGVmaW5lIFRXU0lfQ1RSTF9GUkVRX1NFTF8zMDBLCQkJMgorI2RlZmluZSBUV1NJX0NUUkxfRlJFUV9TRUxfNDAwSwkJCTMKKyNkZWZpbmUgVFdTSV9DVFJMX1NNQl9TTFZfQUREUgorI2RlZmluZSBUV1NJX0NUUkxfV1JJVEVfRlJFUV9TRUxfTUFTSwkJMHgzCisjZGVmaW5lIFRXU0lfQ1RSTF9XUklURV9GUkVRX1NFTF9TSElGVAkJMjQKKworI2RlZmluZSBSRUdfUENJRV9ERVZfTUlTQ19DVFJMCQkJMHgyMUMKKyNkZWZpbmUgUENJRV9ERVZfTUlTQ19DVFJMX0VYVF9QSVBFCQkweDIKKyNkZWZpbmUgUENJRV9ERVZfTUlTQ19DVFJMX1JFVFJZX0JVRkRJUwkJMHgxCisjZGVmaW5lIFBDSUVfREVWX01JU0NfQ1RSTF9TUElST01fRVhJU1QJCTB4NAorI2RlZmluZSBQQ0lFX0RFVl9NSVNDX0NUUkxfU0VSREVTX0VORElBTgkweDgKKyNkZWZpbmUgUENJRV9ERVZfTUlTQ19DVFJMX1NFUkRFU19TRUxfRElOCTB4MTAKKworLyogU2VsZW5lIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19NQVNURVJfQ1RSTAkJCQkweDE0MDAKKyNkZWZpbmUgTUFTVEVSX0NUUkxfU09GVF9SU1QJCQkweDEKKyNkZWZpbmUgTUFTVEVSX0NUUkxfTVRJTUVSX0VOCQkJMHgyCisjZGVmaW5lIE1BU1RFUl9DVFJMX0lUSU1FUl9FTgkJCTB4NAorI2RlZmluZSBNQVNURVJfQ1RSTF9NQU5VQUxfSU5UCQkJMHg4CisjZGVmaW5lIE1BU1RFUl9DVFJMX1JFVl9OVU1fU0hJRlQJCTE2CisjZGVmaW5lIE1BU1RFUl9DVFJMX1JFVl9OVU1fTUFTSwkJMHhmZgorI2RlZmluZSBNQVNURVJfQ1RSTF9ERVZfSURfU0hJRlQJCTI0CisjZGVmaW5lIE1BU1RFUl9DVFJMX0RFVl9JRF9NQVNLCQkJMHhmZgorCisvKiBUaW1lciBJbml0aWFsIFZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19NQU5VQUxfVElNRVJfSU5JVAkJCTB4MTQwNAorCisvKiBJUlEgTW9kZXJhdG9yVGltZXIgSW5pdGlhbCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfSVJRX01PRFVfVElNRVJfSU5JVAkJCTB4MTQwOAorCisjZGVmaW5lIFJFR19HUEhZX0VOQUJMRQkJCQkweDE0MEMKKworLyogSVJRIEFudGktTG9zdCBUaW1lciBJbml0aWFsIFZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19DTUJESVNETUFfVElNRVIJCQkweDE0MEUKKworLyogQmxvY2sgSURMRSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0lETEVfU1RBVFVTCQkJCTB4MTQxMAorI2RlZmluZSBJRExFX1NUQVRVU19SWE1BQwkJCTEKKyNkZWZpbmUgSURMRV9TVEFUVVNfVFhNQUMJCQkyCisjZGVmaW5lIElETEVfU1RBVFVTX1JYUQkJCQk0CisjZGVmaW5lIElETEVfU1RBVFVTX1RYUQkJCQk4CisjZGVmaW5lIElETEVfU1RBVFVTX0RNQVIJCQkweDEwCisjZGVmaW5lIElETEVfU1RBVFVTX0RNQVcJCQkweDIwCisjZGVmaW5lIElETEVfU1RBVFVTX1NNQgkJCQkweDQwCisjZGVmaW5lIElETEVfU1RBVFVTX0NNQgkJCQkweDgwCisKKy8qIE1ESU8gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfTURJT19DVFJMCQkJCTB4MTQxNAorI2RlZmluZSBNRElPX0RBVEFfTUFTSwkJCQkweGZmZmYKKyNkZWZpbmUgTURJT19EQVRBX1NISUZUCQkJCTAKKyNkZWZpbmUgTURJT19SRUdfQUREUl9NQVNLCQkJMHgxZgorI2RlZmluZSBNRElPX1JFR19BRERSX1NISUZUCQkJMTYKKyNkZWZpbmUgTURJT19SVwkJCQkJMHgyMDAwMDAKKyNkZWZpbmUgTURJT19TVVBfUFJFQU1CTEUJCQkweDQwMDAwMAorI2RlZmluZSBNRElPX1NUQVJUCQkJCTB4ODAwMDAwCisjZGVmaW5lIE1ESU9fQ0xLX1NFTF9TSElGVAkJCTI0CisjZGVmaW5lIE1ESU9fQ0xLXzI1XzQJCQkJMAorI2RlZmluZSBNRElPX0NMS18yNV82CQkJCTIKKyNkZWZpbmUgTURJT19DTEtfMjVfOAkJCQkzCisjZGVmaW5lIE1ESU9fQ0xLXzI1XzEwCQkJCTQKKyNkZWZpbmUgTURJT19DTEtfMjVfMTQJCQkJNQorI2RlZmluZSBNRElPX0NMS18yNV8yMAkJCQk2CisjZGVmaW5lIE1ESU9fQ0xLXzI1XzI4CQkJCTcKKyNkZWZpbmUgTURJT19CVVNZCQkJCTB4ODAwMDAwMAorI2RlZmluZSBNRElPX1dBSVRfVElNRVMJCQkJMzAKKworLyogTUlJIFBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1BIWV9TVEFUVVMJCQkJMHgxNDE4CisKKy8qIEJJU1QgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyMCAoZm9yIHRoZSBQYWNrZXQgTWVtb3J5KSAqLworI2RlZmluZSBSRUdfQklTVDBfQ1RSTAkJCQkweDE0MWMKKyNkZWZpbmUgQklTVDBfTk9XCQkJCTB4MQorI2RlZmluZSBCSVNUMF9TUkFNX0ZBSUwJCQkJMHgyCisjZGVmaW5lIEJJU1QwX0ZVU0VfRkxBRwkJCQkweDQKKyNkZWZpbmUgUkVHX0JJU1QxX0NUUkwJCQkJMHgxNDIwCisjZGVmaW5lIEJJU1QxX05PVwkJCQkweDEKKyNkZWZpbmUgQklTVDFfU1JBTV9GQUlMCQkJCTB4MgorI2RlZmluZSBCSVNUMV9GVVNFX0ZMQUcJCQkJMHg0CisKKy8qIE1BQyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19NQUNfQ1RSTAkJCQkweDE0ODAKKyNkZWZpbmUgTUFDX0NUUkxfVFhfRU4JCQkJMQorI2RlZmluZSBNQUNfQ1RSTF9SWF9FTgkJCQkyCisjZGVmaW5lIE1BQ19DVFJMX1RYX0ZMT1cJCQk0CisjZGVmaW5lIE1BQ19DVFJMX1JYX0ZMT1cJCQk4CisjZGVmaW5lIE1BQ19DVFJMX0xPT1BCQUNLCQkJMHgxMAorI2RlZmluZSBNQUNfQ1RSTF9EVVBMWAkJCQkweDIwCisjZGVmaW5lIE1BQ19DVFJMX0FERF9DUkMJCQkweDQwCisjZGVmaW5lIE1BQ19DVFJMX1BBRAkJCQkweDgwCisjZGVmaW5lIE1BQ19DVFJMX0xFTkNISwkJCQkweDEwMAorI2RlZmluZSBNQUNfQ1RSTF9IVUdFX0VOCQkJMHgyMDAKKyNkZWZpbmUgTUFDX0NUUkxfUFJNTEVOX1NISUZUCQkJMTAKKyNkZWZpbmUgTUFDX0NUUkxfUFJNTEVOX01BU0sJCQkweGYKKyNkZWZpbmUgTUFDX0NUUkxfUk1WX1ZMQU4JCQkweDQwMDAKKyNkZWZpbmUgTUFDX0NUUkxfUFJPTUlTX0VOCQkJMHg4MDAwCisjZGVmaW5lIE1BQ19DVFJMX1RYX1BBVVNFCQkJMHgxMDAwMAorI2RlZmluZSBNQUNfQ1RSTF9TQ05UCQkJCTB4MjAwMDAKKyNkZWZpbmUgTUFDX0NUUkxfU1JTVF9UWAkJCTB4NDAwMDAKKyNkZWZpbmUgTUFDX0NUUkxfVFhfU0lNVVJTVAkJCTB4ODAwMDAKKyNkZWZpbmUgTUFDX0NUUkxfU1BFRURfU0hJRlQJCQkyMAorI2RlZmluZSBNQUNfQ1RSTF9TUEVFRF9NQVNLCQkJMHgzMDAwMDAKKyNkZWZpbmUgTUFDX0NUUkxfU1BFRURfMTAwMAkJCTIKKyNkZWZpbmUgTUFDX0NUUkxfU1BFRURfMTBfMTAwCQkJMQorI2RlZmluZSBNQUNfQ1RSTF9EQkdfVFhfQktQUkVTVVJFCQkweDQwMDAwMAorI2RlZmluZSBNQUNfQ1RSTF9UWF9IVUdFCQkJMHg4MDAwMDAKKyNkZWZpbmUgTUFDX0NUUkxfUlhfQ0hLU1VNX0VOCQkJMHgxMDAwMDAwCisjZGVmaW5lIE1BQ19DVFJMX01DX0FMTF9FTgkJCTB4MjAwMDAwMAorI2RlZmluZSBNQUNfQ1RSTF9CQ19FTgkJCQkweDQwMDAwMDAKKyNkZWZpbmUgTUFDX0NUUkxfREJHCQkJCTB4ODAwMDAwMAorCisvKiBNQUMgSVBHL0lGRyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19NQUNfSVBHX0lGRwkJCQkweDE0ODQKKyNkZWZpbmUgTUFDX0lQR19JRkdfSVBHVF9TSElGVAkJCTAKKyNkZWZpbmUgTUFDX0lQR19JRkdfSVBHVF9NQVNLCQkJMHg3ZgorI2RlZmluZSBNQUNfSVBHX0lGR19NSUZHX1NISUZUCQkJOAorI2RlZmluZSBNQUNfSVBHX0lGR19NSUZHX01BU0sJCQkweGZmCisjZGVmaW5lIE1BQ19JUEdfSUZHX0lQR1IxX1NISUZUCQkJMTYKKyNkZWZpbmUgTUFDX0lQR19JRkdfSVBHUjFfTUFTSwkJCTB4N2YKKyNkZWZpbmUgTUFDX0lQR19JRkdfSVBHUjJfU0hJRlQJCQkyNAorI2RlZmluZSBNQUNfSVBHX0lGR19JUEdSMl9NQVNLCQkJMHg3ZgorCisvKiBNQUMgU1RBVElPTiBBRERSRVNTICovCisjZGVmaW5lIFJFR19NQUNfU1RBX0FERFIJCQkweDE0ODgKKworLyogSGFzaCB0YWJsZSBmb3IgbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgUkVHX1JYX0hBU0hfVEFCTEUJCQkweDE0OTAKKworLyogTUFDIEhhbGYtRHVwbGV4IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX01BQ19IQUxGX0RVUExYX0NUUkwJCQkweDE0OTgKKyNkZWZpbmUgTUFDX0hBTEZfRFVQTFhfQ1RSTF9MQ09MX1NISUZUCQkwCisjZGVmaW5lIE1BQ19IQUxGX0RVUExYX0NUUkxfTENPTF9NQVNLCQkweDNmZgorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX1NISUZUCQkxMgorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX01BU0sJCTB4ZgorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX0VYQ19ERUZfRU4JCTB4MTAwMDAKKyNkZWZpbmUgTUFDX0hBTEZfRFVQTFhfQ1RSTF9OT19CQUNLX0MJCTB4MjAwMDAKKyNkZWZpbmUgTUFDX0hBTEZfRFVQTFhfQ1RSTF9OT19CQUNLX1AJCTB4NDAwMDAKKyNkZWZpbmUgTUFDX0hBTEZfRFVQTFhfQ1RSTF9BQkVCRQkJMHg4MDAwMAorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX0FCRUJUX1NISUZUCQkyMAorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX0FCRUJUX01BU0sJCTB4ZgorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19TSElGVAkyNAorI2RlZmluZSBNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19NQVNLCQkweGYKKworLyogTWF4aW11bSBGcmFtZSBMZW5ndGggQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfTVRVCQkJCQkweDE0OWMKKworLyogV2FrZS1Pbi1MYW4gY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBSRUdfV09MX0NUUkwJCQkJMHgxNGEwCisjZGVmaW5lIFdPTF9QQVRURVJOX0VOCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgV09MX1BBVFRFUk5fUE1FX0VOCQkJMHgwMDAwMDAwMgorI2RlZmluZSBXT0xfTUFHSUNfRU4JCQkJMHgwMDAwMDAwNAorI2RlZmluZSBXT0xfTUFHSUNfUE1FX0VOCQkJMHgwMDAwMDAwOAorI2RlZmluZSBXT0xfTElOS19DSEdfRU4JCQkJMHgwMDAwMDAxMAorI2RlZmluZSBXT0xfTElOS19DSEdfUE1FX0VOCQkJMHgwMDAwMDAyMAorI2RlZmluZSBXT0xfUEFUVEVSTl9TVAkJCQkweDAwMDAwMTAwCisjZGVmaW5lIFdPTF9NQUdJQ19TVAkJCQkweDAwMDAwMjAwCisjZGVmaW5lIFdPTF9MSU5LQ0hHX1NUCQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgV09MX0NMS19TV0lUQ0hfRU4JCQkweDAwMDA4MDAwCisjZGVmaW5lIFdPTF9QVDBfRU4JCQkJMHgwMDAxMDAwMAorI2RlZmluZSBXT0xfUFQxX0VOCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgV09MX1BUMl9FTgkJCQkweDAwMDQwMDAwCisjZGVmaW5lIFdPTF9QVDNfRU4JCQkJMHgwMDA4MDAwMAorI2RlZmluZSBXT0xfUFQ0X0VOCQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgV09MX1BUNV9FTgkJCQkweDAwMjAwMDAwCisjZGVmaW5lIFdPTF9QVDZfRU4JCQkJMHgwMDQwMDAwMAorCisvKiBXT0wgTGVuZ3RoICggMiBEV09SRCApICovCisjZGVmaW5lIFJFR19XT0xfUEFUVEVSTl9MRU4JCQkweDE0YTQKKyNkZWZpbmUgV09MX1BUX0xFTl9NQVNLCQkJCTB4N2YKKyNkZWZpbmUgV09MX1BUMF9MRU5fU0hJRlQJCQkwCisjZGVmaW5lIFdPTF9QVDFfTEVOX1NISUZUCQkJOAorI2RlZmluZSBXT0xfUFQyX0xFTl9TSElGVAkJCTE2CisjZGVmaW5lIFdPTF9QVDNfTEVOX1NISUZUCQkJMjQKKyNkZWZpbmUgV09MX1BUNF9MRU5fU0hJRlQJCQkwCisjZGVmaW5lIFdPTF9QVDVfTEVOX1NISUZUCQkJOAorI2RlZmluZSBXT0xfUFQ2X0xFTl9TSElGVAkJCTE2CisKKy8qIEludGVybmFsIFNSQU0gUGFydGl0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19TUkFNX1JGRF9BRERSCQkJMHgxNTAwCisjZGVmaW5lIFJFR19TUkFNX1JGRF9MRU4JCQkoUkVHX1NSQU1fUkZEX0FERFIrIDQpCisjZGVmaW5lIFJFR19TUkFNX1JSRF9BRERSCQkJKFJFR19TUkFNX1JGRF9BRERSKyA4KQorI2RlZmluZSBSRUdfU1JBTV9SUkRfTEVOCQkJKFJFR19TUkFNX1JGRF9BRERSKzEyKQorI2RlZmluZSBSRUdfU1JBTV9UUERfQUREUgkJCShSRUdfU1JBTV9SRkRfQUREUisxNikKKyNkZWZpbmUgUkVHX1NSQU1fVFBEX0xFTgkJCShSRUdfU1JBTV9SRkRfQUREUisyMCkKKyNkZWZpbmUgUkVHX1NSQU1fVFJEX0FERFIJCQkoUkVHX1NSQU1fUkZEX0FERFIrMjQpCisjZGVmaW5lIFJFR19TUkFNX1RSRF9MRU4JCQkoUkVHX1NSQU1fUkZEX0FERFIrMjgpCisjZGVmaW5lIFJFR19TUkFNX1JYRl9BRERSCQkJKFJFR19TUkFNX1JGRF9BRERSKzMyKQorI2RlZmluZSBSRUdfU1JBTV9SWEZfTEVOCQkJKFJFR19TUkFNX1JGRF9BRERSKzM2KQorI2RlZmluZSBSRUdfU1JBTV9UWEZfQUREUgkJCShSRUdfU1JBTV9SRkRfQUREUis0MCkKKyNkZWZpbmUgUkVHX1NSQU1fVFhGX0xFTgkJCShSRUdfU1JBTV9SRkRfQUREUis0NCkKKyNkZWZpbmUgUkVHX1NSQU1fVENQSF9QQVRIX0FERFIJCQkoUkVHX1NSQU1fUkZEX0FERFIrNDgpCisjZGVmaW5lIFNSQU1fVENQSF9BRERSX01BU0sJCQkweDBmZmYKKyNkZWZpbmUgU1JBTV9UQ1BIX0FERFJfU0hJRlQJCQkwCisjZGVmaW5lIFNSQU1fUEFUSF9BRERSX01BU0sJCQkweDBmZmYKKyNkZWZpbmUgU1JBTV9QQVRIX0FERFJfU0hJRlQJCQkxNgorCisvKiBMb2FkIFB0ciBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfTE9BRF9QVFIJCQkJKFJFR19TUkFNX1JGRF9BRERSKzUyKQorCisvKiBEZXNjcmlwdG9yIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0RFU0NfQkFTRV9BRERSX0hJCQkJMHgxNTQwCisjZGVmaW5lIFJFR19ERVNDX1JGRF9BRERSX0xPCQkJKFJFR19ERVNDX0JBU0VfQUREUl9ISSs0KQorI2RlZmluZSBSRUdfREVTQ19SUkRfQUREUl9MTwkJCShSRUdfREVTQ19CQVNFX0FERFJfSEkrOCkKKyNkZWZpbmUgUkVHX0RFU0NfVFBEX0FERFJfTE8JCQkoUkVHX0RFU0NfQkFTRV9BRERSX0hJKzEyKQorI2RlZmluZSBSRUdfREVTQ19DTUJfQUREUl9MTwkJCShSRUdfREVTQ19CQVNFX0FERFJfSEkrMTYpCisjZGVmaW5lIFJFR19ERVNDX1NNQl9BRERSX0xPCQkJKFJFR19ERVNDX0JBU0VfQUREUl9ISSsyMCkKKyNkZWZpbmUgUkVHX0RFU0NfUkZEX1JSRF9SSU5HX1NJWkUJCShSRUdfREVTQ19CQVNFX0FERFJfSEkrMjQpCisjZGVmaW5lIERFU0NfUkZEX1JJTkdfU0laRV9NQVNLCQkJMHg3ZmYKKyNkZWZpbmUgREVTQ19SRkRfUklOR19TSVpFX1NISUZUCQkwCisjZGVmaW5lIERFU0NfUlJEX1JJTkdfU0laRV9NQVNLCQkJMHg3ZmYKKyNkZWZpbmUgREVTQ19SUkRfUklOR19TSVpFX1NISUZUCQkxNgorI2RlZmluZSBSRUdfREVTQ19UUERfUklOR19TSVpFCQkJKFJFR19ERVNDX0JBU0VfQUREUl9ISSsyOCkKKyNkZWZpbmUgREVTQ19UUERfUklOR19TSVpFX01BU0sJCQkweDNmZgorI2RlZmluZSBERVNDX1RQRF9SSU5HX1NJWkVfU0hJRlQJCTAKKworLyogVFhRIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1RYUV9DVFJMCQkJCTB4MTU4MAorI2RlZmluZSBUWFFfQ1RSTF9UUERfQlVSU1RfTlVNX1NISUZUCQkwCisjZGVmaW5lIFRYUV9DVFJMX1RQRF9CVVJTVF9OVU1fTUFTSwkJMHgxZgorI2RlZmluZSBUWFFfQ1RSTF9FTgkJCQkweDIwCisjZGVmaW5lIFRYUV9DVFJMX0VOSF9NT0RFCQkJMHg0MAorI2RlZmluZSBUWFFfQ1RSTF9UUERfRkVUQ0hfVEhfU0hJRlQJCTgKKyNkZWZpbmUgVFhRX0NUUkxfVFBEX0ZFVENIX1RIX01BU0sJCTB4M2YKKyNkZWZpbmUgVFhRX0NUUkxfVFhGX0JVUlNUX05VTV9TSElGVAkJMTYKKyNkZWZpbmUgVFhRX0NUUkxfVFhGX0JVUlNUX05VTV9NQVNLCQkweGZmZmYKKworLyogSnVtYm8gcGFja2V0IFRocmVzaG9sZCBmb3IgdGFzayBvZmZsb2FkICovCisjZGVmaW5lIFJFR19UWF9KVU1CT19UQVNLX1RIX1RQRF9JUEcJCTB4MTU4NAorI2RlZmluZSBUWF9KVU1CT19UQVNLX1RIX01BU0sJCQkweDdmZgorI2RlZmluZSBUWF9KVU1CT19UQVNLX1RIX1NISUZUCQkJMAorI2RlZmluZSBUWF9UUERfTUlOX0lQR19NQVNLCQkJMHgxZgorI2RlZmluZSBUWF9UUERfTUlOX0lQR19TSElGVAkJCTE2CisKKy8qIFJYUSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19SWFFfQ1RSTAkJCQkweDE1YTAKKyNkZWZpbmUgUlhRX0NUUkxfUkZEX0JVUlNUX05VTV9TSElGVAkJMAorI2RlZmluZSBSWFFfQ1RSTF9SRkRfQlVSU1RfTlVNX01BU0sJCTB4ZmYKKyNkZWZpbmUgUlhRX0NUUkxfUlJEX0JVUlNUX1RIUkVTSF9TSElGVAkJOAorI2RlZmluZSBSWFFfQ1RSTF9SUkRfQlVSU1RfVEhSRVNIX01BU0sJCTB4ZmYKKyNkZWZpbmUgUlhRX0NUUkxfUkZEX1BSRUZfTUlOX0lQR19TSElGVAkJMTYKKyNkZWZpbmUgUlhRX0NUUkxfUkZEX1BSRUZfTUlOX0lQR19NQVNLCQkweDFmCisjZGVmaW5lIFJYUV9DVFJMX0NVVF9USFJVX0VOCQkJMHg0MDAwMDAwMAorI2RlZmluZSBSWFFfQ1RSTF9FTgkJCQkweDgwMDAwMDAwCisKKy8qIFJ4IGp1bWJvIHBhY2tldCB0aHJlc2hvbGQgYW5kIHJyZCAgcmV0aXJlbWVudCB0aW1lciAqLworI2RlZmluZSBSRUdfUlhRX0pNQk9TWl9SUkRUSU0JCQkoUkVHX1JYUV9DVFJMKyA0KQorI2RlZmluZSBSWFFfSk1CT1NaX1RIX01BU0sJCQkweDdmZgorI2RlZmluZSBSWFFfSk1CT1NaX1RIX1NISUZUCQkJMAorI2RlZmluZSBSWFFfSk1CT19MS0FIX01BU0sJCQkweGYKKyNkZWZpbmUgUlhRX0pNQk9fTEtBSF9TSElGVAkJCTExCisjZGVmaW5lIFJYUV9SUkRfVElNRVJfTUFTSwkJCTB4ZmZmZgorI2RlZmluZSBSWFFfUlJEX1RJTUVSX1NISUZUCQkJMTYKKworLyogUkZEIGZsb3cgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBSRUdfUlhRX1JYRl9QQVVTRV9USFJFU0gJCShSRUdfUlhRX0NUUkwrIDgpCisjZGVmaW5lIFJYUV9SWEZfUEFVU0VfVEhfSElfU0hJRlQJCTE2CisjZGVmaW5lIFJYUV9SWEZfUEFVU0VfVEhfSElfTUFTSwkJMHhmZmYKKyNkZWZpbmUgUlhRX1JYRl9QQVVTRV9USF9MT19TSElGVAkJMAorI2RlZmluZSBSWFFfUlhGX1BBVVNFX1RIX0xPX01BU0sJCTB4ZmZmCisKKy8qIFJSRCBmbG93IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1JYUV9SUkRfUEFVU0VfVEhSRVNICQkoUkVHX1JYUV9DVFJMKzEyKQorI2RlZmluZSBSWFFfUlJEX1BBVVNFX1RIX0hJX1NISUZUCQkwCisjZGVmaW5lIFJYUV9SUkRfUEFVU0VfVEhfSElfTUFTSwkJMHhmZmYKKyNkZWZpbmUgUlhRX1JSRF9QQVVTRV9USF9MT19TSElGVAkJMTYKKyNkZWZpbmUgUlhRX1JSRF9QQVVTRV9USF9MT19NQVNLCQkweGZmZgorCisvKiBETUEgRW5naW5lIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0RNQV9DVFJMCQkJCTB4MTVjMAorI2RlZmluZSBETUFfQ1RSTF9ETUFSX0lOX09SREVSCQkJMHgxCisjZGVmaW5lIERNQV9DVFJMX0RNQVJfRU5IX09SREVSCQkJMHgyCisjZGVmaW5lIERNQV9DVFJMX0RNQVJfT1VUX09SREVSCQkJMHg0CisjZGVmaW5lIERNQV9DVFJMX1JDQl9WQUxVRQkJCTB4OAorI2RlZmluZSBETUFfQ1RSTF9ETUFSX0JVUlNUX0xFTl9TSElGVAkJNAorI2RlZmluZSBETUFfQ1RSTF9ETUFSX0JVUlNUX0xFTl9NQVNLCQk3CisjZGVmaW5lIERNQV9DVFJMX0RNQVdfQlVSU1RfTEVOX1NISUZUCQk3CisjZGVmaW5lIERNQV9DVFJMX0RNQVdfQlVSU1RfTEVOX01BU0sJCTcKKyNkZWZpbmUgRE1BX0NUUkxfRE1BUl9FTgkJCQkweDQwMAorI2RlZmluZSBETUFfQ1RSTF9ETUFXX0VOCQkJCTB4ODAwCisKKy8qIENNQi9TTUIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfQ1NNQl9DVFJMCQkJCTB4MTVkMAorI2RlZmluZSBDU01CX0NUUkxfQ01CX05PVwkJCTEKKyNkZWZpbmUgQ1NNQl9DVFJMX1NNQl9OT1cJCQkyCisjZGVmaW5lIENTTUJfQ1RSTF9DTUJfRU4JCQk0CisjZGVmaW5lIENTTUJfQ1RSTF9TTUJfRU4JCQk4CisKKy8qIENNQiBETUEgV3JpdGUgVGhyZXNob2xkIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19DTUJfV1JJVEVfVEgJCQkoUkVHX0NTTUJfQ1RSTCsgNCkKKyNkZWZpbmUgQ01CX1JSRF9USF9TSElGVAkJCTAKKyNkZWZpbmUgQ01CX1JSRF9USF9NQVNLCQkJCTB4N2ZmCisjZGVmaW5lIENNQl9UUERfVEhfU0hJRlQJCQkxNgorI2RlZmluZSBDTUJfVFBEX1RIX01BU0sJCQkJMHg3ZmYKKworLyogUlgvVFggY291bnQtZG93biB0aW1lciB0byB0cmlnZ2VyIENNQi13cml0ZS4gMnVzIHJlc29sdXRpb24uICovCisjZGVmaW5lIFJFR19DTUJfV1JJVEVfVElNRVIJCQkoUkVHX0NTTUJfQ1RSTCsgOCkKKyNkZWZpbmUgQ01CX1JYX1RNX1NISUZUCQkJCTAKKyNkZWZpbmUgQ01CX1JYX1RNX01BU0sJCQkJMHhmZmZmCisjZGVmaW5lIENNQl9UWF9UTV9TSElGVAkJCQkxNgorI2RlZmluZSBDTUJfVFhfVE1fTUFTSwkJCQkweGZmZmYKKworLyogTnVtYmVyIG9mIHBhY2tldCByZWNlaXZlZCBzaW5jZSBsYXN0IENNQiB3cml0ZSAqLworI2RlZmluZSBSRUdfQ01CX1JYX1BLVF9DTlQJCQkoUkVHX0NTTUJfQ1RSTCsxMikKKworLyogTnVtYmVyIG9mIHBhY2tldCB0cmFuc21pdHRlZCBzaW5jZSBsYXN0IENNQiB3cml0ZSAqLworI2RlZmluZSBSRUdfQ01CX1RYX1BLVF9DTlQJCQkoUkVHX0NTTUJfQ1RSTCsxNikKKworLyogU01CIGF1dG8gRE1BIHRpbWVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19TTUJfVElNRVIJCQkJKFJFR19DU01CX0NUUkwrMjApCisKKy8qIE1haWxib3ggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX01BSUxCT1gJCQkJMHgxNWYwCisjZGVmaW5lIE1CX1JGRF9QUk9EX0lORFhfU0hJRlQJCQkwCisjZGVmaW5lIE1CX1JGRF9QUk9EX0lORFhfTUFTSwkJCTB4N2ZmCisjZGVmaW5lIE1CX1JSRF9DT05TX0lORFhfU0hJRlQJCQkxMQorI2RlZmluZSBNQl9SUkRfQ09OU19JTkRYX01BU0sJCQkweDdmZgorI2RlZmluZSBNQl9UUERfUFJPRF9JTkRYX1NISUZUCQkJMjIKKyNkZWZpbmUgTUJfVFBEX1BST0RfSU5EWF9NQVNLCQkJMHgzZmYKKworLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfSVNSCQkJCQkweDE2MDAKKyNkZWZpbmUgSVNSX1NNQgkJCQkJMQorI2RlZmluZSBJU1JfVElNRVIJCQkJMgorI2RlZmluZSBJU1JfTUFOVUFMCQkJCTQKKyNkZWZpbmUgSVNSX1JYRl9PVgkJCQk4CisjZGVmaW5lIElTUl9SRkRfVU5SVU4JCQkJMHgxMAorI2RlZmluZSBJU1JfUlJEX09WCQkJCTB4MjAKKyNkZWZpbmUgSVNSX1RYRl9VTlJVTgkJCQkweDQwCisjZGVmaW5lIElTUl9MSU5LCQkJCTB4ODAKKyNkZWZpbmUgSVNSX0hPU1RfUkZEX1VOUlVOCQkJMHgxMDAKKyNkZWZpbmUgSVNSX0hPU1RfUlJEX09WCQkJCTB4MjAwCisjZGVmaW5lIElTUl9ETUFSX1RPX1JTVAkJCQkweDQwMAorI2RlZmluZSBJU1JfRE1BV19UT19SU1QJCQkJMHg4MDAKKyNkZWZpbmUgSVNSX0dQSFkJCQkJMHgxMDAwCisjZGVmaW5lIElTUl9SWF9QS1QJCQkJMHgxMDAwMAorI2RlZmluZSBJU1JfVFhfUEtUCQkJCTB4MjAwMDAKKyNkZWZpbmUgSVNSX1RYX0RNQQkJCQkweDQwMDAwCisjZGVmaW5lIElTUl9SWF9ETUEJCQkJMHg4MDAwMAorI2RlZmluZSBJU1JfQ01CX1JYCQkJCTB4MTAwMDAwCisjZGVmaW5lIElTUl9DTUJfVFgJCQkJMHgyMDAwMDAKKyNkZWZpbmUgSVNSX01BQ19SWAkJCQkweDQwMDAwMAorI2RlZmluZSBJU1JfTUFDX1RYCQkJCTB4ODAwMDAwCisjZGVmaW5lIElTUl9VUl9ERVRFQ1RFRAkJCQkweDEwMDAwMDAKKyNkZWZpbmUgSVNSX0ZFUlJfREVURUNURUQJCQkweDIwMDAwMDAKKyNkZWZpbmUgSVNSX05GRVJSX0RFVEVDVEVECQkJMHg0MDAwMDAwCisjZGVmaW5lIElTUl9DRVJSX0RFVEVDVEVECQkJMHg4MDAwMDAwCisjZGVmaW5lIElTUl9QSFlfTElOS0RPV04JCQkweDEwMDAwMDAwCisjZGVmaW5lIElTUl9ESVNfU01CCQkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgSVNSX0RJU19ETUEJCQkJMHg0MDAwMDAwMAorI2RlZmluZSBJU1JfRElTX0lOVAkJCQkweDgwMDAwMDAwCisKKy8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19JTVIJCQkJCTB4MTYwNAorCisvKiBOb3JtYWwgSW50ZXJydXB0IG1hc2sgICovCisjZGVmaW5lIElNUl9OT1JNQUxfTUFTSwkoXAorCUlTUl9TTUIJCXxcCisJSVNSX0dQSFkJfFwKKwlJU1JfUEhZX0xJTktET1dOfFwKKwlJU1JfRE1BUl9UT19SU1QJfFwKKwlJU1JfRE1BV19UT19SU1QJfFwKKwlJU1JfQ01CX1RYCXxcCisJSVNSX0NNQl9SWAkpCisKKy8qIERlYnVnIEludGVycnVwdCBNYXNrICAoZW5hYmxlIGFsbCBpbnRlcnJ1cHQpICovCisjZGVmaW5lIElNUl9ERUJVR19NQVNLCShcCisJSVNSX1NNQgkJfFwKKwlJU1JfVElNRVIJfFwKKwlJU1JfTUFOVUFMCXxcCisJSVNSX1JYRl9PVgl8XAorCUlTUl9SRkRfVU5SVU4JfFwKKwlJU1JfUlJEX09WCXxcCisJSVNSX1RYRl9VTlJVTgl8XAorCUlTUl9MSU5LCXxcCisJSVNSX0NNQl9UWAl8XAorCUlTUl9DTUJfUlgJfFwKKwlJU1JfUlhfUEtUCXxcCisJSVNSX1RYX1BLVAl8XAorCUlTUl9NQUNfUlgJfFwKKwlJU1JfTUFDX1RYCSkKKworLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSRUdfUkZEX1JSRF9JRFgJCQkJMHgxODAwCisjZGVmaW5lIFJFR19UUERfSURYCQkJCTB4MTgwNAorCisvKiAgTUlJIGRlZmluaXRpb24gKi8KKy8qIFBIWSBDb21tb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSCQkJCQkweDA5CisjZGVmaW5lIE1JSV9BVDAwMV9TUgkJCQkJMHgwQQorI2RlZmluZSBNSUlfQVQwMDFfRVNSCQkJCQkweDBGCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSCQkJCQkweDEwCisjZGVmaW5lIE1JSV9BVDAwMV9QU1NSCQkJCQkweDExCisKKy8qIFBIWSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9DUl9TUEVFRF9TRUxFQ1RfTVNCCQkJCTB4MDA0MAkvKiBiaXRzIDYsMTM6IDEwPTEwMDAsIDAxPTEwMCwgMDA9MTAgKi8KKyNkZWZpbmUgTUlJX0NSX0NPTExfVEVTVF9FTkFCTEUJCQkJMHgwMDgwCS8qIENvbGxpc2lvbiB0ZXN0IGVuYWJsZSAqLworI2RlZmluZSBNSUlfQ1JfRlVMTF9EVVBMRVgJCQkJMHgwMTAwCS8qIEZEWCA9MSwgaGFsZiBkdXBsZXggPTAgKi8KKyNkZWZpbmUgTUlJX0NSX1JFU1RBUlRfQVVUT19ORUcJCQkJMHgwMjAwCS8qIFJlc3RhcnQgYXV0byBuZWdvdGlhdGlvbiAqLworI2RlZmluZSBNSUlfQ1JfSVNPTEFURQkJCQkJMHgwNDAwCS8qIElzb2xhdGUgUEhZIGZyb20gTUlJICovCisjZGVmaW5lIE1JSV9DUl9QT1dFUl9ET1dOCQkJCTB4MDgwMAkvKiBQb3dlciBkb3duICovCisjZGVmaW5lIE1JSV9DUl9BVVRPX05FR19FTgkJCQkweDEwMDAJLyogQXV0byBOZWcgRW5hYmxlICovCisjZGVmaW5lIE1JSV9DUl9TUEVFRF9TRUxFQ1RfTFNCCQkJCTB4MjAwMAkvKiBiaXRzIDYsMTM6IDEwPTEwMDAsIDAxPTEwMCwgMDA9MTAgKi8KKyNkZWZpbmUgTUlJX0NSX0xPT1BCQUNLCQkJCQkweDQwMDAJLyogMCA9IG5vcm1hbCwgMSA9IGxvb3BiYWNrICovCisjZGVmaW5lIE1JSV9DUl9SRVNFVAkJCQkJMHg4MDAwCS8qIDAgPSBub3JtYWwsIDEgPSBQSFkgcmVzZXQgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRUVEX01BU0sJCQkJMHgyMDQwCisjZGVmaW5lIE1JSV9DUl9TUEVFRF8xMDAwCQkJCTB4MDA0MAorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAwCQkJCTB4MjAwMAorI2RlZmluZSBNSUlfQ1JfU1BFRURfMTAJCQkJCTB4MDAwMAorCisvKiBQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9TUl9FWFRFTkRFRF9DQVBTCQkJCTB4MDAwMQkvKiBFeHRlbmRlZCByZWdpc3RlciBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgTUlJX1NSX0pBQkJFUl9ERVRFQ1QJCQkJMHgwMDAyCS8qIEphYmJlciBEZXRlY3RlZCAqLworI2RlZmluZSBNSUlfU1JfTElOS19TVEFUVVMJCQkJMHgwMDA0CS8qIExpbmsgU3RhdHVzIDEgPSBsaW5rICovCisjZGVmaW5lIE1JSV9TUl9BVVRPTkVHX0NBUFMJCQkJMHgwMDA4CS8qIEF1dG8gTmVnIENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSX1JFTU9URV9GQVVMVAkJCQkweDAwMTAJLyogUmVtb3RlIEZhdWx0IERldGVjdCAqLworI2RlZmluZSBNSUlfU1JfQVVUT05FR19DT01QTEVURQkJCQkweDAwMjAJLyogQXV0byBOZWcgQ29tcGxldGUgKi8KKyNkZWZpbmUgTUlJX1NSX1BSRUFNQkxFX1NVUFBSRVNTCQkJMHgwMDQwCS8qIFByZWFtYmxlIG1heSBiZSBzdXBwcmVzc2VkICovCisjZGVmaW5lIE1JSV9TUl9FWFRFTkRFRF9TVEFUVVMJCQkJMHgwMTAwCS8qIEV4dC4gc3RhdHVzIGluZm8gaW4gUmVnIDB4MEYgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFQyX0hEX0NBUFMJCQkJMHgwMjAwCS8qIDEwMFQyIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFQyX0ZEX0NBUFMJCQkJMHgwNDAwCS8qIDEwMFQyIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwVF9IRF9DQVBTCQkJCTB4MDgwMAkvKiAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMFRfRkRfQ0FQUwkJCQkweDEwMDAJLyogMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwWF9IRF9DQVBTCQkJCTB4MjAwMAkvKiAxMDBYICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBYX0ZEX0NBUFMJCQkJMHg0MDAwCS8qIDEwMFggIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFQ0X0NBUFMJCQkJMHg4MDAwCS8qIDEwMFQ0IENhcGFibGUgKi8KKworLyogTGluayBwYXJ0bmVyIGFiaWxpdHkgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1JSV9MUEFfU0xDVAkJCQkJMHgwMDFmCS8qIFNhbWUgYXMgYWR2ZXJ0aXNlIHNlbGVjdG9yICAqLworI2RlZmluZSBNSUlfTFBBXzEwSEFMRgkJCQkJMHgwMDIwCS8qIENhbiBkbyAxMG1icHMgaGFsZi1kdXBsZXggICAqLworI2RlZmluZSBNSUlfTFBBXzEwRlVMTAkJCQkJMHgwMDQwCS8qIENhbiBkbyAxMG1icHMgZnVsbC1kdXBsZXggICAqLworI2RlZmluZSBNSUlfTFBBXzEwMEhBTEYJCQkJCTB4MDA4MAkvKiBDYW4gZG8gMTAwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgTUlJX0xQQV8xMDBGVUxMCQkJCQkweDAxMDAJLyogQ2FuIGRvIDEwMG1icHMgZnVsbC1kdXBsZXggICovCisjZGVmaW5lIE1JSV9MUEFfMTAwQkFTRTQJCQkJMHgwMjAwCS8qIDEwMEJBU0UtVDQgICovCisjZGVmaW5lIE1JSV9MUEFfUEFVU0UJCQkJCTB4MDQwMAkvKiBQQVVTRSAqLworI2RlZmluZSBNSUlfTFBBX0FTWVBBVVNFCQkJCTB4MDgwMAkvKiBBc3ltbWV0cmljYWwgUEFVU0UgKi8KKyNkZWZpbmUgTUlJX0xQQV9SRkFVTFQJCQkJCTB4MjAwMAkvKiBMaW5rIHBhcnRuZXIgZmF1bHRlZCAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0xQQV9MUEFDSwkJCQkJMHg0MDAwCS8qIExpbmsgcGFydG5lciBhY2tlZCB1cyAgICAgICAqLworI2RlZmluZSBNSUlfTFBBX05QQUdFCQkJCQkweDgwMDAJLyogTmV4dCBwYWdlIGJpdCAgICAgICAgICAgICAgICovCisKKy8qIEF1dG9uZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQVJfU0VMRUNUT1JfRklFTEQJCQkJMHgwMDAxCS8qIGluZGljYXRlcyBJRUVFIDgwMi4zIENTTUEvQ0QgKi8KKyNkZWZpbmUgTUlJX0FSXzEwVF9IRF9DQVBTCQkJCTB4MDAyMAkvKiAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9BUl8xMFRfRkRfQ0FQUwkJCQkweDAwNDAJLyogMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVJfMTAwVFhfSERfQ0FQUwkJCQkweDAwODAJLyogMTAwVFggSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVJfMTAwVFhfRkRfQ0FQUwkJCQkweDAxMDAJLyogMTAwVFggRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVJfMTAwVDRfQ0FQUwkJCQkweDAyMDAJLyogMTAwVDQgQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfQVJfUEFVU0UJCQkJCTB4MDQwMAkvKiBQYXVzZSBvcGVyYXRpb24gZGVzaXJlZCAqLworI2RlZmluZSBNSUlfQVJfQVNNX0RJUgkJCQkJMHgwODAwCS8qIEFzeW1tZXRyaWMgUGF1c2UgRGlyZWN0aW9uIGJpdCAqLworI2RlZmluZSBNSUlfQVJfUkVNT1RFX0ZBVUxUCQkJCTB4MjAwMAkvKiBSZW1vdGUgRmF1bHQgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgTUlJX0FSX05FWFRfUEFHRQkJCQkweDgwMDAJLyogTmV4dCBQYWdlIGFiaWxpdHkgc3VwcG9ydGVkICovCisjZGVmaW5lIE1JSV9BUl9TUEVFRF9NQVNLCQkJCTB4MDFFMAorI2RlZmluZSBNSUlfQVJfREVGQVVMVF9DQVBfTUFTSwkJCQkweDBERTAKKworLyogMTAwMEJBU0UtVCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9IRF9DQVBTCQkJMHgwMTAwCS8qIEFkdmVydGlzZSAxMDAwVCBIRCBjYXBhYmlsaXR5ICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9GRF9DQVBTCQkJMHgwMjAwCS8qIEFkdmVydGlzZSAxMDAwVCBGRCBjYXBhYmlsaXR5ICAqLworI2RlZmluZSBNSUlfQVQwMDFfQ1JfMTAwMFRfUkVQRUFURVJfRFRFCQkJMHgwNDAwCS8qIDE9UmVwZWF0ZXIvc3dpdGNoIGRldmljZSBwb3J0LCAwPURURSBkZXZpY2UgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX01TX1ZBTFVFCQkJMHgwODAwCS8qIDE9Q29uZmlndXJlIFBIWSBhcyBNYXN0ZXIsIDA9Q29uZmlndXJlIFBIWSBhcyBTbGF2ZSAqLworI2RlZmluZSBNSUlfQVQwMDFfQ1JfMTAwMFRfTVNfRU5BQkxFCQkJMHgxMDAwCS8qIDE9TWFzdGVyL1NsYXZlIG1hbnVhbCBjb25maWcgdmFsdWUsIDA9QXV0b21hdGljIE1hc3Rlci9TbGF2ZSBjb25maWcgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX1RFU1RfTU9ERV9OT1JNQUwJCTB4MDAwMAkvKiBOb3JtYWwgT3BlcmF0aW9uICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9URVNUX01PREVfMQkJCTB4MjAwMAkvKiBUcmFuc21pdCBXYXZlZm9ybSB0ZXN0ICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9URVNUX01PREVfMgkJCTB4NDAwMAkvKiBNYXN0ZXIgVHJhbnNtaXQgSml0dGVyIHRlc3QgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX1RFU1RfTU9ERV8zCQkJMHg2MDAwCS8qIFNsYXZlIFRyYW5zbWl0IEppdHRlciB0ZXN0ICovCisjZGVmaW5lIE1JSV9BVDAwMV9DUl8xMDAwVF9URVNUX01PREVfNAkJCTB4ODAwMAkvKiBUcmFuc21pdHRlciBEaXN0b3J0aW9uIHRlc3QgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX1NQRUVEX01BU0sJCQkweDAzMDAKKyNkZWZpbmUgTUlJX0FUMDAxX0NSXzEwMDBUX0RFRkFVTFRfQ0FQX01BU0sJCTB4MDMwMAorCisvKiAxMDAwQkFTRS1UIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQVQwMDFfU1JfMTAwMFRfTFBfSERfQ0FQUwkJCTB4MDQwMAkvKiBMUCBpcyAxMDAwVCBIRCBjYXBhYmxlICovCisjZGVmaW5lIE1JSV9BVDAwMV9TUl8xMDAwVF9MUF9GRF9DQVBTCQkJMHgwODAwCS8qIExQIGlzIDEwMDBUIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1NSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVMJCTB4MTAwMAkvKiBSZW1vdGUgcmVjZWl2ZXIgT0sgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1NSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVUwkJMHgyMDAwCS8qIExvY2FsIHJlY2VpdmVyIE9LICovCisjZGVmaW5lIE1JSV9BVDAwMV9TUl8xMDAwVF9NU19DT05GSUdfUkVTCQkweDQwMDAJLyogMT1Mb2NhbCBUWCBpcyBNYXN0ZXIsIDA9U2xhdmUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1NSXzEwMDBUX01TX0NPTkZJR19GQVVMVAkJMHg4MDAwCS8qIE1hc3Rlci9TbGF2ZSBjb25maWcgZmF1bHQgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1NSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVNfU0hJRlQJMTIKKyNkZWZpbmUgTUlJX0FUMDAxX1NSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVU19TSElGVAkxMworCisvKiBFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0VTUl8xMDAwVF9IRF9DQVBTCQkJMHgxMDAwCS8qIDEwMDBUIEhEIGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0VTUl8xMDAwVF9GRF9DQVBTCQkJMHgyMDAwCS8qIDEwMDBUIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0VTUl8xMDAwWF9IRF9DQVBTCQkJMHg0MDAwCS8qIDEwMDBYIEhEIGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX0VTUl8xMDAwWF9GRF9DQVBTCQkJMHg4MDAwCS8qIDEwMDBYIEZEIGNhcGFibGUgKi8KKworLyogQVQwMDEgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfSkFCQkVSX0RJU0FCTEUJCQkweDAwMDEJLyogMT1KYWJiZXIgRnVuY3Rpb24gZGlzYWJsZWQgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUwJCTB4MDAwMgkvKiAxPVBvbGFyaXR5IFJldmVyc2FsIGVuYWJsZWQgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfU1FFX1RFU1QJCQkJMHgwMDA0CS8qIDE9U1FFIFRlc3QgZW5hYmxlZCAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9NQUNfUE9XRVJET1dOCQkJMHgwMDA4CisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX0NMSzEyNV9ESVNBQkxFCQkJMHgwMDEwCS8qIDE9Q0xLMTI1IGxvdywgMD1DTEsxMjUgdG9nZ2xpbmcgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfTURJX01BTlVBTF9NT0RFCQkJMHgwMDAwCS8qIE1ESSBDcm9zc292ZXIgTW9kZSBiaXRzIDY6NSwgTWFudWFsIE1ESSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX01ESVhfTUFOVUFMX01PREUJCQkweDAwMjAJLyogTWFudWFsIE1ESVggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9BVVRPX1hfMTAwMFQJCQkweDAwNDAJLyogMTAwMEJBU0UtVDogQXV0byBjcm9zc292ZXIsIDEwMEJBU0UtVFgvMTBCQVNFLVQ6IE1ESSBNb2RlICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX0FVVE9fWF9NT0RFCQkJMHgwMDYwCS8qIEF1dG8gY3Jvc3NvdmVyIGVuYWJsZWQgYWxsIHNwZWVkcy4gKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfMTBCVF9FWFRfRElTVF9FTkFCTEUJCTB4MDA4MAkvKiAxPUVuYWJsZSBFeHRlbmRlZCAxMEJBU0UtVCBkaXN0YW5jZSAoTG93ZXIgMTBCQVNFLVQgUlggVGhyZXNob2xkKSwgMD1Ob3JtYWwgMTBCQVNFLVQgUlggVGhyZXNob2xkICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX01JSV81QklUX0VOQUJMRQkJCTB4MDEwMAkvKiAxPTUtQml0IGludGVyZmFjZSBpbiAxMDBCQVNFLVRYLCAwPU1JSSBpbnRlcmZhY2UgaW4gMTAwQkFTRS1UWCAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNDUl9TQ1JBTUJMRVJfRElTQUJMRQkJMHgwMjAwCS8qIDE9U2NyYW1ibGVyIGRpc2FibGUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTQ1JfRk9SQ0VfTElOS19HT09ECQkJMHgwNDAwCS8qIDE9Rm9yY2UgbGluayBnb29kICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX0FTU0VSVF9DUlNfT05fVFgJCQkweDA4MDAJLyogMT1Bc3NlcnQgQ1JTIG9uIFRyYW5zbWl0ICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMX1NISUZUCQkxCisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSX0FVVE9fWF9NT0RFX1NISUZUCQk1CisjZGVmaW5lIE1JSV9BVDAwMV9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFX1NISUZUCTcKKworLyogQVQwMDEgUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNTUl9TUERfRFBMWF9SRVNPTFZFRAkJMHgwODAwCS8qIDE9U3BlZWQgJiBEdXBsZXggcmVzb2x2ZWQgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTU1JfRFBMWAkJCQkweDIwMDAJLyogMT1EdXBsZXggMD1IYWxmIER1cGxleCAqLworI2RlZmluZSBNSUlfQVQwMDFfUFNTUl9TUEVFRAkJCQkweEMwMDAJLyogU3BlZWQsIGJpdHMgMTQ6MTUgKi8KKyNkZWZpbmUgTUlJX0FUMDAxX1BTU1JfMTBNQlMJCQkJMHgwMDAwCS8qIDAwPTEwTWJzICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU1NSXzEwME1CUwkJCQkweDQwMDAJLyogMDE9MTAwTWJzICovCisjZGVmaW5lIE1JSV9BVDAwMV9QU1NSXzEwMDBNQlMJCQkJMHg4MDAwCS8qIDEwPTEwMDBNYnMgKi8KKworLyogUENJIENvbW1hbmQgUmVnaXN0ZXIgQml0IERlZmluaXRpb25zICovCisjZGVmaW5lIFBDSV9SRUdfQ09NTUFORAkJCQkJMHgwNAkvKiBQQ0kgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBDTURfSU9fU1BBQ0UJCQkJCTB4MDAwMQorI2RlZmluZSBDTURfTUVNT1JZX1NQQUNFCQkJCTB4MDAwMgorI2RlZmluZSBDTURfQlVTX01BU1RFUgkJCQkJMHgwMDA0CisKKy8qIFdha2UgVXAgRmlsdGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgQVRMMV9XVUZDX0xOS0MJMHgwMDAwMDAwMQkvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBBVEwxX1dVRkNfTUFHCTB4MDAwMDAwMDIJLyogTWFnaWMgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgQVRMMV9XVUZDX0VYCTB4MDAwMDAwMDQJLyogRGlyZWN0ZWQgRXhhY3QgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBBVEwxX1dVRkNfTUMJMHgwMDAwMDAwOAkvKiBNdWx0aWNhc3QgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBBVEwxX1dVRkNfQkMJMHgwMDAwMDAxMAkvKiBCcm9hZGNhc3QgV2FrZXVwIEVuYWJsZSAqLworCisvKiBFcnJvciBDb2RlcyAqLworI2RlZmluZSBBVEwxX1NVQ0NFU1MJCQkwCisjZGVmaW5lIEFUTDFfRVJSX0VFUFJPTQkJCTEKKyNkZWZpbmUgQVRMMV9FUlJfUEhZCQkJMgorI2RlZmluZSBBVEwxX0VSUl9DT05GSUcJCQkzCisjZGVmaW5lIEFUTDFfRVJSX1BBUkFNCQkJNAorI2RlZmluZSBBVEwxX0VSUl9NQUNfVFlQRQkJNQorI2RlZmluZSBBVEwxX0VSUl9QSFlfVFlQRQkJNgorI2RlZmluZSBBVEwxX0VSUl9QSFlfU1BFRUQJCTcKKyNkZWZpbmUgQVRMMV9FUlJfUEhZX1JFUwkJOAorCisjZGVmaW5lIFNQRUVEXzAJCTB4ZmZmZgorI2RlZmluZSBTUEVFRF8xMAkxMAorI2RlZmluZSBTUEVFRF8xMDAJMTAwCisjZGVmaW5lIFNQRUVEXzEwMDAJMTAwMAorI2RlZmluZSBIQUxGX0RVUExFWAkxCisjZGVmaW5lIEZVTExfRFVQTEVYCTIKKworI2RlZmluZSBNRURJQV9UWVBFX0FVVE9fU0VOU09SCTAKKyNkZWZpbmUgTUVESUFfVFlQRV8xMDAwTV9GVUxMCTEKKyNkZWZpbmUgTUVESUFfVFlQRV8xMDBNX0ZVTEwJMgorI2RlZmluZSBNRURJQV9UWVBFXzEwME1fSEFMRgkzCisjZGVmaW5lIE1FRElBX1RZUEVfMTBNX0ZVTEwJNAorI2RlZmluZSBNRURJQV9UWVBFXzEwTV9IQUxGCTUKKworI2RlZmluZSBBRFZFUlRJU0VfMTBfSEFMRgkJMHgwMDAxCisjZGVmaW5lIEFEVkVSVElTRV8xMF9GVUxMCQkweDAwMDIKKyNkZWZpbmUgQURWRVJUSVNFXzEwMF9IQUxGCQkweDAwMDQKKyNkZWZpbmUgQURWRVJUSVNFXzEwMF9GVUxMCQkweDAwMDgKKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBfSEFMRgkJMHgwMDEwCisjZGVmaW5lIEFEVkVSVElTRV8xMDAwX0ZVTEwJCTB4MDAyMAorI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUCTB4MDAyRgkvKiBFdmVyeXRoaW5nIGJ1dCAxMDAwLUhhbGYgKi8KKyNkZWZpbmUgQVVUT05FR19BRFZFUlRJU0VfMTBfMTAwX0FMTAkweDAwMEYJLyogQWxsIDEwLzEwMCBzcGVlZHMgKi8KKyNkZWZpbmUgQVVUT05FR19BRFZFUlRJU0VfMTBfQUxMCTB4MDAwMwkvKiAxME1icHMgRnVsbCAmIEhhbGYgc3BlZWRzICovCisKKy8qIFRoZSBzaXplIChpbiBieXRlcykgb2YgYSBldGhlcm5ldCBwYWNrZXQgKi8KKyNkZWZpbmUgRU5FVF9IRUFERVJfU0laRQkJMTQKKyNkZWZpbmUgTUFYSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFCTE1MTgJLyogd2l0aCBGQ1MgKi8KKyNkZWZpbmUgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFCTY0CS8qIHdpdGggRkNTICovCisjZGVmaW5lIEVUSEVSTkVUX0ZDU19TSVpFCQk0CisjZGVmaW5lIE1BWF9KVU1CT19GUkFNRV9TSVpFCQkweDI4MDAKKworI2RlZmluZSBQSFlfQVVUT19ORUdfVElNRQk0NQkvKiA0LjUgU2Vjb25kcyAqLworI2RlZmluZSBQSFlfRk9SQ0VfVElNRQkJMjAJLyogMi4wIFNlY29uZHMgKi8KKworLyogRm9yIGNoZWNrc3VtbWluZyAsIHRoZSBzdW0gb2YgYWxsIHdvcmRzIGluIHRoZSBFRVBST00gc2hvdWxkIGVxdWFsIDB4QkFCQSAqLworI2RlZmluZSBFRVBST01fU1VNCQkweEJBQkEKKworI2RlZmluZSBBVEwxX0VFRFVNUF9MRU4JCTQ4CisKKy8qIFN0YXRpc3RpY3MgY291bnRlcnMgY29sbGVjdGVkIGJ5IHRoZSBNQUMgKi8KK3N0cnVjdCBzdGF0c19tc2dfYmxvY2sgeworCS8qIHJ4ICovCisJdTMyIHJ4X29rOwkJLyogVGhlIG51bWJlciBvZiBnb29kIHBhY2tldCByZWNlaXZlZC4gKi8KKwl1MzIgcnhfYmNhc3Q7CQkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgYnJvYWRjYXN0IHBhY2tldCByZWNlaXZlZC4gKi8KKwl1MzIgcnhfbWNhc3Q7CQkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgbXVsdGljYXN0IHBhY2tldCByZWNlaXZlZC4gKi8KKwl1MzIgcnhfcGF1c2U7CQkvKiBUaGUgbnVtYmVyIG9mIFBhdXNlIHBhY2tldCByZWNlaXZlZC4gKi8KKwl1MzIgcnhfY3RybDsJCS8qIFRoZSBudW1iZXIgb2YgQ29udHJvbCBwYWNrZXQgcmVjZWl2ZWQgb3RoZXIgdGhhbiBQYXVzZSBmcmFtZS4gKi8KKwl1MzIgcnhfZmNzX2VycjsJCS8qIFRoZSBudW1iZXIgb2YgcGFja2V0cyB3aXRoIGJhZCBGQ1MuICovCisJdTMyIHJ4X2xlbl9lcnI7CQkvKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgd2l0aCBtaXNtYXRjaCBvZiBsZW5ndGggZmllbGQgYW5kIGFjdHVhbCBzaXplLiAqLworCXUzMiByeF9ieXRlX2NudDsJLyogVGhlIG51bWJlciBvZiBieXRlcyBvZiBnb29kIHBhY2tldCByZWNlaXZlZC4gRkNTIGlzIE5PVCBpbmNsdWRlZC4gKi8KKwl1MzIgcnhfcnVudDsJCS8qIFRoZSBudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCB0aGF0IGFyZSBsZXNzIHRoYW4gNjQgYnl0ZSBsb25nIGFuZCB3aXRoIGdvb2QgRkNTLiAqLworCXUzMiByeF9mcmFnOwkJLyogVGhlIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkIHRoYXQgYXJlIGxlc3MgdGhhbiA2NCBieXRlIGxvbmcgYW5kIHdpdGggYmFkIEZDUy4gKi8KKwl1MzIgcnhfc3pfNjQ7CQkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgYW5kIGJhZCBwYWNrZXRzIHJlY2VpdmVkIHRoYXQgYXJlIDY0IGJ5dGUgbG9uZy4gKi8KKwl1MzIgcnhfc3pfNjVfMTI3OwkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgYW5kIGJhZCBwYWNrZXRzIHJlY2VpdmVkIHRoYXQgYXJlIGJldHdlZW4gNjUgYW5kIDEyNy1ieXRlIGxvbmcuICovCisJdTMyIHJ4X3N6XzEyOF8yNTU7CS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgcmVjZWl2ZWQgdGhhdCBhcmUgYmV0d2VlbiAxMjggYW5kIDI1NS1ieXRlIGxvbmcuICovCisJdTMyIHJ4X3N6XzI1Nl81MTE7CS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgcmVjZWl2ZWQgdGhhdCBhcmUgYmV0d2VlbiAyNTYgYW5kIDUxMS1ieXRlIGxvbmcuICovCisJdTMyIHJ4X3N6XzUxMl8xMDIzOwkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgYW5kIGJhZCBwYWNrZXRzIHJlY2VpdmVkIHRoYXQgYXJlIGJldHdlZW4gNTEyIGFuZCAxMDIzLWJ5dGUgbG9uZy4gKi8KKwl1MzIgcnhfc3pfMTAyNF8xNTE4OwkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgYW5kIGJhZCBwYWNrZXRzIHJlY2VpdmVkIHRoYXQgYXJlIGJldHdlZW4gMTAyNCBhbmQgMTUxOC1ieXRlIGxvbmcuICovCisJdTMyIHJ4X3N6XzE1MTlfbWF4OwkvKiBUaGUgbnVtYmVyIG9mIGdvb2QgYW5kIGJhZCBwYWNrZXRzIHJlY2VpdmVkIHRoYXQgYXJlIGJldHdlZW4gMTUxOS1ieXRlIGFuZCBNVFUuICovCisJdTMyIHJ4X3N6X292OwkJLyogVGhlIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcGFja2V0cyByZWNlaXZlZCB0aGF0IGFyZSBtb3JlIHRoYW4gTVRVIHNpemUgxaFDIHRydW5jYXRlZCBieSBTZWxlbmUuICovCisJdTMyIHJ4X3J4Zl9vdjsJCS8qIFRoZSBudW1iZXIgb2YgZnJhbWUgZHJvcHBlZCBkdWUgdG8gb2NjdXJyZW5jZSBvZiBSWCBGSUZPIG92ZXJmbG93LiAqLworCXUzMiByeF9ycmRfb3Y7CQkvKiBUaGUgbnVtYmVyIG9mIGZyYW1lIGRyb3BwZWQgZHVlIHRvIG9jY3VycmVuY2Ugb2YgUlJEIG92ZXJmbG93LiAqLworCXUzMiByeF9hbGlnbl9lcnI7CS8qIEFsaWdubWVudCBFcnJvciAqLworCXUzMiByeF9iY2FzdF9ieXRlX2NudDsJLyogVGhlIGJ5dGUgY291bnQgb2YgYnJvYWRjYXN0IHBhY2tldCByZWNlaXZlZCwgZXhjbHVkaW5nIEZDUy4gKi8KKwl1MzIgcnhfbWNhc3RfYnl0ZV9jbnQ7CS8qIFRoZSBieXRlIGNvdW50IG9mIG11bHRpY2FzdCBwYWNrZXQgcmVjZWl2ZWQsIGV4Y2x1ZGluZyBGQ1MuICovCisJdTMyIHJ4X2Vycl9hZGRyOwkvKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gYWRkcmVzcyBmaWx0ZXJpbmcuICovCisKKwkvKiB0eCAqLworCXUzMiB0eF9vazsJCS8qIFRoZSBudW1iZXIgb2YgZ29vZCBwYWNrZXQgdHJhbnNtaXR0ZWQuICovCisJdTMyIHR4X2JjYXN0OwkJLyogVGhlIG51bWJlciBvZiBnb29kIGJyb2FkY2FzdCBwYWNrZXQgdHJhbnNtaXR0ZWQuICovCisJdTMyIHR4X21jYXN0OwkJLyogVGhlIG51bWJlciBvZiBnb29kIG11bHRpY2FzdCBwYWNrZXQgdHJhbnNtaXR0ZWQuICovCisJdTMyIHR4X3BhdXNlOwkJLyogVGhlIG51bWJlciBvZiBQYXVzZSBwYWNrZXQgdHJhbnNtaXR0ZWQuICovCisJdTMyIHR4X2V4Y19kZWZlcjsJLyogVGhlIG51bWJlciBvZiBwYWNrZXRzIHRyYW5zbWl0dGVkIHdpdGggZXhjZXNzaXZlIGRlZmVycmFsLiAqLworCXUzMiB0eF9jdHJsOwkJLyogVGhlIG51bWJlciBvZiBwYWNrZXRzIHRyYW5zbWl0dGVkIGlzIGEgY29udHJvbCBmcmFtZSwgZXhjbHVkaW5nIFBhdXNlIGZyYW1lLiAqLworCXUzMiB0eF9kZWZlcjsJCS8qIFRoZSBudW1iZXIgb2YgcGFja2V0cyB0cmFuc21pdHRlZCB0aGF0IGlzIGRlZmVycmVkLiAqLworCXUzMiB0eF9ieXRlX2NudDsJLyogVGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRyYW5zbWl0dGVkLiBGQ1MgaXMgTk9UIGluY2x1ZGVkLiAqLworCXUzMiB0eF9zel82NDsJCS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgdHJhbnNtaXR0ZWQgdGhhdCBhcmUgNjQgYnl0ZSBsb25nLiAqLworCXUzMiB0eF9zel82NV8xMjc7CS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgdHJhbnNtaXR0ZWQgdGhhdCBhcmUgYmV0d2VlbiA2NSBhbmQgMTI3LWJ5dGUgbG9uZy4gKi8KKwl1MzIgdHhfc3pfMTI4XzI1NTsJLyogVGhlIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcGFja2V0cyB0cmFuc21pdHRlZCB0aGF0IGFyZSBiZXR3ZWVuIDEyOCBhbmQgMjU1LWJ5dGUgbG9uZy4gKi8KKwl1MzIgdHhfc3pfMjU2XzUxMTsJLyogVGhlIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcGFja2V0cyB0cmFuc21pdHRlZCB0aGF0IGFyZSBiZXR3ZWVuIDI1NiBhbmQgNTExLWJ5dGUgbG9uZy4gKi8KKwl1MzIgdHhfc3pfNTEyXzEwMjM7CS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgdHJhbnNtaXR0ZWQgdGhhdCBhcmUgYmV0d2VlbiA1MTIgYW5kIDEwMjMtYnl0ZSBsb25nLiAqLworCXUzMiB0eF9zel8xMDI0XzE1MTg7CS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgdHJhbnNtaXR0ZWQgdGhhdCBhcmUgYmV0d2VlbiAxMDI0IGFuZCAxNTE4LWJ5dGUgbG9uZy4gKi8KKwl1MzIgdHhfc3pfMTUxOV9tYXg7CS8qIFRoZSBudW1iZXIgb2YgZ29vZCBhbmQgYmFkIHBhY2tldHMgdHJhbnNtaXR0ZWQgdGhhdCBhcmUgYmV0d2VlbiAxNTE5LWJ5dGUgYW5kIE1UVS4gKi8KKwl1MzIgdHhfMV9jb2w7CQkvKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgc3Vic2VxdWVudGx5IHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSB3aXRoIGEgc2luZ2xlIHByaW9yIGNvbGxpc2lvbi4gKi8KKwl1MzIgdHhfMl9jb2w7CQkvKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgc3Vic2VxdWVudGx5IHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSB3aXRoIG11bHRpcGxlIHByaW9yIGNvbGxpc2lvbnMuICovCisJdTMyIHR4X2xhdGVfY29sOwkvKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgdHJhbnNtaXR0ZWQgd2l0aCBsYXRlIGNvbGxpc2lvbnMuICovCisJdTMyIHR4X2Fib3J0X2NvbDsJLyogVGhlIG51bWJlciBvZiB0cmFuc21pdCBwYWNrZXRzIGFib3J0ZWQgZHVlIHRvIGV4Y2Vzc2l2ZSBjb2xsaXNpb25zLiAqLworCXUzMiB0eF91bmRlcnJ1bjsJLyogVGhlIG51bWJlciBvZiB0cmFuc21pdCBwYWNrZXRzIGFib3J0ZWQgZHVlIHRvIHRyYW5zbWl0IEZJRk8gdW5kZXJydW4sIG9yIFRSRCBGSUZPIHVuZGVycnVuICovCisJdTMyIHR4X3JkX2VvcDsJCS8qIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCByZWFkIGJleW9uZCB0aGUgRU9QIGludG8gdGhlIG5leHQgZnJhbWUgYXJlYSB3aGVuIFRSRCB3YXMgbm90IHdyaXR0ZW4gdGltZWx5ICovCisJdTMyIHR4X2xlbl9lcnI7CQkvKiBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0IHBhY2tldHMgd2l0aCBsZW5ndGggZmllbGQgZG9lcyBOT1QgbWF0Y2ggdGhlIGFjdHVhbCBmcmFtZSBzaXplLiAqLworCXUzMiB0eF90cnVuYzsJCS8qIFRoZSBudW1iZXIgb2YgdHJhbnNtaXQgcGFja2V0cyB0cnVuY2F0ZWQgZHVlIHRvIHNpemUgZXhjZWVkaW5nIE1UVS4gKi8KKwl1MzIgdHhfYmNhc3RfYnl0ZTsJLyogVGhlIGJ5dGUgY291bnQgb2YgYnJvYWRjYXN0IHBhY2tldCB0cmFuc21pdHRlZCwgZXhjbHVkaW5nIEZDUy4gKi8KKwl1MzIgdHhfbWNhc3RfYnl0ZTsJLyogVGhlIGJ5dGUgY291bnQgb2YgbXVsdGljYXN0IHBhY2tldCB0cmFuc21pdHRlZCwgZXhjbHVkaW5nIEZDUy4gKi8KKwl1MzIgc21iX3VwZGF0ZWQ7CS8qIDE6IFNNQiBVcGRhdGVkLiBUaGlzIGlzIHVzZWQgYnkgc29mdHdhcmUgYXMgdGhlIGluZGljYXRpb24gb2YgdGhlIHN0YXRpc3RpY3MgdXBkYXRlLgorCQkJCSAqIFNvZnR3YXJlIHNob3VsZCBjbGVhciB0aGlzIGJpdCBhcyBzb29uIGFzIHJldHJpZXZpbmcgdGhlIHN0YXRpc3RpY3MgaW5mb3JtYXRpb24uICovCit9OworCisvKiBDb2FsZXNjaW5nIE1lc3NhZ2UgQmxvY2sgKi8KK3N0cnVjdCBjb2Fsc19tc2dfYmxvY2sgeworCXUzMiBpbnRfc3RhdHM7CQkvKiBpbnRlcnJ1cHQgc3RhdHVzICovCisJdTE2IHJyZF9wcm9kX2lkeDsJLyogVFJEIFByb2R1Y2VyIEluZGV4LiAqLworCXUxNiByZmRfY29uc19pZHg7CS8qIFJGRCBDb25zdW1lciBJbmRleC4gKi8KKwl1MTYgdXBkYXRlOwkJLyogU2VsZW5lIHNldHMgdGhpcyBiaXQgZXZlcnkgdGltZSBpdCBETUEgdGhlIENNQiB0byBob3N0IG1lbW9yeS4KKwkJCQkgKiBTb2Z0d2FyZSBzdXBwb3NlcyB0byBjbGVhciB0aGlzIGJpdCB3aGVuIENNQiBpbmZvcm1hdGlvbiBpcyBwcm9jZXNzZWQuICovCisJdTE2IHRwZF9jb25zX2lkeDsJLyogVFBEIENvbnN1bWVyIEluZGV4LiAqLworfTsKKworLyogUlJEIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCByeF9yZXR1cm5fZGVzYyB7CisJdTggbnVtX2J1ZjsJCS8qIE51bWJlciBvZiBSRkQgYnVmZmVycyB1c2VkIGJ5IHRoZSByZWNlaXZlZCBwYWNrZXQgKi8KKwl1OCByZXN2ZWQ7CisJdTE2IGJ1Zl9pbmR4OwkJLyogUkZEIEluZGV4IG9mIHRoZSBmaXJzdCBidWZmZXIgKi8KKwl1bmlvbiB7CisJCXUzMiB2YWxpZDsKKwkJc3RydWN0IHsKKwkJCXUxNiByeF9jaGtzdW07CisJCQl1MTYgcGt0X3NpemU7CisJCX0geHN1bV9zejsKKwl9IHhzejsKKworCXUxNiBwa3RfZmxnOwkJLyogUGFja2V0IGZsYWdzICovCisJdTE2IGVycl9mbGc7CQkvKiBFcnJvciBmbGFncyAqLworCXUxNiByZXN2ZWQyOworCXUxNiB2bGFuX3RhZzsJCS8qIFZMQU4gVEFHICovCit9OworCisjZGVmaW5lIFBBQ0tFVF9GTEFHX0VUSF9UWVBFCTB4MDA4MAorI2RlZmluZSBQQUNLRVRfRkxBR19WTEFOX0lOUwkweDAxMDAKKyNkZWZpbmUgUEFDS0VUX0ZMQUdfRVJSCQkweDAyMDAKKyNkZWZpbmUgUEFDS0VUX0ZMQUdfSVBWNAkweDA0MDAKKyNkZWZpbmUgUEFDS0VUX0ZMQUdfVURQCQkweDA4MDAKKyNkZWZpbmUgUEFDS0VUX0ZMQUdfVENQCQkweDEwMDAKKyNkZWZpbmUgUEFDS0VUX0ZMQUdfQkNBU1QJMHgyMDAwCisjZGVmaW5lIFBBQ0tFVF9GTEFHX01DQVNUCTB4NDAwMAorI2RlZmluZSBQQUNLRVRfRkxBR19QQVVTRQkweDgwMDAKKworI2RlZmluZSBFUlJfRkxBR19DUkMJCTB4MDAwMQorI2RlZmluZSBFUlJfRkxBR19DT0RFCQkweDAwMDIKKyNkZWZpbmUgRVJSX0ZMQUdfRFJJQkJMRQkweDAwMDQKKyNkZWZpbmUgRVJSX0ZMQUdfUlVOVAkJMHgwMDA4CisjZGVmaW5lIEVSUl9GTEFHX09WCQkweDAwMTAKKyNkZWZpbmUgRVJSX0ZMQUdfVFJVTkMJCTB4MDAyMAorI2RlZmluZSBFUlJfRkxBR19JUF9DSEtTVU0JMHgwMDQwCisjZGVmaW5lIEVSUl9GTEFHX0w0X0NIS1NVTQkweDAwODAKKyNkZWZpbmUgRVJSX0ZMQUdfTEVOCQkweDAxMDAKKyNkZWZpbmUgRVJSX0ZMQUdfREVTX0FERFIJMHgwMjAwCisKKy8qIFJGRCBkZXNjcmlwdG9yICovCitzdHJ1Y3QgcnhfZnJlZV9kZXNjIHsKKwlfX2xlNjQgYnVmZmVyX2FkZHI7CS8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZmZlciAqLworCV9fbGUxNiBidWZfbGVuOwkJLyogU2l6ZSBvZiB0aGUgcmVjZWl2ZSBidWZmZXIgaW4gaG9zdCBtZW1vcnksIGluIGJ5dGUgKi8KKwl1MTYgY29hbGVzZTsJCS8qIFVwZGF0ZSBjb25zdW1lciBpbmRleCB0byBob3N0IGFmdGVyIHRoZSByZWNlcHRpb24gb2YgdGhpcyBmcmFtZSAqLworCS8qIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBpcyByZXF1aXJlZCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIHRzb3B1IGRlZmluZXMgKi8KKyNkZWZpbmUgVFNPX1BBUkFNX0JVRkxFTl9NQVNLICAgICAgICAgICAweDNGRkYKKyNkZWZpbmUgVFNPX1BBUkFNX0JVRkxFTl9TSElGVCAgICAgICAgICAwCisjZGVmaW5lIFRTT19QQVJBTV9ETUFJTlRfTUFTSyAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRTT19QQVJBTV9ETUFJTlRfU0hJRlQgICAgICAgICAgMTQKKyNkZWZpbmUgVFNPX1BBUkFNX1BLVE5UX01BU0sgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFNPX1BBUkFNX1BLVElOVF9TSElGVCAgICAgICAgICAxNQorI2RlZmluZSBUU09fUEFSQU1fVkxBTlRBR19NQVNLICAgICAgICAgIDB4RkZGRgorI2RlZmluZSBUU09fUEFSQU1fVkxBTl9TSElGVCAgICAgICAgICAgIDE2CisKKy8qIHRzb3BsIGRlZmluZXMgKi8KKyNkZWZpbmUgVFNPX1BBUkFNX0VPUF9NQVNLICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFNPX1BBUkFNX0VPUF9TSElGVCAgICAgICAgICAgICAwCisjZGVmaW5lIFRTT19QQVJBTV9DT0FMRVNDRV9NQVNLICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRTT19QQVJBTV9DT0FMRVNDRV9TSElGVCAgICAgICAgMQorI2RlZmluZSBUU09fUEFSQU1fSU5TVkxBR19NQVNLICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUU09fUEFSQU1fSU5TVkxBR19TSElGVCAgICAgICAgIDIKKyNkZWZpbmUgVFNPX1BBUkFNX0NVU1RPTUNLU1VNX01BU0sgICAgICAweDAwMDEKKyNkZWZpbmUgVFNPX1BBUkFNX0NVU1RPTUNLU1VNX1NISUZUICAgICAzCisjZGVmaW5lIFRTT19QQVJBTV9TRUdNRU5UX01BU0sgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRTT19QQVJBTV9TRUdNRU5UX1NISUZUICAgICAgICAgNAorI2RlZmluZSBUU09fUEFSQU1fSVBDS1NVTV9NQVNLICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUU09fUEFSQU1fSVBDS1NVTV9TSElGVCAgICAgICAgIDUKKyNkZWZpbmUgVFNPX1BBUkFNX1RDUENLU1VNX01BU0sgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFNPX1BBUkFNX1RDUENLU1VNX1NISUZUICAgICAgICA2CisjZGVmaW5lIFRTT19QQVJBTV9VRFBDS1NVTV9NQVNLICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRTT19QQVJBTV9VRFBDS1NVTV9TSElGVCAgICAgICAgNworI2RlZmluZSBUU09fUEFSQU1fVkxBTlRBR0dFRF9NQVNLICAgICAgIDB4MDAwMQorI2RlZmluZSBUU09fUEFSQU1fVkxBTlRBR0dFRF9TSElGVCAgICAgIDgKKyNkZWZpbmUgVFNPX1BBUkFNX0VUSFRZUEVfTUFTSyAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFNPX1BBUkFNX0VUSFRZUEVfU0hJRlQgICAgICAgICA5CisjZGVmaW5lIFRTT19QQVJBTV9JUEhMX01BU0sgICAgICAgICAgICAgMHgwMDBGCisjZGVmaW5lIFRTT19QQVJBTV9JUEhMX1NISUZUICAgICAgICAgICAgMTAKKyNkZWZpbmUgVFNPX1BBUkFNX1RDUEhEUkxFTl9NQVNLICAgICAgICAweDAwMEYKKyNkZWZpbmUgVFNPX1BBUkFNX1RDUEhEUkxFTl9TSElGVCAgICAgICAxNAorI2RlZmluZSBUU09fUEFSQU1fSERSRkxBR19NQVNLICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUU09fUEFSQU1fSERSRkxBR19TSElGVCAgICAgICAgIDE4CisjZGVmaW5lIFRTT19QQVJBTV9NU1NfTUFTSyAgICAgICAgICAgICAgMHgxRkZGCisjZGVmaW5lIFRTT19QQVJBTV9NU1NfU0hJRlQgICAgICAgICAgICAgMTkKKworLyogY3N1bXB1IGRlZmluZXMgKi8KKyNkZWZpbmUgQ1NVTV9QQVJBTV9CVUZMRU5fTUFTSyAgICAgICAgICAweDNGRkYKKyNkZWZpbmUgQ1NVTV9QQVJBTV9CVUZMRU5fU0hJRlQgICAgICAgICAwCisjZGVmaW5lIENTVU1fUEFSQU1fRE1BSU5UX01BU0sgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIENTVU1fUEFSQU1fRE1BSU5UX1NISUZUICAgICAgICAgMTQKKyNkZWZpbmUgQ1NVTV9QQVJBTV9QS1RJTlRfTUFTSyAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ1NVTV9QQVJBTV9QS1RJTlRfU0hJRlQgICAgICAgICAxNQorI2RlZmluZSBDU1VNX1BBUkFNX1ZBTEFOVEFHX01BU0sgICAgICAgIDB4RkZGRgorI2RlZmluZSBDU1VNX1BBUkFNX1ZBTEFOX1NISUZUICAgICAgICAgIDE2CisKKy8qIGNzdW1wbCBkZWZpbmVzKi8KKyNkZWZpbmUgQ1NVTV9QQVJBTV9FT1BfTUFTSyAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ1NVTV9QQVJBTV9FT1BfU0hJRlQgICAgICAgICAgICAwCisjZGVmaW5lIENTVU1fUEFSQU1fQ09BTEVTQ0VfTUFTSyAgICAgICAgMHgwMDAxCisjZGVmaW5lIENTVU1fUEFSQU1fQ09BTEVTQ0VfU0hJRlQgICAgICAgMQorI2RlZmluZSBDU1VNX1BBUkFNX0lOU1ZMQUdfTUFTSyAgICAgICAgIDB4MDAwMQorI2RlZmluZSBDU1VNX1BBUkFNX0lOU1ZMQUdfU0hJRlQgICAgICAgIDIKKyNkZWZpbmUgQ1NVTV9QQVJBTV9DVVNUT01DS1NVTV9NQVNLICAgICAweDAwMDEKKyNkZWZpbmUgQ1NVTV9QQVJBTV9DVVNUT01DS1NVTV9TSElGVCAgICAzCisjZGVmaW5lIENTVU1fUEFSQU1fU0VHTUVOVF9NQVNLICAgICAgICAgMHgwMDAxCisjZGVmaW5lIENTVU1fUEFSQU1fU0VHTUVOVF9TSElGVCAgICAgICAgNAorI2RlZmluZSBDU1VNX1BBUkFNX0lQQ0tTVU1fTUFTSyAgICAgICAgIDB4MDAwMQorI2RlZmluZSBDU1VNX1BBUkFNX0lQQ0tTVU1fU0hJRlQgICAgICAgIDUKKyNkZWZpbmUgQ1NVTV9QQVJBTV9UQ1BDS1NVTV9NQVNLICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ1NVTV9QQVJBTV9UQ1BDS1NVTV9TSElGVCAgICAgICA2CisjZGVmaW5lIENTVU1fUEFSQU1fVURQQ0tTVU1fTUFTSyAgICAgICAgMHgwMDAxCisjZGVmaW5lIENTVU1fUEFSQU1fVURQQ0tTVU1fU0hJRlQgICAgICAgNworI2RlZmluZSBDU1VNX1BBUkFNX1ZMQU5UQUdHRURfTUFTSyAgICAgIDB4MDAwMQorI2RlZmluZSBDU1VNX1BBUkFNX1ZMQU5UQUdHRURfU0hJRlQgICAgIDgKKyNkZWZpbmUgQ1NVTV9QQVJBTV9FVEhUWVBFX01BU0sgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ1NVTV9QQVJBTV9FVEhUWVBFX1NISUZUICAgICAgICA5CisjZGVmaW5lIENTVU1fUEFSQU1fSVBITF9NQVNLICAgICAgICAgICAgMHgwMDBGCisjZGVmaW5lIENTVU1fUEFSQU1fSVBITF9TSElGVCAgICAgICAgICAgMTAKKyNkZWZpbmUgQ1NVTV9QQVJBTV9QTE9BRE9GRlNFVF9NQVNLICAgICAweDAwRkYKKyNkZWZpbmUgQ1NVTV9QQVJBTV9QTE9BRE9GRlNFVF9TSElGVCAgICAxNgorI2RlZmluZSBDU1VNX1BBUkFNX1hTVU1PRkZTRVRfTUFTSyAgICAgIDB4MDBGRgorI2RlZmluZSBDU1VNX1BBUkFNX1hTVU1PRkZTRVRfU0hJRlQgICAgIDI0CisKKy8qIFRQRCBkZXNjcmlwdG9yICovCitzdHJ1Y3QgdHNvX3BhcmFtIHsKKyAgICAgICAgLyogVGhlIG9yZGVyIG9mIHRoZXNlIGRlY2xhcmF0aW9ucyBpcyBpbXBvcnRhbnQgLS0gZG9uJ3QgY2hhbmdlIGl0ICovCisgICAgICAgIHUzMiB0c29wdTsgICAgICAvKiB0c29fcGFyYW0gdXBwZXIgd29yZCAqLworICAgICAgICB1MzIgdHNvcGw7ICAgICAgLyogdHNvX3BhcmFtIGxvd2VyIHdvcmQgKi8KK307CisKK3N0cnVjdCBjc3VtX3BhcmFtIHsKKyAgICAgICAgLyogVGhlIG9yZGVyIG9mIHRoZXNlIGRlY2xhcmF0aW9ucyBpcyBpbXBvcnRhbnQgLS0gZG9uJ3QgY2hhbmdlIGl0ICovCisgICAgICAgIHUzMiBjc3VtcHU7ICAgICAvKiBjc3VtX3BhcmFtIHVwcGVyIHdvcmQgKi8KKyAgICAgICAgdTMyIGNzdW1wbDsgICAgIC8qIGNzdW1fcGFyYW0gbG93ZXIgd29yZCAqLworfTsKKwordW5pb24gdHBkX2Rlc2NyIHsKKwl1NjQgZGF0YTsKKwlzdHJ1Y3QgY3N1bV9wYXJhbSBjc3VtOworCXN0cnVjdCB0c29fcGFyYW0gdHNvOworfTsKKworc3RydWN0IHR4X3BhY2tldF9kZXNjIHsKKwlfX2xlNjQgYnVmZmVyX2FkZHI7CisJdW5pb24gdHBkX2Rlc2NyIGRlc2M7Cit9OworCisvKiBETUEgT3JkZXIgU2V0dGluZ3MgKi8KK2VudW0gYXRsMV9kbWFfb3JkZXIgeworCWF0bDFfZG1hX29yZF9pbiA9IDEsCisJYXRsMV9kbWFfb3JkX2VuaCA9IDIsCisJYXRsMV9kbWFfb3JkX291dCA9IDQKK307CisKK2VudW0gYXRsMV9kbWFfcmNiIHsKKwlhdGwxX3JjYl82NCA9IDAsCisJYXRsMV9yY2JfMTI4ID0gMQorfTsKKworZW51bSBhdGwxX2RtYV9yZXFfYmxvY2sgeworCWF0bDFfZG1hX3JlcV8xMjggPSAwLAorCWF0bDFfZG1hX3JlcV8yNTYgPSAxLAorCWF0bDFfZG1hX3JlcV81MTIgPSAyLAorCWF0bDFfZGFtX3JlcV8xMDI0ID0gMywKKwlhdGwxX2RhbV9yZXFfMjA0OCA9IDQsCisJYXRsMV9kbWFfcmVxXzQwOTYgPSA1Cit9OworCitzdHJ1Y3QgYXRsMV9zcGlfZmxhc2hfZGV2IHsKKwljb25zdCBjaGFyICptYW51X25hbWU7CS8qIG1hbnVmYWN0dXJlciBpZCAqLworCS8qIG9wLWNvZGUgKi8KKwl1OCBjbWRfd3JzcjsKKwl1OCBjbWRfcmVhZDsKKwl1OCBjbWRfcHJvZ3JhbTsKKwl1OCBjbWRfd3JlbjsKKwl1OCBjbWRfd3JkaTsKKwl1OCBjbWRfcmRzcjsKKwl1OCBjbWRfcmRpZDsKKwl1OCBjbWRfc2VjdG9yX2VyYXNlOworCXU4IGNtZF9jaGlwX2VyYXNlOworfTsKKworI2VuZGlmCS8qIF9BVEwxX0hXX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU1NjQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX21haW4uYwpAQCAtMCwwICsxLDI0NjggQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMDYgQXR0YW5zaWMgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAwNiBDaHJpcyBTbm9vayA8Y3Nub29rQHJlZGhhdC5jb20+CisgKiBDb3B5cmlnaHQoYykgMjAwNiBKYXkgQ2xpYnVybiA8amNsaWJ1cm5AZ21haWwuY29tPgorICoKKyAqIERlcml2ZWQgZnJvbSBJbnRlbCBlMTAwMCBkcml2ZXIKKyAqIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIFhpb25nIEh1YW5nIDx4aW9uZ19odWFuZ0BhdHRhbnNpYy5jb20+CisgKiBBdHRhbnNpYyBUZWNobm9sb2d5IENvcnAuIDNGIDE0NywgWGlhbnpoZW5nIDl0aCBSb2FkLCBaaHViZWksCisgKiBYaW56aHUgIDMwMiwgVEFJV0FOLCBSRVBVQkxJQyBPRiBDSElOQQorICoKKyAqIENocmlzIFNub29rIDxjc25vb2tAcmVkaGF0LmNvbT4KKyAqIEpheSBDbGlidXJuIDxqY2xpYnVybkBnbWFpbC5jb20+CisgKgorICogVGhpcyB2ZXJzaW9uIGlzIGFkYXB0ZWQgZnJvbSB0aGUgQXR0YW5zaWMgcmVmZXJlbmNlIGRyaXZlciBmb3IKKyAqIGluY2x1c2lvbiBpbiB0aGUgTGludXgga2VybmVsLiAgSXQgaXMgY3VycmVudGx5IHVuZGVyIGhlYXZ5IGRldmVsb3BtZW50LgorICogQSB2ZXJ5IGluY29tcGxldGUgbGlzdCBvZiB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGRlYWx0IHdpdGg6CisgKgorICogVE9ETzoKKyAqIEZpeCBUU087IHR4IHBlcmZvcm1hbmNlIGlzIGhvcnJpYmxlIHdpdGggVFNPIGVuYWJsZWQuCisgKiBXYWtlIG9uIExBTi4KKyAqIEFkZCBtb3JlIGV0aHRvb2wgZnVuY3Rpb25zLCBpbmNsdWRpbmcgc2V0IHJpbmcgcGFyYW1ldGVycy4KKyAqIEZpeCBhYnN0cnVzZSBpcnEgZW5hYmxlL2Rpc2FibGUgY29uZGl0aW9uIGRlc2NyaWJlZCBoZXJlOgorICoJaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1saW51eC1uZXRkZXYmbT0xMTYzOTg1MDg1MDA1NTMmdz0yCisgKgorICogTkVFRFMgVEVTVElORzoKKyAqIFZMQU4KKyAqIG11bHRpY2FzdAorICogcHJvbWlzY3VvdXMgbW9kZQorICogaW50ZXJydXB0IGNvYWxlc2NpbmcKKyAqIFNNUCB0b3J0dXJlIHRlc3RpbmcKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICJhdGwxLmgiCisKKyNkZWZpbmUgUlVOX1JFQUxUSU1FIDAKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjIuMC42IgorCitjaGFyIGF0bDFfZHJpdmVyX25hbWVbXSA9ICJhdGwxIjsKK3N0YXRpYyBjb25zdCBjaGFyIGF0bDFfZHJpdmVyX3N0cmluZ1tdID0gIkF0dGFuc2ljIEwxIEV0aGVybmV0IE5ldHdvcmsgRHJpdmVyIjsKK3N0YXRpYyBjb25zdCBjaGFyIGF0bDFfY29weXJpZ2h0W10gPSAiQ29weXJpZ2h0KGMpIDIwMDUtMjAwNiBBdHRhbnNpYyBDb3Jwb3JhdGlvbi4iOworY2hhciBhdGwxX2RyaXZlcl92ZXJzaW9uW10gPSBEUklWRVJfVkVSU0lPTjsKKworTU9EVUxFX0FVVEhPUgorICAgICgiQXR0YW5zaWMgQ29ycG9yYXRpb24gPHhpb25nX2h1YW5nQGF0dGFuc2ljLmNvbT4sIENocmlzIFNub29rIDxjc25vb2tAcmVkaGF0LmNvbT4sIEpheSBDbGlidXJuIDxqY2xpYnVybkBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF0dGFuc2ljIDEwMDBNIEV0aGVybmV0IE5ldHdvcmsgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CisKKy8qCisgKiBhdGwxX3BjaV90YmwgLSBQQ0kgRGV2aWNlIElEIFRhYmxlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhdGwxX3BjaV90YmxbXSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FUVEFOU0lDLCAweDEwNDgpfSwKKwkvKiByZXF1aXJlZCBsYXN0IGVudHJ5ICovCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGF0bDFfcGNpX3RibCk7CisKKy8qCisgKiBhdGwxX3N3X2luaXQgLSBJbml0aWFsaXplIGdlbmVyYWwgc29mdHdhcmUgc3RydWN0dXJlcyAoc3RydWN0IGF0bDFfYWRhcHRlcikKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZSB0byBpbml0aWFsaXplCisgKgorICogYXRsMV9zd19pbml0IGluaXRpYWxpemVzIHRoZSBBZGFwdGVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUuCisgKiBGaWVsZHMgYXJlIGluaXRpYWxpemVkIGJhc2VkIG9uIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYW5kCisgKiBPUyBuZXR3b3JrIGRldmljZSBzZXR0aW5ncyAoTVRVIHNpemUpLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdGwxX3N3X2luaXQoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwkvKiBQQ0kgY29uZmlnIHNwYWNlIGluZm8gKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZody0+cmV2aXNpb25faWQpOworCisJaHctPm1heF9mcmFtZV9zaXplID0gbmV0ZGV2LT5tdHUgKyBFTkVUX0hFQURFUl9TSVpFICsgRVRIRVJORVRfRkNTX1NJWkU7CisJaHctPm1pbl9mcmFtZV9zaXplID0gTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFOworCisJYWRhcHRlci0+d29sID0gMDsKKwlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gKGh3LT5tYXhfZnJhbWVfc2l6ZSArIDcpICYgfjc7CisJYWRhcHRlci0+aWN0ID0gNTAwMDA7CS8qIDEwMG1zICovCisJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7CS8qIGhhcmR3YXJlIGluaXQgKi8KKwlhZGFwdGVyLT5saW5rX2R1cGxleCA9IEZVTExfRFVQTEVYOworCisJaHctPnBoeV9jb25maWd1cmVkID0gZmFsc2U7CisJaHctPnByZWFtYmxlX2xlbiA9IDc7CisJaHctPmlwZ3QgPSAweDYwOworCWh3LT5taW5faWZnID0gMHg1MDsKKwlody0+aXBncjEgPSAweDQwOworCWh3LT5pcGdyMiA9IDB4NjA7CisJaHctPm1heF9yZXRyeSA9IDB4ZjsKKwlody0+bGNvbCA9IDB4Mzc7CisJaHctPmphbV9pcGcgPSA3OworCWh3LT5yZmRfYnVyc3QgPSA4OworCWh3LT5ycmRfYnVyc3QgPSA4OworCWh3LT5yZmRfZmV0Y2hfZ2FwID0gMTsKKwlody0+cnhfanVtYm9fdGggPSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuIC8gODsKKwlody0+cnhfanVtYm9fbGthaCA9IDE7CisJaHctPnJyZF9yZXRfdGltZXIgPSAxNjsKKwlody0+dHBkX2J1cnN0ID0gNDsKKwlody0+dHBkX2ZldGNoX3RoID0gMTY7CisJaHctPnR4Zl9idXJzdCA9IDB4MTAwOworCWh3LT50eF9qdW1ib190YXNrX3RoID0gKGh3LT5tYXhfZnJhbWVfc2l6ZSArIDcpID4+IDM7CisJaHctPnRwZF9mZXRjaF9nYXAgPSAxOworCWh3LT5yY2JfdmFsdWUgPSBhdGwxX3JjYl82NDsKKwlody0+ZG1hX29yZCA9IGF0bDFfZG1hX29yZF9lbmg7CisJaHctPmRtYXJfYmxvY2sgPSBhdGwxX2RtYV9yZXFfMjU2OworCWh3LT5kbWF3X2Jsb2NrID0gYXRsMV9kbWFfcmVxXzI1NjsKKwlody0+Y21iX3JyZCA9IDQ7CisJaHctPmNtYl90cGQgPSA0OworCWh3LT5jbWJfcnhfdGltZXIgPSAxOwkvKiBhYm91dCAydXMgKi8KKwlody0+Y21iX3R4X3RpbWVyID0gMTsJLyogYWJvdXQgMnVzICovCisJaHctPnNtYl90aW1lciA9IDEwMDAwMDsJLyogYWJvdXQgMjAwbXMgKi8KKworCWF0b21pY19zZXQoJmFkYXB0ZXItPmlycV9zZW0sIDApOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bWJfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGF0bDFfc2V0dXBfbWVtX3Jlc291cmNlcyAtIGFsbG9jYXRlIFR4IC8gUlggZGVzY3JpcHRvciByZXNvdXJjZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworczMyIGF0bDFfc2V0dXBfcmluZ19yZXNvdXJjZXMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcgPSAmYWRhcHRlci0+dHBkX3Jpbmc7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOworCXN0cnVjdCBhdGwxX3JyZF9yaW5nICpycmRfcmluZyA9ICZhZGFwdGVyLT5ycmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9yaW5nX2hlYWRlciAqcmluZ19oZWFkZXIgPSAmYWRhcHRlci0+cmluZ19oZWFkZXI7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCWludCBzaXplOworCXU4IG9mZnNldCA9IDA7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdGwxX2J1ZmZlcikgKiAodHBkX3JpbmctPmNvdW50ICsgcmZkX3JpbmctPmNvdW50KTsKKwl0cGRfcmluZy0+YnVmZmVyX2luZm8gPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghdHBkX3JpbmctPmJ1ZmZlcl9pbmZvKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczoga3phbGxvYyBmYWlsZWQgLCBzaXplID0gRCVkXG4iLAorCQkJYXRsMV9kcml2ZXJfbmFtZSwgc2l6ZSk7CisJCWdvdG8gZXJyX25vbWVtOworCX0KKwlyZmRfcmluZy0+YnVmZmVyX2luZm8gPQorCSAgICAoc3RydWN0IGF0bDFfYnVmZmVyICopKHRwZF9yaW5nLT5idWZmZXJfaW5mbyArIHRwZF9yaW5nLT5jb3VudCk7CisKKwkvKiByZWFsIHJpbmcgRE1BIGJ1ZmZlciAqLworCXJpbmdfaGVhZGVyLT5zaXplID0gc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHhfcGFja2V0X2Rlc2MpICoKKwkJCQkJdHBkX3JpbmctPmNvdW50CisJICAgICsgc2l6ZW9mKHN0cnVjdCByeF9mcmVlX2Rlc2MpICogcmZkX3JpbmctPmNvdW50CisJICAgICsgc2l6ZW9mKHN0cnVjdCByeF9yZXR1cm5fZGVzYykgKiBycmRfcmluZy0+Y291bnQKKwkgICAgKyBzaXplb2Yoc3RydWN0IGNvYWxzX21zZ19ibG9jaykKKwkgICAgKyBzaXplb2Yoc3RydWN0IHN0YXRzX21zZ19ibG9jaykKKwkgICAgKyA0MDsJCS8qICI0MDogZm9yIDggYnl0ZXMgYWxpZ24iIGh1aD8gLS0gQ0hTICovCisKKwlyaW5nX2hlYWRlci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHJpbmdfaGVhZGVyLT5zaXplLAorCQkJCQkJJnJpbmdfaGVhZGVyLT5kbWEpOworCWlmICh1bmxpa2VseSghcmluZ19oZWFkZXItPmRlc2MpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogcGNpX2FsbG9jX2NvbnNpc3RlbnQgZmFpbGVkLCBzaXplID0gRCVkXG4iLAorCQkJYXRsMV9kcml2ZXJfbmFtZSwgc2l6ZSk7CisJCWdvdG8gZXJyX25vbWVtOworCX0KKworCW1lbXNldChyaW5nX2hlYWRlci0+ZGVzYywgMCwgcmluZ19oZWFkZXItPnNpemUpOworCisJLyogaW5pdCBUUEQgcmluZyAqLworCXRwZF9yaW5nLT5kbWEgPSByaW5nX2hlYWRlci0+ZG1hOworCW9mZnNldCA9ICh0cGRfcmluZy0+ZG1hICYgMHg3KSA/ICg4IC0gKHJpbmdfaGVhZGVyLT5kbWEgJiAweDcpKSA6IDA7CisJdHBkX3JpbmctPmRtYSArPSBvZmZzZXQ7CisJdHBkX3JpbmctPmRlc2MgPSAodTggKikgcmluZ19oZWFkZXItPmRlc2MgKyBvZmZzZXQ7CisJdHBkX3JpbmctPnNpemUgPSBzaXplb2Yoc3RydWN0IHR4X3BhY2tldF9kZXNjKSAqIHRwZF9yaW5nLT5jb3VudDsKKwlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b191c2UsIDApOworCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKKworCS8qIGluaXQgUkZEIHJpbmcgKi8KKwlyZmRfcmluZy0+ZG1hID0gdHBkX3JpbmctPmRtYSArIHRwZF9yaW5nLT5zaXplOworCW9mZnNldCA9IChyZmRfcmluZy0+ZG1hICYgMHg3KSA/ICg4IC0gKHJmZF9yaW5nLT5kbWEgJiAweDcpKSA6IDA7CisJcmZkX3JpbmctPmRtYSArPSBvZmZzZXQ7CisJcmZkX3JpbmctPmRlc2MgPSAodTggKikgdHBkX3JpbmctPmRlc2MgKyAodHBkX3JpbmctPnNpemUgKyBvZmZzZXQpOworCXJmZF9yaW5nLT5zaXplID0gc2l6ZW9mKHN0cnVjdCByeF9mcmVlX2Rlc2MpICogcmZkX3JpbmctPmNvdW50OworCXJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwkvKiByZmRfcmluZy0+bmV4dF90b191c2UgPSByZmRfcmluZy0+Y291bnQgLSAxOyAqLworCWF0b21pY19zZXQoJnJmZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7CisKKwkvKiBpbml0IFJSRCByaW5nICovCisJcnJkX3JpbmctPmRtYSA9IHJmZF9yaW5nLT5kbWEgKyByZmRfcmluZy0+c2l6ZTsKKwlvZmZzZXQgPSAocnJkX3JpbmctPmRtYSAmIDB4NykgPyAoOCAtIChycmRfcmluZy0+ZG1hICYgMHg3KSkgOiAwOworCXJyZF9yaW5nLT5kbWEgKz0gb2Zmc2V0OworCXJyZF9yaW5nLT5kZXNjID0gKHU4ICopIHJmZF9yaW5nLT5kZXNjICsgKHJmZF9yaW5nLT5zaXplICsgb2Zmc2V0KTsKKwlycmRfcmluZy0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MpICogcnJkX3JpbmctPmNvdW50OworCXJyZF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisJYXRvbWljX3NldCgmcnJkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworCisJLyogaW5pdCBDTUIgKi8KKwlhZGFwdGVyLT5jbWIuZG1hID0gcnJkX3JpbmctPmRtYSArIHJyZF9yaW5nLT5zaXplOworCW9mZnNldCA9IChhZGFwdGVyLT5jbWIuZG1hICYgMHg3KSA/ICg4IC0gKGFkYXB0ZXItPmNtYi5kbWEgJiAweDcpKSA6IDA7CisJYWRhcHRlci0+Y21iLmRtYSArPSBvZmZzZXQ7CisJYWRhcHRlci0+Y21iLmNtYiA9CisJICAgIChzdHJ1Y3QgY29hbHNfbXNnX2Jsb2NrICopICgodTggKikgcnJkX3JpbmctPmRlc2MgKworCQkJCSAgIChycmRfcmluZy0+c2l6ZSArIG9mZnNldCkpOworCisJLyogaW5pdCBTTUIgKi8KKwlhZGFwdGVyLT5zbWIuZG1hID0gYWRhcHRlci0+Y21iLmRtYSArIHNpemVvZihzdHJ1Y3QgY29hbHNfbXNnX2Jsb2NrKTsKKwlvZmZzZXQgPSAoYWRhcHRlci0+c21iLmRtYSAmIDB4NykgPyAoOCAtIChhZGFwdGVyLT5zbWIuZG1hICYgMHg3KSkgOiAwOworCWFkYXB0ZXItPnNtYi5kbWEgKz0gb2Zmc2V0OworCWFkYXB0ZXItPnNtYi5zbWIgPSAoc3RydWN0IHN0YXRzX21zZ19ibG9jayAqKQorCSAgICAoKHU4ICopIGFkYXB0ZXItPmNtYi5jbWIgKyAoc2l6ZW9mKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2spICsgb2Zmc2V0KSk7CisKKwlyZXR1cm4gQVRMMV9TVUNDRVNTOworCitlcnJfbm9tZW06CisJa2ZyZWUodHBkX3JpbmctPmJ1ZmZlcl9pbmZvKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIGF0bDFfaXJxX2VuYWJsZSAtIEVuYWJsZSBkZWZhdWx0IGludGVycnVwdCBnZW5lcmF0aW9uIHNldHRpbmdzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMV9pcnFfZW5hYmxlKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmYWRhcHRlci0+aXJxX3NlbSkpKQorCQlpb3dyaXRlMzIoSU1SX05PUk1BTF9NQVNLLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfY2xlYXJfcGh5X2ludChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXUxNiBwaHlfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlhdGwxX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIDE5LCAmcGh5X2RhdGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYXRsMV9pbmNfc21iKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHN0YXRzX21zZ19ibG9jayAqc21iID0gYWRhcHRlci0+c21iLnNtYjsKKworCS8qIEZpbGwgb3V0IHRoZSBPUyBzdGF0aXN0aWNzIHN0cnVjdHVyZSAqLworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfcGFja2V0cyArPSBzbWItPnJ4X29rOworCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfcGFja2V0cyArPSBzbWItPnR4X29rOworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfYnl0ZXMgKz0gc21iLT5yeF9ieXRlX2NudDsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2J5dGVzICs9IHNtYi0+dHhfYnl0ZV9jbnQ7CisJYWRhcHRlci0+c29mdF9zdGF0cy5tdWx0aWNhc3QgKz0gc21iLT5yeF9tY2FzdDsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLmNvbGxpc2lvbnMgKz0gKHNtYi0+dHhfMV9jb2wgKworCQkJCQkgICBzbWItPnR4XzJfY29sICogMiArCisJCQkJCSAgIHNtYi0+dHhfbGF0ZV9jb2wgKworCQkJCQkgICBzbWItPnR4X2Fib3J0X2NvbCAqCisJCQkJCSAgIGFkYXB0ZXItPmh3Lm1heF9yZXRyeSk7CisKKwkvKiBSeCBFcnJvcnMgKi8KKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2Vycm9ycyArPSAoc21iLT5yeF9mcmFnICsKKwkJCQkJICBzbWItPnJ4X2Zjc19lcnIgKworCQkJCQkgIHNtYi0+cnhfbGVuX2VyciArCisJCQkJCSAgc21iLT5yeF9zel9vdiArCisJCQkJCSAgc21iLT5yeF9yeGZfb3YgKworCQkJCQkgIHNtYi0+cnhfcnJkX292ICsgc21iLT5yeF9hbGlnbl9lcnIpOworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZmlmb19lcnJvcnMgKz0gc21iLT5yeF9yeGZfb3Y7CisJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9IHNtYi0+cnhfbGVuX2VycjsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2NyY19lcnJvcnMgKz0gc21iLT5yeF9mY3NfZXJyOworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IHNtYi0+cnhfYWxpZ25fZXJyOworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAoc21iLT5yeF9ycmRfb3YgKworCQkJCQkJIHNtYi0+cnhfcnhmX292KTsKKworCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfcGF1c2UgKz0gc21iLT5yeF9wYXVzZTsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X3JyZF9vdiArPSBzbWItPnJ4X3JyZF9vdjsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X3RydW5jICs9IHNtYi0+cnhfc3pfb3Y7CisKKwkvKiBUeCBFcnJvcnMgKi8KKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2Vycm9ycyArPSAoc21iLT50eF9sYXRlX2NvbCArCisJCQkJCSAgc21iLT50eF9hYm9ydF9jb2wgKworCQkJCQkgIHNtYi0+dHhfdW5kZXJydW4gKyBzbWItPnR4X3RydW5jKTsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzICs9IHNtYi0+dHhfdW5kZXJydW47CisJYWRhcHRlci0+c29mdF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSBzbWItPnR4X2Fib3J0X2NvbDsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMgKz0gc21iLT50eF9sYXRlX2NvbDsKKworCWFkYXB0ZXItPnNvZnRfc3RhdHMuZXhjZWNvbCArPSBzbWItPnR4X2Fib3J0X2NvbDsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLmRlZmZlciArPSBzbWItPnR4X2RlZmVyOworCWFkYXB0ZXItPnNvZnRfc3RhdHMuc2NjICs9IHNtYi0+dHhfMV9jb2w7CisJYWRhcHRlci0+c29mdF9zdGF0cy5tY2MgKz0gc21iLT50eF8yX2NvbDsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLmxhdGVjb2wgKz0gc21iLT50eF9sYXRlX2NvbDsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X3VuZGVydW4gKz0gc21iLT50eF91bmRlcnJ1bjsKKwlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X3RydW5jICs9IHNtYi0+dHhfdHJ1bmM7CisJYWRhcHRlci0+c29mdF9zdGF0cy50eF9wYXVzZSArPSBzbWItPnR4X3BhdXNlOworCisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X3BhY2tldHMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X3BhY2tldHM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X3BhY2tldHMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X3BhY2tldHM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2J5dGVzID0gYWRhcHRlci0+c29mdF9zdGF0cy5yeF9ieXRlczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfYnl0ZXMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2J5dGVzOworCWFkYXB0ZXItPm5ldF9zdGF0cy5tdWx0aWNhc3QgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLm11bHRpY2FzdDsKKwlhZGFwdGVyLT5uZXRfc3RhdHMuY29sbGlzaW9ucyA9IGFkYXB0ZXItPnNvZnRfc3RhdHMuY29sbGlzaW9uczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZXJyb3JzID0gYWRhcHRlci0+c29mdF9zdGF0cy5yeF9lcnJvcnM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzID0KKwkgICAgYWRhcHRlci0+c29mdF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0KKwkgICAgYWRhcHRlci0+c29mdF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzID0gYWRhcHRlci0+c29mdF9zdGF0cy5yeF9jcmNfZXJyb3JzOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0KKwkgICAgYWRhcHRlci0+c29mdF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2Vycm9yczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfZmlmb19lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9CisJICAgIGFkYXB0ZXItPnNvZnRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0KKwkgICAgYWRhcHRlci0+c29mdF9zdGF0cy50eF9jYXJyaWVyX2Vycm9yczsKK30KKworc3RhdGljIHZvaWQgYXRsMV9yeF9jaGVja3N1bShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyLAorCQkJCQlzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MgKnJyZCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisKKwlpZiAodW5saWtlbHkocnJkLT5wa3RfZmxnICYgUEFDS0VUX0ZMQUdfRVJSKSkgeworCQlpZiAocnJkLT5lcnJfZmxnICYgKEVSUl9GTEFHX0NSQyB8IEVSUl9GTEFHX1RSVU5DIHwKKwkJCQkJRVJSX0ZMQUdfQ09ERSB8IEVSUl9GTEFHX09WKSkgeworCQkJYWRhcHRlci0+aHdfY3N1bV9lcnIrKzsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcnggY2hlY2tzdW0gZXJyb3JcbiIsCisJCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBub3QgSVB2NCAqLworCWlmICghKHJyZC0+cGt0X2ZsZyAmIFBBQ0tFVF9GTEFHX0lQVjQpKQorCQkvKiBjaGVja3N1bSBpcyBpbnZhbGlkLCBidXQgaXQncyBub3QgYW4gSVB2NCBwa3QsIHNvIG9rICovCisJCXJldHVybjsKKworCS8qIElQdjQgcGFja2V0ICovCisJaWYgKGxpa2VseSghKHJyZC0+ZXJyX2ZsZyAmCisJCShFUlJfRkxBR19JUF9DSEtTVU0gfCBFUlJfRkxBR19MNF9DSEtTVU0pKSkpIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJYWRhcHRlci0+aHdfY3N1bV9nb29kKys7CisJCXJldHVybjsKKwl9CisKKwkvKiBJUHY0LCBidXQgaGFyZHdhcmUgdGhpbmtzIGl0cyBjaGVja3N1bSBpcyB3cm9uZyAqLworCXByaW50ayhLRVJOX0RFQlVHICIlczogaHcgY3N1bSB3cm9uZyBwa3RfZmxhZzoleCwgZXJyX2ZsYWc6JXhcbiIsCisJCWF0bDFfZHJpdmVyX25hbWUsIHJyZC0+cGt0X2ZsZywgcnJkLT5lcnJfZmxnKTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOworCXNrYi0+Y3N1bSA9IGh0b25zKHJyZC0+eHN6LnhzdW1fc3oucnhfY2hrc3VtKTsKKwlhZGFwdGVyLT5od19jc3VtX2VycisrOworCXJldHVybjsKK30KKworLyoKKyAqIGF0bDFfYWxsb2NfcnhfYnVmZmVycyAtIFJlcGxhY2UgdXNlZCByZWNlaXZlIGJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBhZGRyZXNzIG9mIGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB1MTYgYXRsMV9hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm8sICpuZXh0X2luZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MTYgbnVtX2FsbG9jID0gMDsKKwl1MTYgcmZkX25leHRfdG9fdXNlLCBuZXh0X25leHQ7CisJc3RydWN0IHJ4X2ZyZWVfZGVzYyAqcmZkX2Rlc2M7CisKKwluZXh0X25leHQgPSByZmRfbmV4dF90b191c2UgPSBhdG9taWNfcmVhZCgmcmZkX3JpbmctPm5leHRfdG9fdXNlKTsKKwlpZiAoKytuZXh0X25leHQgPT0gcmZkX3JpbmctPmNvdW50KQorCQluZXh0X25leHQgPSAwOworCWJ1ZmZlcl9pbmZvID0gJnJmZF9yaW5nLT5idWZmZXJfaW5mb1tyZmRfbmV4dF90b191c2VdOworCW5leHRfaW5mbyA9ICZyZmRfcmluZy0+YnVmZmVyX2luZm9bbmV4dF9uZXh0XTsKKworCXdoaWxlICghYnVmZmVyX2luZm8tPmFsbG9jZWQgJiYgIW5leHRfaW5mby0+YWxsb2NlZCkgeworCQlpZiAoYnVmZmVyX2luZm8tPnNrYikgeworCQkJYnVmZmVyX2luZm8tPmFsbG9jZWQgPSAxOworCQkJZ290byBuZXh0OworCQl9CisKKwkJcmZkX2Rlc2MgPSBBVEwxX1JGRF9ERVNDKHJmZF9yaW5nLCByZmRfbmV4dF90b191c2UpOworCisJCXNrYiA9IGRldl9hbGxvY19za2IoYWRhcHRlci0+cnhfYnVmZmVyX2xlbiArIE5FVF9JUF9BTElHTik7CisJCWlmICh1bmxpa2VseSghc2tiKSkgewkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kICovCisJCQlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBNYWtlIGJ1ZmZlciBhbGlnbm1lbnQgMiBiZXlvbmQgYSAxNiBieXRlIGJvdW5kYXJ5CisJCSAqIHRoaXMgd2lsbCByZXN1bHQgaW4gYSAxNiBieXRlIGFsaWduZWQgSVAgaGVhZGVyIGFmdGVyCisJCSAqIHRoZSAxNCBieXRlIE1BQyBoZWFkZXIgaXMgcmVtb3ZlZAorCQkgKi8KKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQlza2ItPmRldiA9IG5ldGRldjsKKworCQlidWZmZXJfaW5mby0+YWxsb2NlZCA9IDE7CisJCWJ1ZmZlcl9pbmZvLT5za2IgPSBza2I7CisJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPSAodTE2KSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuOworCQlwYWdlID0gdmlydF90b19wYWdlKHNrYi0+ZGF0YSk7CisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSAmIH5QQUdFX01BU0s7CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPSBwY2lfbWFwX3BhZ2UocGRldiwgcGFnZSwgb2Zmc2V0LAorCQkJCQkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiwKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCXJmZF9kZXNjLT5idWZmZXJfYWRkciA9IGNwdV90b19sZTY0KGJ1ZmZlcl9pbmZvLT5kbWEpOworCQlyZmRfZGVzYy0+YnVmX2xlbiA9IGNwdV90b19sZTE2KGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4pOworCQlyZmRfZGVzYy0+Y29hbGVzZSA9IDA7CisKK25leHQ6CisJCXJmZF9uZXh0X3RvX3VzZSA9IG5leHRfbmV4dDsKKwkJaWYgKHVubGlrZWx5KCsrbmV4dF9uZXh0ID09IHJmZF9yaW5nLT5jb3VudCkpCisJCQluZXh0X25leHQgPSAwOworCisJCWJ1ZmZlcl9pbmZvID0gJnJmZF9yaW5nLT5idWZmZXJfaW5mb1tyZmRfbmV4dF90b191c2VdOworCQluZXh0X2luZm8gPSAmcmZkX3JpbmctPmJ1ZmZlcl9pbmZvW25leHRfbmV4dF07CisJCW51bV9hbGxvYysrOworCX0KKworCWlmIChudW1fYWxsb2MpIHsKKwkJLyoKKwkJICogRm9yY2UgbWVtb3J5IHdyaXRlcyB0byBjb21wbGV0ZSBiZWZvcmUgbGV0dGluZyBoL3cKKwkJICoga25vdyB0aGVyZSBhcmUgbmV3IGRlc2NyaXB0b3JzIHRvIGZldGNoLiAgKE9ubHkKKwkJICogYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocywKKwkJICogc3VjaCBhcyBJQS02NCkuCisJCSAqLworCQl3bWIoKTsKKwkJYXRvbWljX3NldCgmcmZkX3JpbmctPm5leHRfdG9fdXNlLCAoaW50KXJmZF9uZXh0X3RvX3VzZSk7CisJfQorCXJldHVybiBudW1fYWxsb2M7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfaW50cl9yeChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpLCBjb3VudDsKKwl1MTYgbGVuZ3RoOworCXUxNiBycmRfbmV4dF90b19jbGVhbjsKKwl1MzIgdmFsdWU7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOworCXN0cnVjdCBhdGwxX3JyZF9yaW5nICpycmRfcmluZyA9ICZhZGFwdGVyLT5ycmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXN0cnVjdCByeF9yZXR1cm5fZGVzYyAqcnJkOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwljb3VudCA9IDA7CisKKwlycmRfbmV4dF90b19jbGVhbiA9IGF0b21pY19yZWFkKCZycmRfcmluZy0+bmV4dF90b19jbGVhbik7CisKKwl3aGlsZSAoMSkgeworCQlycmQgPSBBVEwxX1JSRF9ERVNDKHJyZF9yaW5nLCBycmRfbmV4dF90b19jbGVhbik7CisJCWkgPSAxOworCQlpZiAobGlrZWx5KHJyZC0+eHN6LnZhbGlkKSkgewkvKiBwYWNrZXQgdmFsaWQgKi8KK2Noa19ycmQ6CisJCQkvKiBjaGVjayBycmQgc3RhdHVzICovCisJCQlpZiAobGlrZWx5KHJyZC0+bnVtX2J1ZiA9PSAxKSkKKwkJCQlnb3RvIHJyZF9vazsKKworCQkJLyogcnJkIHNlZW1zIHRvIGJlIGJhZCAqLworCQkJaWYgKHVubGlrZWx5KGktLSA+IDApKSB7CisJCQkJLyogcnJkIG1heSBub3QgYmUgRE1BZWQgY29tcGxldGVseSAqLworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJCSIlczogUlJEIG1heSBub3QgYmUgRE1BZWQgY29tcGxldGVseVxuIiwKKwkJCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCQkJdWRlbGF5KDEpOworCQkJCWdvdG8gY2hrX3JyZDsKKwkJCX0KKwkJCS8qIGJhZCBycmQgKi8KKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYmFkIFJSRFxuIiwgYXRsMV9kcml2ZXJfbmFtZSk7CisJCQkvKiBzZWUgaWYgdXBkYXRlIFJGRCBpbmRleCAqLworCQkJaWYgKHJyZC0+bnVtX2J1ZiA+IDEpIHsKKwkJCQl1MTYgbnVtX2J1ZjsKKwkJCQludW1fYnVmID0KKwkJCQkgICAgKHJyZC0+eHN6LnhzdW1fc3oucGt0X3NpemUgKworCQkJCSAgICAgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiAtCisJCQkJICAgICAxKSAvIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CisJCQkJaWYgKHJyZC0+bnVtX2J1ZiA9PSBudW1fYnVmKSB7CisJCQkJCS8qIGNsZWFuIGFsbG9jIGZsYWcgZm9yIGJhZCBycmQgKi8KKwkJCQkJd2hpbGUgKHJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuICE9CisJCQkJCSAgICAgICAocnJkLT5idWZfaW5keCArIG51bV9idWYpKSB7CisJCQkJCQlyZmRfcmluZy0+YnVmZmVyX2luZm9bcmZkX3JpbmctPgorCQkJCQkJCQkgICAgICBuZXh0X3RvX2NsZWFuXS5hbGxvY2VkID0gMDsKKwkJCQkJCWlmICgrK3JmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID09CisJCQkJCQkgICAgcmZkX3JpbmctPmNvdW50KSB7CisJCQkJCQkJcmZkX3JpbmctPgorCQkJCQkJCSAgICBuZXh0X3RvX2NsZWFuID0gMDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLyogdXBkYXRlIHJyZCAqLworCQkJcnJkLT54c3oudmFsaWQgPSAwOworCQkJaWYgKCsrcnJkX25leHRfdG9fY2xlYW4gPT0gcnJkX3JpbmctPmNvdW50KQorCQkJCXJyZF9uZXh0X3RvX2NsZWFuID0gMDsKKwkJCWNvdW50Kys7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsJLyogY3VycmVudCBycmQgc3RpbGwgbm90IGJlIHVwZGF0ZWQgKi8KKworCQkJYnJlYWs7CisJCX0KK3JyZF9vazoKKwkJLyogY2xlYW4gYWxsb2MgZmxhZyBmb3IgYmFkIHJyZCAqLworCQl3aGlsZSAocmZkX3JpbmctPm5leHRfdG9fY2xlYW4gIT0gcnJkLT5idWZfaW5keCkgeworCQkJcmZkX3JpbmctPmJ1ZmZlcl9pbmZvW3JmZF9yaW5nLT5uZXh0X3RvX2NsZWFuXS5hbGxvY2VkID0KKwkJCSAgICAwOworCQkJaWYgKCsrcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPT0gcmZkX3JpbmctPmNvdW50KQorCQkJCXJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwkJfQorCisJCWJ1ZmZlcl9pbmZvID0gJnJmZF9yaW5nLT5idWZmZXJfaW5mb1tycmQtPmJ1Zl9pbmR4XTsKKwkJaWYgKCsrcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPT0gcmZkX3JpbmctPmNvdW50KQorCQkJcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCisJCS8qIHVwZGF0ZSBycmQgbmV4dCB0byBjbGVhbiAqLworCQlpZiAoKytycmRfbmV4dF90b19jbGVhbiA9PSBycmRfcmluZy0+Y291bnQpCisJCQlycmRfbmV4dF90b19jbGVhbiA9IDA7CisJCWNvdW50Kys7CisKKwkJaWYgKHVubGlrZWx5KHJyZC0+cGt0X2ZsZyAmIFBBQ0tFVF9GTEFHX0VSUikpIHsKKwkJCWlmICghKHJyZC0+ZXJyX2ZsZyAmCisJCQkJKEVSUl9GTEFHX0lQX0NIS1NVTSB8IEVSUl9GTEFHX0w0X0NIS1NVTQorCQkJCXwgRVJSX0ZMQUdfTEVOKSkpIHsKKwkJCQkvKiBwYWNrZXQgZXJyb3IsIGRvbid0IG5lZWQgdXBzdHJlYW0gKi8KKwkJCQlidWZmZXJfaW5mby0+YWxsb2NlZCA9IDA7CisJCQkJcnJkLT54c3oudmFsaWQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogR29vZCBSZWNlaXZlICovCisJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkgICAgICAgYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJc2tiID0gYnVmZmVyX2luZm8tPnNrYjsKKwkJbGVuZ3RoID0gbGUxNl90b19jcHUocnJkLT54c3oueHN1bV9zei5wa3Rfc2l6ZSk7CisKKwkJc2tiX3B1dChza2IsIGxlbmd0aCAtIEVUSEVSTkVUX0ZDU19TSVpFKTsKKworCQkvKiBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgKi8KKwkJYXRsMV9yeF9jaGVja3N1bShhZGFwdGVyLCBycmQsIHNrYik7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGFkYXB0ZXItPm5ldGRldik7CisKKwkJaWYgKGFkYXB0ZXItPnZsZ3JwICYmIChycmQtPnBrdF9mbGcgJiBQQUNLRVRfRkxBR19WTEFOX0lOUykpIHsKKwkJCXUxNiB2bGFuX3RhZyA9IChycmQtPnZsYW5fdGFnID4+IDQpIHwKKwkJCQkJKChycmQtPnZsYW5fdGFnICYgNykgPDwgMTMpIHwKKwkJCQkJKChycmQtPnZsYW5fdGFnICYgOCkgPDwgOSk7CisJCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBhZGFwdGVyLT52bGdycCwgdmxhbl90YWcpOworCQl9IGVsc2UKKwkJCW5ldGlmX3J4KHNrYik7CisKKwkJLyogbGV0IHByb3RvY29sIGxheWVyIGZyZWUgc2tiICovCisJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCQlidWZmZXJfaW5mby0+YWxsb2NlZCA9IDA7CisJCXJyZC0+eHN6LnZhbGlkID0gMDsKKworCQlhZGFwdGVyLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCX0KKworCWF0b21pY19zZXQoJnJyZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCBycmRfbmV4dF90b19jbGVhbik7CisKKwlhdGwxX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlcik7CisKKwkvKiB1cGRhdGUgbWFpbGJveCA/ICovCisJaWYgKGNvdW50KSB7CisJCXUzMiB0cGRfbmV4dF90b191c2U7CisJCXUzMiByZmRfbmV4dF90b191c2U7CisJCXUzMiBycmRfbmV4dF90b19jbGVhbjsKKworCQlzcGluX2xvY2soJmFkYXB0ZXItPm1iX2xvY2spOworCisJCXRwZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT50cGRfcmluZy5uZXh0X3RvX3VzZSk7CisJCXJmZF9uZXh0X3RvX3VzZSA9CisJCSAgICBhdG9taWNfcmVhZCgmYWRhcHRlci0+cmZkX3JpbmcubmV4dF90b191c2UpOworCQlycmRfbmV4dF90b19jbGVhbiA9CisJCSAgICBhdG9taWNfcmVhZCgmYWRhcHRlci0+cnJkX3JpbmcubmV4dF90b19jbGVhbik7CisJCXZhbHVlID0gKChyZmRfbmV4dF90b191c2UgJiBNQl9SRkRfUFJPRF9JTkRYX01BU0spIDw8CisJCQlNQl9SRkRfUFJPRF9JTkRYX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKHJyZF9uZXh0X3RvX2NsZWFuICYgTUJfUlJEX0NPTlNfSU5EWF9NQVNLKSA8PAorCQkJTUJfUlJEX0NPTlNfSU5EWF9TSElGVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKCh0cGRfbmV4dF90b191c2UgJiBNQl9UUERfUFJPRF9JTkRYX01BU0spIDw8CisJCQlNQl9UUERfUFJPRF9JTkRYX1NISUZUKTsKKwkJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BSUxCT1gpOworCQlzcGluX3VubG9jaygmYWRhcHRlci0+bWJfbG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdGwxX2ludHJfdHgoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcgPSAmYWRhcHRlci0+dHBkX3Jpbmc7CisJc3RydWN0IGF0bDFfYnVmZmVyICpidWZmZXJfaW5mbzsKKwl1MTYgc3dfdHBkX25leHRfdG9fY2xlYW47CisJdTE2IGNtYl90cGRfbmV4dF90b19jbGVhbjsKKwl1OCB1cGRhdGUgPSAwOworCisJc3dfdHBkX25leHRfdG9fY2xlYW4gPSBhdG9taWNfcmVhZCgmdHBkX3JpbmctPm5leHRfdG9fY2xlYW4pOworCWNtYl90cGRfbmV4dF90b19jbGVhbiA9IGxlMTZfdG9fY3B1KGFkYXB0ZXItPmNtYi5jbWItPnRwZF9jb25zX2lkeCk7CisKKwl3aGlsZSAoY21iX3RwZF9uZXh0X3RvX2NsZWFuICE9IHN3X3RwZF9uZXh0X3RvX2NsZWFuKSB7CisJCXN0cnVjdCB0eF9wYWNrZXRfZGVzYyAqdHBkOworCQl1cGRhdGUgPSAxOworCQl0cGQgPSBBVEwxX1RQRF9ERVNDKHRwZF9yaW5nLCBzd190cGRfbmV4dF90b19jbGVhbik7CisJCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1tzd190cGRfbmV4dF90b19jbGVhbl07CisJCWlmIChidWZmZXJfaW5mby0+ZG1hKSB7CisJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBidWZmZXJfaW5mby0+ZG1hLAorCQkJCSAgICAgICBidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOworCQl9CisKKwkJaWYgKGJ1ZmZlcl9pbmZvLT5za2IpIHsKKwkJCWRldl9rZnJlZV9za2JfaXJxKGJ1ZmZlcl9pbmZvLT5za2IpOworCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCX0KKwkJdHBkLT5idWZmZXJfYWRkciA9IDA7CisJCXRwZC0+ZGVzYy5kYXRhID0gMDsKKworCQlpZiAoKytzd190cGRfbmV4dF90b19jbGVhbiA9PSB0cGRfcmluZy0+Y291bnQpCisJCQlzd190cGRfbmV4dF90b19jbGVhbiA9IDA7CisJfQorCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCBzd190cGRfbmV4dF90b19jbGVhbik7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChhZGFwdGVyLT5uZXRkZXYpCisJICAgICYmIG5ldGlmX2NhcnJpZXJfb2soYWRhcHRlci0+bmV0ZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOworfQorCitzdGF0aWMgdm9pZCBhdGwxX2NoZWNrX2Zvcl9saW5rKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwl1MTYgcGh5X2RhdGEgPSAwOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwlhZGFwdGVyLT5waHlfdGltZXJfcGVuZGluZyA9IGZhbHNlOworCWF0bDFfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgTUlJX0JNU1IsICZwaHlfZGF0YSk7CisJYXRsMV9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKKwkvKiBub3RpZnkgdXBwZXIgbGF5ZXIgbGluayBkb3duIEFTQVAgKi8KKwlpZiAoIShwaHlfZGF0YSAmIEJNU1JfTFNUQVRVUykpIHsJLyogTGluayBEb3duICovCisJCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsJLyogb2xkIGxpbmsgc3RhdGU6IFVwICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgbGluayBpcyBkb3duXG4iLAorCQkJICAgICAgIGF0bDFfZHJpdmVyX25hbWUsIG5ldGRldi0+bmFtZSk7CisJCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMDsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCX0KKwl9CisJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+bGlua19jaGdfdGFzayk7Cit9CisKKy8qCisgKiBhdGwxX2ludHIgLSBJbnRlcnJ1cHQgSGFuZGxlcgorICogQGlycTogaW50ZXJydXB0IG51bWJlcgorICogQGRhdGE6IHBvaW50ZXIgdG8gYSBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcHRfcmVnczogQ1BVIHJlZ2lzdGVycyBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGlycXJldHVybl90IGF0bDFfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCS8qc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9ICgoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKS0+cHJpdjsqLworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkYXRhKTsKKwl1MzIgc3RhdHVzOworCXU4IHVwZGF0ZV9yeDsKKwlpbnQgbWF4X2ludHMgPSAxMDsKKworCXN0YXR1cyA9IGFkYXB0ZXItPmNtYi5jbWItPmludF9zdGF0czsKKwlpZiAoIXN0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCisJdXBkYXRlX3J4ID0gMDsKKworCWRvIHsKKwkJLyogY2xlYXIgQ01CIGludGVycnVwdCBzdGF0dXMgYXQgb25jZSAqLworCQlhZGFwdGVyLT5jbWIuY21iLT5pbnRfc3RhdHMgPSAwOworCisJCWlmIChzdGF0dXMgJiBJU1JfR1BIWSkJLyogY2xlYXIgcGh5IHN0YXR1cyAqLworCQkJYXRsMV9jbGVhcl9waHlfaW50KGFkYXB0ZXIpOworCisJCS8qIGNsZWFyIElTUiBzdGF0dXMsIGFuZCBFbmFibGUgQ01CIERNQS9EaXNhYmxlIEludGVycnVwdCAqLworCQlpb3dyaXRlMzIoc3RhdHVzIHwgSVNSX0RJU19JTlQsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKworCQkvKiBjaGVjayBpZiBTTUIgaW50ciAqLworCQlpZiAoc3RhdHVzICYgSVNSX1NNQikKKwkJCWF0bDFfaW5jX3NtYihhZGFwdGVyKTsKKworCQkvKiBjaGVjayBpZiBQQ0lFIFBIWSBMaW5rIGRvd24gKi8KKwkJaWYgKHN0YXR1cyAmIElTUl9QSFlfTElOS0RPV04pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcGNpZSBwaHkgbGluayBkb3duICV4XG4iLAorCQkJCWF0bDFfZHJpdmVyX25hbWUsIHN0YXR1cyk7CisJCQlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CS8qIHJlc2V0IE1BQyAqLworCQkJCWlvd3JpdGUzMigwLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7CisJCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cGNpZV9kbWFfdG9fcnN0X3Rhc2spOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJfQorCisJCS8qIGNoZWNrIGlmIERNQSByZWFkL3dyaXRlIGVycm9yID8gKi8KKwkJaWYgKHN0YXR1cyAmIChJU1JfRE1BUl9UT19SU1QgfCBJU1JfRE1BV19UT19SU1QpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSIlczogcGNpZSBETUEgci93IGVycm9yIChzdGF0dXMgPSAweCV4KVxuIiwKKwkJCQlhdGwxX2RyaXZlcl9uYW1lLCBzdGF0dXMpOworCQkJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwkJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnBjaWVfZG1hX3RvX3JzdF90YXNrKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCisJCS8qIGxpbmsgZXZlbnQgKi8KKwkJaWYgKHN0YXR1cyAmIElTUl9HUEhZKSB7CisJCQlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlhdGwxX2NoZWNrX2Zvcl9saW5rKGFkYXB0ZXIpOworCQl9CisKKwkJLyogdHJhbnNtaXQgZXZlbnQgKi8KKwkJaWYgKHN0YXR1cyAmIElTUl9DTUJfVFgpCisJCQlhdGwxX2ludHJfdHgoYWRhcHRlcik7CisKKwkJLyogcnggZXhjZXB0aW9uICovCisJCWlmICh1bmxpa2VseShzdGF0dXMgJiAoSVNSX1JYRl9PViB8IElTUl9SRkRfVU5SVU4gfAorCQkJCUlTUl9SUkRfT1YgfCBJU1JfSE9TVF9SRkRfVU5SVU4gfAorCQkJCUlTUl9IT1NUX1JSRF9PViB8IElTUl9DTUJfUlgpKSkgeworCQkJaWYgKHN0YXR1cyAmCisJCQkgICAgKElTUl9SWEZfT1YgfCBJU1JfUkZEX1VOUlVOIHwgSVNSX1JSRF9PViB8CisJCQkgICAgIElTUl9IT1NUX1JGRF9VTlJVTiB8IElTUl9IT1NUX1JSRF9PVikpCisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiJXM6IHJ4IGV4Y2VwdGlvbjogc3RhdHVzID0gMHgleFxuIiwKKwkJCQkJYXRsMV9kcml2ZXJfbmFtZSwgc3RhdHVzKTsKKwkJCWF0bDFfaW50cl9yeChhZGFwdGVyKTsKKwkJfQorCisJCWlmICgtLW1heF9pbnRzIDwgMCkKKwkJCWJyZWFrOworCisJfSB3aGlsZSAoKHN0YXR1cyA9IGFkYXB0ZXItPmNtYi5jbWItPmludF9zdGF0cykpOworCisJLyogcmUtZW5hYmxlIEludGVycnVwdCAqLworCWlvd3JpdGUzMihJU1JfRElTX1NNQiB8IElTUl9ESVNfRE1BLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogYXRsMV9zZXRfbXVsdGkgLSBNdWx0aWNhc3QgYW5kIFByb21pc2N1b3VzIG1vZGUgc2V0CisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhlIHNldF9tdWx0aSBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIG11bHRpY2FzdCBhZGRyZXNzCisgKiBsaXN0IG9yIHRoZSBuZXR3b3JrIGludGVyZmFjZSBmbGFncyBhcmUgdXBkYXRlZC4gIFRoaXMgcm91dGluZSBpcworICogcmVzcG9uc2libGUgZm9yIGNvbmZpZ3VyaW5nIHRoZSBoYXJkd2FyZSBmb3IgcHJvcGVyIG11bHRpY2FzdCwKKyAqIHByb21pc2N1b3VzIG1vZGUsIGFuZCBhbGwtbXVsdGkgYmVoYXZpb3IuCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfcHRyOworCXUzMiByY3RsOworCXUzMiBoYXNoX3ZhbHVlOworCisJLyogQ2hlY2sgZm9yIFByb21pc2N1b3VzIGFuZCBBbGwgTXVsdGljYXN0IG1vZGVzICovCisJcmN0bCA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlyY3RsIHw9IE1BQ19DVFJMX1BST01JU19FTjsKKwllbHNlIGlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCXJjdGwgfD0gTUFDX0NUUkxfTUNfQUxMX0VOOworCQlyY3RsICY9IH5NQUNfQ1RSTF9QUk9NSVNfRU47CisJfSBlbHNlCisJCXJjdGwgJj0gfihNQUNfQ1RSTF9QUk9NSVNfRU4gfCBNQUNfQ1RSTF9NQ19BTExfRU4pOworCisJaW93cml0ZTMyKHJjdGwsIGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKworCS8qIGNsZWFyIHRoZSBvbGQgc2V0dGluZ3MgZnJvbSB0aGUgbXVsdGljYXN0IGhhc2ggdGFibGUgKi8KKwlpb3dyaXRlMzIoMCwgaHctPmh3X2FkZHIgKyBSRUdfUlhfSEFTSF9UQUJMRSk7CisJaW93cml0ZTMyKDAsIChody0+aHdfYWRkciArIFJFR19SWF9IQVNIX1RBQkxFKSArICgxIDw8IDIpKTsKKworCS8qIGNvbXB1dGUgbWMgYWRkcmVzc2VzJyBoYXNoIHZhbHVlICxhbmQgcHV0IGl0IGludG8gaGFzaCB0YWJsZSAqLworCWZvciAobWNfcHRyID0gbmV0ZGV2LT5tY19saXN0OyBtY19wdHI7IG1jX3B0ciA9IG1jX3B0ci0+bmV4dCkgeworCQloYXNoX3ZhbHVlID0gYXRsMV9oYXNoX21jX2FkZHIoaHcsIG1jX3B0ci0+ZG1pX2FkZHIpOworCQlhdGwxX2hhc2hfc2V0KGh3LCBoYXNoX3ZhbHVlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfc2V0dXBfbWFjX2N0cmwoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgdmFsdWU7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJLyogQ29uZmlnIE1BQyBDVFJMIFJlZ2lzdGVyICovCisJdmFsdWUgPSBNQUNfQ1RSTF9UWF9FTiB8IE1BQ19DVFJMX1JYX0VOOworCS8qIGR1cGxleCAqLworCWlmIChGVUxMX0RVUExFWCA9PSBhZGFwdGVyLT5saW5rX2R1cGxleCkKKwkJdmFsdWUgfD0gTUFDX0NUUkxfRFVQTFg7CisJLyogc3BlZWQgKi8KKwl2YWx1ZSB8PSAoKHUzMikgKChTUEVFRF8xMDAwID09IGFkYXB0ZXItPmxpbmtfc3BlZWQpID8KKwkJCSBNQUNfQ1RSTF9TUEVFRF8xMDAwIDogTUFDX0NUUkxfU1BFRURfMTBfMTAwKSA8PAorCQkgIE1BQ19DVFJMX1NQRUVEX1NISUZUKTsKKwkvKiBmbG93IGNvbnRyb2wgKi8KKwl2YWx1ZSB8PSAoTUFDX0NUUkxfVFhfRkxPVyB8IE1BQ19DVFJMX1JYX0ZMT1cpOworCS8qIFBBRCAmIENSQyAqLworCXZhbHVlIHw9IChNQUNfQ1RSTF9BRERfQ1JDIHwgTUFDX0NUUkxfUEFEKTsKKwkvKiBwcmVhbWJsZSBsZW5ndGggKi8KKwl2YWx1ZSB8PSAoKCh1MzIpIGFkYXB0ZXItPmh3LnByZWFtYmxlX2xlbgorCQkgICAmIE1BQ19DVFJMX1BSTUxFTl9NQVNLKSA8PCBNQUNfQ1RSTF9QUk1MRU5fU0hJRlQpOworCS8qIHZsYW4gKi8KKwlpZiAoYWRhcHRlci0+dmxncnApCisJCXZhbHVlIHw9IE1BQ19DVFJMX1JNVl9WTEFOOworCS8qIHJ4IGNoZWNrc3VtCisJICAgaWYgKGFkYXB0ZXItPnJ4X2NzdW0pCisJICAgdmFsdWUgfD0gTUFDX0NUUkxfUlhfQ0hLU1VNX0VOOworCSAqLworCS8qIGZpbHRlciBtb2RlICovCisJdmFsdWUgfD0gTUFDX0NUUkxfQkNfRU47CisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJdmFsdWUgfD0gTUFDX0NUUkxfUFJPTUlTX0VOOworCWVsc2UgaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCXZhbHVlIHw9IE1BQ19DVFJMX01DX0FMTF9FTjsKKwkvKiB2YWx1ZSB8PSBNQUNfQ1RSTF9MT09QQkFDSzsgKi8KKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKK30KKworc3RhdGljIHUzMiBhdGwxX2NoZWNrX2xpbmsoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwl1MzIgcmV0X3ZhbDsKKwl1MTYgc3BlZWQsIGR1cGxleCwgcGh5X2RhdGE7CisJaW50IHJlY29uZmlnID0gMDsKKworCS8qIE1JSV9CTVNSIG11c3QgcmVhZCB0d2ljZSAqLworCWF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlhdGwxX3JlYWRfcGh5X3JlZyhodywgTUlJX0JNU1IsICZwaHlfZGF0YSk7CisJaWYgKCEocGh5X2RhdGEgJiBCTVNSX0xTVEFUVVMpKSB7CS8qIGxpbmsgZG93biAqLworCQlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CS8qIG9sZCBsaW5rIHN0YXRlOiBVcCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgaXMgZG93blxuIiwKKwkJCQlhdGwxX2RyaXZlcl9uYW1lKTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOworCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJfQorCQlyZXR1cm4gQVRMMV9TVUNDRVNTOworCX0KKworCS8qIExpbmsgVXAgKi8KKwlyZXRfdmFsID0gYXRsMV9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKKwlpZiAocmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7CisJY2FzZSBNRURJQV9UWVBFXzEwMDBNX0ZVTEw6CisJCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMCB8fCBkdXBsZXggIT0gRlVMTF9EVVBMRVgpCisJCQlyZWNvbmZpZyA9IDE7CisJCWJyZWFrOworCWNhc2UgTUVESUFfVFlQRV8xMDBNX0hBTEY6CisJCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAgfHwgZHVwbGV4ICE9IEhBTEZfRFVQTEVYKQorCQkJcmVjb25maWcgPSAxOworCQlicmVhazsKKwljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6CisJCWlmIChzcGVlZCAhPSBTUEVFRF8xMCB8fCBkdXBsZXggIT0gRlVMTF9EVVBMRVgpCisJCQlyZWNvbmZpZyA9IDE7CisJCWJyZWFrOworCWNhc2UgTUVESUFfVFlQRV8xME1fSEFMRjoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwIHx8IGR1cGxleCAhPSBIQUxGX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJfQorCisJLyogbGluayByZXN1bHQgaXMgb3VyIHNldHRpbmcgKi8KKwlpZiAoIXJlY29uZmlnKSB7CisJCWlmIChhZGFwdGVyLT5saW5rX3NwZWVkICE9IHNwZWVkCisJCSAgICB8fCBhZGFwdGVyLT5saW5rX2R1cGxleCAhPSBkdXBsZXgpIHsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBzcGVlZDsKKwkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gZHVwbGV4OworCQkJYXRsMV9zZXR1cF9tYWNfY3RybChhZGFwdGVyKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIGlzIHVwICVkIE1icHMgJXNcbiIsCisJCQkgICAgICAgYXRsMV9kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lLAorCQkJICAgICAgIGFkYXB0ZXItPmxpbmtfc3BlZWQsCisJCQkgICAgICAgYWRhcHRlci0+bGlua19kdXBsZXggPT0KKwkJCSAgICAgICBGVUxMX0RVUExFWCA/ICJmdWxsIGR1cGxleCIgOiAiaGFsZiBkdXBsZXgiKTsKKwkJfQorCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewkvKiBMaW5rIGRvd24gLT4gVXAgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKKwkJfQorCQlyZXR1cm4gQVRMMV9TVUNDRVNTOworCX0KKworCS8qIGNoYW5nZSBvcmlnbmFsIGxpbmsgc3RhdHVzICovCisJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMDsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCX0KKworCWlmIChody0+bWVkaWFfdHlwZSAhPSBNRURJQV9UWVBFX0FVVE9fU0VOU09SICYmCisJICAgIGh3LT5tZWRpYV90eXBlICE9IE1FRElBX1RZUEVfMTAwME1fRlVMTCkgeworCQlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7CisJCWNhc2UgTUVESUFfVFlQRV8xMDBNX0ZVTEw6CisJCQlwaHlfZGF0YSA9IE1JSV9DUl9GVUxMX0RVUExFWCB8IE1JSV9DUl9TUEVFRF8xMDAgfAorCQkJICAgICAgICAgICBNSUlfQ1JfUkVTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKKwkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwMCB8IE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6CisJCQlwaHlfZGF0YSA9CisJCQkgICAgTUlJX0NSX0ZVTExfRFVQTEVYIHwgTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIE1FRElBX1RZUEVfMTBNX0hBTEY6ICovCisJCQlwaHlfZGF0YSA9IE1JSV9DUl9TUEVFRF8xMCB8IE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQl9CisJCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIHBoeV9kYXRhKTsKKwkJcmV0dXJuIEFUTDFfU1VDQ0VTUzsKKwl9CisKKwkvKiBhdXRvLW5lZywgaW5zZXJ0IHRpbWVyIHRvIHJlLWNvbmZpZyBwaHkgKi8KKwlpZiAoIWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nKSB7CisJCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gdHJ1ZTsKKwkJbW9kX3RpbWVyKCZhZGFwdGVyLT5waHlfY29uZmlnX3RpbWVyLCBqaWZmaWVzICsgMyAqIEhaKTsKKwl9CisKKwlyZXR1cm4gQVRMMV9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzZXRfZmxvd19jdHJsX29sZChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiBoaSwgbG8sIHZhbHVlOworCisJLyogUkZEIEZsb3cgQ29udHJvbCAqLworCXZhbHVlID0gYWRhcHRlci0+cmZkX3JpbmcuY291bnQ7CisJaGkgPSB2YWx1ZSAvIDE2OworCWlmIChoaSA8IDIpCisJCWhpID0gMjsKKwlsbyA9IHZhbHVlICogNyAvIDg7CisKKwl2YWx1ZSA9ICgoaGkgJiBSWFFfUlhGX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfSElfU0hJRlQpIHwKKwkgICAgKChsbyAmIFJYUV9SWEZfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9MT19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX1JYUV9SWEZfUEFVU0VfVEhSRVNIKTsKKworCS8qIFJSRCBGbG93IENvbnRyb2wgKi8KKwl2YWx1ZSA9IGFkYXB0ZXItPnJyZF9yaW5nLmNvdW50OworCWxvID0gdmFsdWUgLyAxNjsKKwloaSA9IHZhbHVlICogNyAvIDg7CisJaWYgKGxvIDwgMikKKwkJbG8gPSAyOworCXZhbHVlID0gKChoaSAmIFJYUV9SUkRfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9ISV9TSElGVCkgfAorCSAgICAoKGxvICYgUlhRX1JSRF9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0xPX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfUlhRX1JSRF9QQVVTRV9USFJFU0gpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZmxvd19jdHJsX25ldyhzdHJ1Y3QgYXRsMV9odyAqaHcpCit7CisJdTMyIGhpLCBsbywgdmFsdWU7CisKKwkvKiBSWEYgRmxvdyBDb250cm9sICovCisJdmFsdWUgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19TUkFNX1JYRl9MRU4pOworCWxvID0gdmFsdWUgLyAxNjsKKwlpZiAobG8gPCAxOTIpCisJCWxvID0gMTkyOworCWhpID0gdmFsdWUgKiA3IC8gODsKKwlpZiAoaGkgPCBsbykKKwkJaGkgPSBsbyArIDE2OworCXZhbHVlID0gKChoaSAmIFJYUV9SWEZfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9ISV9TSElGVCkgfAorCSAgICAoKGxvICYgUlhRX1JYRl9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlhGX1BBVVNFX1RIX0xPX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9SWEZfUEFVU0VfVEhSRVNIKTsKKworCS8qIFJSRCBGbG93IENvbnRyb2wgKi8KKwl2YWx1ZSA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX1NSQU1fUlJEX0xFTik7CisJbG8gPSB2YWx1ZSAvIDg7CisJaGkgPSB2YWx1ZSAqIDcgLyA4OworCWlmIChsbyA8IDIpCisJCWxvID0gMjsKKwlpZiAoaGkgPCBsbykKKwkJaGkgPSBsbyArIDM7CisJdmFsdWUgPSAoKGhpICYgUlhRX1JSRF9QQVVTRV9USF9ISV9NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0hJX1NISUZUKSB8CisJICAgICgobG8gJiBSWFFfUlJEX1BBVVNFX1RIX0xPX01BU0spIDw8IFJYUV9SUkRfUEFVU0VfVEhfTE9fU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfUlhRX1JSRF9QQVVTRV9USFJFU0gpOworfQorCisvKgorICogYXRsMV9jb25maWd1cmUgLSBDb25maWd1cmUgVHJhbnNtaXQmUmVjZWl2ZSBVbml0IGFmdGVyIFJlc2V0CisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBDb25maWd1cmUgdGhlIFR4IC9SeCB1bml0IG9mIHRoZSBNQUMgYWZ0ZXIgYSByZXNldC4KKyAqLworc3RhdGljIHUzMiBhdGwxX2NvbmZpZ3VyZShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MzIgdmFsdWU7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJaW93cml0ZTMyKDB4ZmZmZmZmZmYsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKworCS8qIHNldCBNQUMgQWRkcmVzcyAqLworCXZhbHVlID0gKCgodTMyKSBody0+bWFjX2FkZHJbMl0pIDw8IDI0KSB8CisJCSgoKHUzMikgaHctPm1hY19hZGRyWzNdKSA8PCAxNikgfAorCQkoKCh1MzIpIGh3LT5tYWNfYWRkcls0XSkgPDwgOCkgfAorCQkoKCh1MzIpIGh3LT5tYWNfYWRkcls1XSkpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX1NUQV9BRERSKTsKKwl2YWx1ZSA9ICgoKHUzMikgaHctPm1hY19hZGRyWzBdKSA8PCA4KSB8ICgoKHUzMikgaHctPm1hY19hZGRyWzFdKSk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIChSRUdfTUFDX1NUQV9BRERSICsgNCkpOworCisJLyogdHggLyByeCByaW5nICovCisKKwkvKiBISSBiYXNlIGFkZHJlc3MgKi8KKwlpb3dyaXRlMzIoKHUzMikgKChhZGFwdGVyLT50cGRfcmluZy5kbWEgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpID4+IDMyKSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19CQVNFX0FERFJfSEkpOworCS8qIExPIGJhc2UgYWRkcmVzcyAqLworCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+cmZkX3JpbmcuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19SRkRfQUREUl9MTyk7CisJaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT5ycmRfcmluZy5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX1JSRF9BRERSX0xPKTsKKwlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnRwZF9yaW5nLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCisJCWh3LT5od19hZGRyICsgUkVHX0RFU0NfVFBEX0FERFJfTE8pOworCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+Y21iLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCisJCWh3LT5od19hZGRyICsgUkVHX0RFU0NfQ01CX0FERFJfTE8pOworCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+c21iLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCisJCWh3LT5od19hZGRyICsgUkVHX0RFU0NfU01CX0FERFJfTE8pOworCisJLyogZWxlbWVudCBjb3VudCAqLworCXZhbHVlID0gYWRhcHRlci0+cnJkX3JpbmcuY291bnQ7CisJdmFsdWUgPDw9IDE2OworCXZhbHVlICs9IGFkYXB0ZXItPnJmZF9yaW5nLmNvdW50OworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfREVTQ19SRkRfUlJEX1JJTkdfU0laRSk7CisJaW93cml0ZTMyKGFkYXB0ZXItPnRwZF9yaW5nLmNvdW50LCBody0+aHdfYWRkciArIFJFR19ERVNDX1RQRF9SSU5HX1NJWkUpOworCisJLyogTG9hZCBQdHIgKi8KKwlpb3dyaXRlMzIoMSwgaHctPmh3X2FkZHIgKyBSRUdfTE9BRF9QVFIpOworCisJLyogY29uZmlnIE1haWxib3ggKi8KKwl2YWx1ZSA9ICgoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnRwZF9yaW5nLm5leHRfdG9fdXNlKQorCQkgICYgTUJfVFBEX1BST0RfSU5EWF9NQVNLKSA8PCBNQl9UUERfUFJPRF9JTkRYX1NISUZUKSB8CisJICAgICgoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJyZF9yaW5nLm5leHRfdG9fY2xlYW4pCisJICAgICAgJiBNQl9SUkRfQ09OU19JTkRYX01BU0spIDw8IE1CX1JSRF9DT05TX0lORFhfU0hJRlQpIHwKKwkgICAgKChhdG9taWNfcmVhZCgmYWRhcHRlci0+cmZkX3JpbmcubmV4dF90b191c2UpCisJICAgICAgJiBNQl9SRkRfUFJPRF9JTkRYX01BU0spIDw8IE1CX1JGRF9QUk9EX0lORFhfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFJTEJPWCk7CisKKwkvKiBjb25maWcgSVBHL0lGRyAqLworCXZhbHVlID0gKCgodTMyKSBody0+aXBndCAmIE1BQ19JUEdfSUZHX0lQR1RfTUFTSykKKwkJIDw8IE1BQ19JUEdfSUZHX0lQR1RfU0hJRlQpIHwKKwkgICAgKCgodTMyKSBody0+bWluX2lmZyAmIE1BQ19JUEdfSUZHX01JRkdfTUFTSykKKwkgICAgIDw8IE1BQ19JUEdfSUZHX01JRkdfU0hJRlQpIHwKKwkgICAgKCgodTMyKSBody0+aXBncjEgJiBNQUNfSVBHX0lGR19JUEdSMV9NQVNLKQorCSAgICAgPDwgTUFDX0lQR19JRkdfSVBHUjFfU0hJRlQpIHwKKwkgICAgKCgodTMyKSBody0+aXBncjIgJiBNQUNfSVBHX0lGR19JUEdSMl9NQVNLKQorCSAgICAgPDwgTUFDX0lQR19JRkdfSVBHUjJfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0lQR19JRkcpOworCisJLyogY29uZmlnICBIYWxmLUR1cGxleCBDb250cm9sICovCisJdmFsdWUgPSAoKHUzMikgaHctPmxjb2wgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX0xDT0xfTUFTSykgfAorCSAgICAoKCh1MzIpIGh3LT5tYXhfcmV0cnkgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX01BU0spCisJICAgICA8PCBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX1NISUZUKSB8CisJICAgIE1BQ19IQUxGX0RVUExYX0NUUkxfRVhDX0RFRl9FTiB8CisJICAgICgweGEgPDwgTUFDX0hBTEZfRFVQTFhfQ1RSTF9BQkVCVF9TSElGVCkgfAorCSAgICAoKCh1MzIpIGh3LT5qYW1faXBnICYgTUFDX0hBTEZfRFVQTFhfQ1RSTF9KQU1JUEdfTUFTSykKKwkgICAgIDw8IE1BQ19IQUxGX0RVUExYX0NUUkxfSkFNSVBHX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19IQUxGX0RVUExYX0NUUkwpOworCisJLyogc2V0IEludGVycnVwdCBNb2RlcmF0b3IgVGltZXIgKi8KKwlpb3dyaXRlMTYoYWRhcHRlci0+aW10LCBody0+aHdfYWRkciArIFJFR19JUlFfTU9EVV9USU1FUl9JTklUKTsKKwlpb3dyaXRlMzIoTUFTVEVSX0NUUkxfSVRJTUVSX0VOLCBody0+aHdfYWRkciArIFJFR19NQVNURVJfQ1RSTCk7CisKKwkvKiBzZXQgSW50ZXJydXB0IENsZWFyIFRpbWVyICovCisJaW93cml0ZTE2KGFkYXB0ZXItPmljdCwgaHctPmh3X2FkZHIgKyBSRUdfQ01CRElTRE1BX1RJTUVSKTsKKworCS8qIHNldCBNVFUsIDQgOiBWTEFOICovCisJaW93cml0ZTMyKGh3LT5tYXhfZnJhbWVfc2l6ZSArIDQsIGh3LT5od19hZGRyICsgUkVHX01UVSk7CisKKwkvKiBqdW1ibyBzaXplICYgcnJkIHJldGlyZW1lbnQgdGltZXIgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPnJ4X2p1bWJvX3RoICYgUlhRX0pNQk9TWl9USF9NQVNLKQorCQkgPDwgUlhRX0pNQk9TWl9USF9TSElGVCkgfAorCSAgICAoKCh1MzIpIGh3LT5yeF9qdW1ib19sa2FoICYgUlhRX0pNQk9fTEtBSF9NQVNLKQorCSAgICAgPDwgUlhRX0pNQk9fTEtBSF9TSElGVCkgfAorCSAgICAoKCh1MzIpIGh3LT5ycmRfcmV0X3RpbWVyICYgUlhRX1JSRF9USU1FUl9NQVNLKQorCSAgICAgPDwgUlhRX1JSRF9USU1FUl9TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfSk1CT1NaX1JSRFRJTSk7CisKKwkvKiBGbG93IENvbnRyb2wgKi8KKwlzd2l0Y2ggKGh3LT5kZXZfcmV2KSB7CisJY2FzZSAweDgwMDE6CisJY2FzZSAweDkwMDE6CisJY2FzZSAweDkwMDI6CisJY2FzZSAweDkwMDM6CisJCXNldF9mbG93X2N0cmxfb2xkKGFkYXB0ZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXRfZmxvd19jdHJsX25ldyhodyk7CisJCWJyZWFrOworCX0KKworCS8qIGNvbmZpZyBUWFEgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPnRwZF9idXJzdCAmIFRYUV9DVFJMX1RQRF9CVVJTVF9OVU1fTUFTSykKKwkJIDw8IFRYUV9DVFJMX1RQRF9CVVJTVF9OVU1fU0hJRlQpIHwKKwkgICAgKCgodTMyKSBody0+dHhmX2J1cnN0ICYgVFhRX0NUUkxfVFhGX0JVUlNUX05VTV9NQVNLKQorCSAgICAgPDwgVFhRX0NUUkxfVFhGX0JVUlNUX05VTV9TSElGVCkgfAorCSAgICAoKCh1MzIpIGh3LT50cGRfZmV0Y2hfdGggJiBUWFFfQ1RSTF9UUERfRkVUQ0hfVEhfTUFTSykKKwkgICAgIDw8IFRYUV9DVFJMX1RQRF9GRVRDSF9USF9TSElGVCkgfCBUWFFfQ1RSTF9FTkhfTU9ERSB8IFRYUV9DVFJMX0VOOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfVFhRX0NUUkwpOworCisJLyogbWluIHRwZCBmZXRjaCBnYXAgJiB0eCBqdW1ibyBwYWNrZXQgc2l6ZSB0aHJlc2hvbGQgZm9yIHRhc2tvZmZsb2FkICovCisJdmFsdWUgPSAoKCh1MzIpIGh3LT50eF9qdW1ib190YXNrX3RoICYgVFhfSlVNQk9fVEFTS19USF9NQVNLKQorCQkgPDwgVFhfSlVNQk9fVEFTS19USF9TSElGVCkgfAorCSAgICAoKCh1MzIpIGh3LT50cGRfZmV0Y2hfZ2FwICYgVFhfVFBEX01JTl9JUEdfTUFTSykKKwkgICAgIDw8IFRYX1RQRF9NSU5fSVBHX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1RYX0pVTUJPX1RBU0tfVEhfVFBEX0lQRyk7CisKKwkvKiBjb25maWcgUlhRICovCisJdmFsdWUgPSAoKCh1MzIpIGh3LT5yZmRfYnVyc3QgJiBSWFFfQ1RSTF9SRkRfQlVSU1RfTlVNX01BU0spCisJCSA8PCBSWFFfQ1RSTF9SRkRfQlVSU1RfTlVNX1NISUZUKSB8CisJICAgICgoKHUzMikgaHctPnJyZF9idXJzdCAmIFJYUV9DVFJMX1JSRF9CVVJTVF9USFJFU0hfTUFTSykKKwkgICAgIDw8IFJYUV9DVFJMX1JSRF9CVVJTVF9USFJFU0hfU0hJRlQpIHwKKwkgICAgKCgodTMyKSBody0+cmZkX2ZldGNoX2dhcCAmIFJYUV9DVFJMX1JGRF9QUkVGX01JTl9JUEdfTUFTSykKKwkgICAgIDw8IFJYUV9DVFJMX1JGRF9QUkVGX01JTl9JUEdfU0hJRlQpIHwKKwkgICAgUlhRX0NUUkxfQ1VUX1RIUlVfRU4gfCBSWFFfQ1RSTF9FTjsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9DVFJMKTsKKworCS8qIGNvbmZpZyBETUEgRW5naW5lICovCisJdmFsdWUgPSAoKCgodTMyKSBody0+ZG1hcl9ibG9jaykgJiBETUFfQ1RSTF9ETUFSX0JVUlNUX0xFTl9NQVNLKQorCQkgPDwgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fU0hJRlQpIHwKKwkgICAgKCgoKHUzMikgaHctPmRtYXdfYmxvY2spICYgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fTUFTSykKKwkgICAgIDw8IERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX1NISUZUKSB8CisJICAgIERNQV9DVFJMX0RNQVJfRU4gfCBETUFfQ1RSTF9ETUFXX0VOOworCXZhbHVlIHw9ICh1MzIpIGh3LT5kbWFfb3JkOworCWlmIChhdGwxX3JjYl8xMjggPT0gaHctPnJjYl92YWx1ZSkKKwkJdmFsdWUgfD0gRE1BX0NUUkxfUkNCX1ZBTFVFOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfRE1BX0NUUkwpOworCisJLyogY29uZmlnIENNQiAvIFNNQiAqLworCXZhbHVlID0gaHctPmNtYl9ycmQgfCAoKHUzMikgaHctPmNtYl90cGQgPDwgMTYpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfQ01CX1dSSVRFX1RIKTsKKwl2YWx1ZSA9IGh3LT5jbWJfcnhfdGltZXIgfCAoKHUzMikgaHctPmNtYl90eF90aW1lciA8PCAxNik7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19DTUJfV1JJVEVfVElNRVIpOworCWlvd3JpdGUzMihody0+c21iX3RpbWVyLCBody0+aHdfYWRkciArIFJFR19TTUJfVElNRVIpOworCisJLyogLS0tIGVuYWJsZSBDTUIgLyBTTUIgKi8KKwl2YWx1ZSA9IENTTUJfQ1RSTF9DTUJfRU4gfCBDU01CX0NUUkxfU01CX0VOOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfQ1NNQl9DVFJMKTsKKworCXZhbHVlID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOworCWlmICh1bmxpa2VseSgodmFsdWUgJiBJU1JfUEhZX0xJTktET1dOKSAhPSAwKSkKKwkJdmFsdWUgPSAxOwkvKiBjb25maWcgZmFpbGVkICovCisJZWxzZQorCQl2YWx1ZSA9IDA7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0IHN0YXR1cyAqLworCWlvd3JpdGUzMigweDNmZmZmZmZmLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7CisJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBhdGwxX2lycV9kaXNhYmxlIC0gTWFzayBvZmYgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gdGhlIE5JQworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfaXJxX2Rpc2FibGUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKKwlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCWlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgYXRsMV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBjdHJsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwkvKiBhdGwxX2lycV9kaXNhYmxlKGFkYXB0ZXIpOyAqLworCWFkYXB0ZXItPnZsZ3JwID0gZ3JwOworCisJaWYgKGdycCkgeworCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwkJY3RybCB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKKwkJaW93cml0ZTMyKGN0cmwsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwkJY3RybCAmPSB+TUFDX0NUUkxfUk1WX1ZMQU47CisJCWlvd3JpdGUzMihjdHJsLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwl9CisKKwkvKiBhdGwxX2lycV9lbmFibGUoYWRhcHRlcik7ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworfQorCisvKiBGSVhNRToganVzdGlmeSBvciByZW1vdmUgLS0gQ0hTICovCitzdGF0aWMgdm9pZCBhdGwxX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQoreworCS8qIFdlIGRvbid0IGRvIFZsYW4gZmlsdGVyaW5nICovCisJcmV0dXJuOworfQorCisvKiBGSVhNRTogdGhpcyBsb29rcyB3cm9uZyB0b28gLS0gQ0hTICovCitzdGF0aWMgdm9pZCBhdGwxX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwkvKiBhdGwxX2lycV9kaXNhYmxlKGFkYXB0ZXIpOyAqLworCWlmIChhZGFwdGVyLT52bGdycCkKKwkJYWRhcHRlci0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKKwkvKiBhdGwxX2lycV9lbmFibGUoYWRhcHRlcik7ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCS8qIFdlIGRvbid0IGRvIFZsYW4gZmlsdGVyaW5nICovCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBhdGwxX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCWF0bDFfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKKwlpZiAoYWRhcHRlci0+dmxncnApIHsKKwkJdTE2IHZpZDsKKwkJZm9yICh2aWQgPSAwOyB2aWQgPCBWTEFOX0dST1VQX0FSUkFZX0xFTjsgdmlkKyspIHsKKwkJCWlmICghYWRhcHRlci0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdKQorCQkJCWNvbnRpbnVlOworCQkJYXRsMV92bGFuX3J4X2FkZF92aWQoYWRhcHRlci0+bmV0ZGV2LCB2aWQpOworCQl9CisJfQorfQorCitzdGF0aWMgdTE2IHRwZF9hdmFpbChzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcpCit7CisJdTE2IG5leHRfdG9fY2xlYW4gPSBhdG9taWNfcmVhZCgmdHBkX3JpbmctPm5leHRfdG9fY2xlYW4pOworCXUxNiBuZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZ0cGRfcmluZy0+bmV4dF90b191c2UpOworCXJldHVybiAoKG5leHRfdG9fY2xlYW4gPgorCQkgbmV4dF90b191c2UpID8gbmV4dF90b19jbGVhbiAtIG5leHRfdG9fdXNlIC0KKwkJMSA6IHRwZF9yaW5nLT5jb3VudCArIG5leHRfdG9fY2xlYW4gLSBuZXh0X3RvX3VzZSAtIDEpOworfQorCitzdGF0aWMgaW50IGF0bDFfdHNvKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IHRzb19wYXJhbSAqdHNvKQoreworCS8qIFdlIGVudGVyIHRoaXMgZnVuY3Rpb24gaG9sZGluZyBhIHNwaW5sb2NrLiAqLworCXU4IGlwb2ZzdDsKKwlpbnQgZXJyOworCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpIHsKKwkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikpIHsKKwkJCWVyciA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKQorCQkJCXJldHVybiBlcnI7CisJCX0KKworCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF9JUCkpIHsKKwkJCXNrYi0+bmguaXBoLT50b3RfbGVuID0gMDsKKwkJCXNrYi0+bmguaXBoLT5jaGVjayA9IDA7CisJCQlza2ItPmgudGgtPmNoZWNrID0KKwkJCSAgICB+Y3N1bV90Y3B1ZHBfbWFnaWMoc2tiLT5uaC5pcGgtPnNhZGRyLAorCQkJCQkgICAgICAgc2tiLT5uaC5pcGgtPmRhZGRyLCAwLAorCQkJCQkgICAgICAgSVBQUk9UT19UQ1AsIDApOworCQkJaXBvZnN0ID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7CisJCQlpZiAoaXBvZnN0ICE9IEVORVRfSEVBREVSX1NJWkUpIC8qIDgwMi4zIGZyYW1lICovCisJCQkJdHNvLT50c29wbCB8PSAxIDw8IFRTT19QQVJBTV9FVEhUWVBFX1NISUZUOworCisJCQl0c28tPnRzb3BsIHw9IChza2ItPm5oLmlwaC0+aWhsICYKKwkJCQlDU1VNX1BBUkFNX0lQSExfTUFTSykgPDwgQ1NVTV9QQVJBTV9JUEhMX1NISUZUOworCQkJdHNvLT50c29wbCB8PSAoKHNrYi0+aC50aC0+ZG9mZiA8PCAyKSAmCisJCQkJVFNPX1BBUkFNX1RDUEhEUkxFTl9NQVNLKSA8PCBUU09fUEFSQU1fVENQSERSTEVOX1NISUZUOworCQkJdHNvLT50c29wbCB8PSAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSAmCisJCQkJVFNPX1BBUkFNX01TU19NQVNLKSA8PCBUU09fUEFSQU1fTVNTX1NISUZUOworCQkJdHNvLT50c29wbCB8PSAxIDw8IFRTT19QQVJBTV9JUENLU1VNX1NISUZUOworCQkJdHNvLT50c29wbCB8PSAxIDw8IFRTT19QQVJBTV9UQ1BDS1NVTV9TSElGVDsKKwkJCXRzby0+dHNvcGwgfD0gMSA8PCBUU09fUEFSQU1fU0VHTUVOVF9TSElGVDsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBhdGwxX3R4X2NzdW0oc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBjc3VtX3BhcmFtICpjc3VtKQoreworCXU4IGNzcywgY3NvOworCisJaWYgKGxpa2VseShza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSkgeworCQljc28gPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOworCQljc3MgPSAoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgLSBza2ItPmRhdGE7CisJCWlmICh1bmxpa2VseShjc28gJiAweDEpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBheWxvYWQgb2Zmc2V0ICE9IGV2ZW4gbnVtYmVyXG4iLAorCQkJCWF0bDFfZHJpdmVyX25hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWNzdW0tPmNzdW1wbCB8PSAoY3NvICYgQ1NVTV9QQVJBTV9QTE9BRE9GRlNFVF9NQVNLKSA8PAorCQkJQ1NVTV9QQVJBTV9QTE9BRE9GRlNFVF9TSElGVDsKKwkJY3N1bS0+Y3N1bXBsIHw9IChjc3MgJiBDU1VNX1BBUkFNX1hTVU1PRkZTRVRfTUFTSykgPDwKKwkJCUNTVU1fUEFSQU1fWFNVTU9GRlNFVF9TSElGVDsKKwkJY3N1bS0+Y3N1bXBsIHw9IDEgPDwgQ1NVTV9QQVJBTV9DVVNUT01DS1NVTV9TSElGVDsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfdHhfbWFwKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCB0Y3Bfc2VnKQoreworCS8qIFdlIGVudGVyIHRoaXMgZnVuY3Rpb24gaG9sZGluZyBhIHNwaW5sb2NrLiAqLworCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBmaXJzdF9idWZfbGVuID0gc2tiLT5sZW47CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgaW50IG5yX2ZyYWdzOworCXVuc2lnbmVkIGludCBmOworCXUxNiB0cGRfbmV4dF90b191c2U7CisJdTE2IHByb3RvX2hkcl9sZW47CisJdTE2IGksIG0sIGxlbjEyOworCisJZmlyc3RfYnVmX2xlbiAtPSBza2ItPmRhdGFfbGVuOworCW5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwl0cGRfbmV4dF90b191c2UgPSBhdG9taWNfcmVhZCgmdHBkX3JpbmctPm5leHRfdG9fdXNlKTsKKwlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9bdHBkX25leHRfdG9fdXNlXTsKKwlpZiAodW5saWtlbHkoYnVmZmVyX2luZm8tPnNrYikpCisJCUJVRygpOworCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwkvKiBwdXQgc2tiIGluIGxhc3QgVFBEICovCisKKwlpZiAodGNwX3NlZykgeworCQkvKiBUU08vR1NPICovCisJCXByb3RvX2hkcl9sZW4gPQorCQkgICAgKChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArIChza2ItPmgudGgtPmRvZmYgPDwgMikpOworCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gcHJvdG9faGRyX2xlbjsKKwkJcGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEpOworCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylza2ItPmRhdGEgJiB+UEFHRV9NQVNLOworCQlidWZmZXJfaW5mby0+ZG1hID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIHBhZ2UsCisJCQkJCQlvZmZzZXQsIHByb3RvX2hkcl9sZW4sCisJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlpZiAoKyt0cGRfbmV4dF90b191c2UgPT0gdHBkX3JpbmctPmNvdW50KQorCQkJdHBkX25leHRfdG9fdXNlID0gMDsKKworCQlpZiAoZmlyc3RfYnVmX2xlbiA+IHByb3RvX2hkcl9sZW4pIHsKKwkJCWxlbjEyID0gZmlyc3RfYnVmX2xlbiAtIHByb3RvX2hkcl9sZW47CisJCQltID0gKGxlbjEyICsgTUFYX1RYX0JVRl9MRU4gLSAxKSAvIE1BWF9UWF9CVUZfTEVOOworCQkJZm9yIChpID0gMDsgaSA8IG07IGkrKykgeworCQkJCWJ1ZmZlcl9pbmZvID0KKwkJCQkgICAgJnRwZF9yaW5nLT5idWZmZXJfaW5mb1t0cGRfbmV4dF90b191c2VdOworCQkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCQkJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPQorCQkJCSAgICAoTUFYX1RYX0JVRl9MRU4gPj0KKwkJCQkgICAgIGxlbjEyKSA/IE1BWF9UWF9CVUZfTEVOIDogbGVuMTI7CisJCQkJbGVuMTIgLT0gYnVmZmVyX2luZm8tPmxlbmd0aDsKKwkJCQlwYWdlID0gdmlydF90b19wYWdlKHNrYi0+ZGF0YSArCisJCQkJCQkgKHByb3RvX2hkcl9sZW4gKworCQkJCQkJICBpICogTUFYX1RYX0JVRl9MRU4pKTsKKwkJCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZykoc2tiLT5kYXRhICsKKwkJCQkJCQkocHJvdG9faGRyX2xlbiArCisJCQkJCQkJaSAqIE1BWF9UWF9CVUZfTEVOKSkgJgorCQkJCQkJCX5QQUdFX01BU0s7CisJCQkJYnVmZmVyX2luZm8tPmRtYSA9CisJCQkJICAgIHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBwYWdlLCBvZmZzZXQsCisJCQkJCQkgYnVmZmVyX2luZm8tPmxlbmd0aCwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlpZiAoKyt0cGRfbmV4dF90b191c2UgPT0gdHBkX3JpbmctPmNvdW50KQorCQkJCQl0cGRfbmV4dF90b191c2UgPSAwOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogbm90IFRTTy9HU08gKi8KKwkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IGZpcnN0X2J1Zl9sZW47CisJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKTsKKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhICYgflBBR0VfTUFTSzsKKwkJYnVmZmVyX2luZm8tPmRtYSA9IHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBwYWdlLAorCQkJCQkJb2Zmc2V0LCBmaXJzdF9idWZfbGVuLAorCQkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCWlmICgrK3RwZF9uZXh0X3RvX3VzZSA9PSB0cGRfcmluZy0+Y291bnQpCisJCQl0cGRfbmV4dF90b191c2UgPSAwOworCX0KKworCWZvciAoZiA9IDA7IGYgPCBucl9mcmFnczsgZisrKSB7CisJCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWc7CisJCXUxNiBsZW5mLCBpLCBtOworCisJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXTsKKwkJbGVuZiA9IGZyYWctPnNpemU7CisKKwkJbSA9IChsZW5mICsgTUFYX1RYX0JVRl9MRU4gLSAxKSAvIE1BWF9UWF9CVUZfTEVOOworCQlmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CisJCQlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9bdHBkX25leHRfdG9fdXNlXTsKKwkJCWlmICh1bmxpa2VseShidWZmZXJfaW5mby0+c2tiKSkKKwkJCQlCVUcoKTsKKwkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCQkJYnVmZmVyX2luZm8tPmxlbmd0aCA9CisJCQkgICAgKGxlbmYgPiBNQVhfVFhfQlVGX0xFTikgPyBNQVhfVFhfQlVGX0xFTiA6IGxlbmY7CisJCQlsZW5mIC09IGJ1ZmZlcl9pbmZvLT5sZW5ndGg7CisJCQlidWZmZXJfaW5mby0+ZG1hID0KKwkJCSAgICBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgZnJhZy0+cGFnZSwKKwkJCQkJIGZyYWctPnBhZ2Vfb2Zmc2V0ICsgaSAqIE1BWF9UWF9CVUZfTEVOLAorCQkJCQkgYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJCWlmICgrK3RwZF9uZXh0X3RvX3VzZSA9PSB0cGRfcmluZy0+Y291bnQpCisJCQkJdHBkX25leHRfdG9fdXNlID0gMDsKKwkJfQorCX0KKworCS8qIGxhc3QgdHBkJ3MgYnVmZmVyLWluZm8gKi8KKwlidWZmZXJfaW5mby0+c2tiID0gc2tiOworfQorCitzdGF0aWMgdm9pZCBhdGwxX3R4X3F1ZXVlKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBjb3VudCwKKwkJCSAgICAgICB1bmlvbiB0cGRfZGVzY3IgKmRlc2NyKQoreworCS8qIFdlIGVudGVyIHRoaXMgZnVuY3Rpb24gaG9sZGluZyBhIHNwaW5sb2NrLiAqLworCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKKwlpbnQgajsKKwl1MzIgdmFsOworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHR4X3BhY2tldF9kZXNjICp0cGQ7CisJdTE2IHRwZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZ0cGRfcmluZy0+bmV4dF90b191c2UpOworCisJZm9yIChqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKwkJYnVmZmVyX2luZm8gPSAmdHBkX3JpbmctPmJ1ZmZlcl9pbmZvW3RwZF9uZXh0X3RvX3VzZV07CisJCXRwZCA9IEFUTDFfVFBEX0RFU0MoJmFkYXB0ZXItPnRwZF9yaW5nLCB0cGRfbmV4dF90b191c2UpOworCQl0cGQtPmRlc2MuY3N1bS5jc3VtcHUgPSBkZXNjci0+Y3N1bS5jc3VtcHU7CisJCXRwZC0+ZGVzYy5jc3VtLmNzdW1wbCA9IGRlc2NyLT5jc3VtLmNzdW1wbDsKKwkJdHBkLT5kZXNjLnRzby50c29wdSA9IGRlc2NyLT50c28udHNvcHU7CisJCXRwZC0+ZGVzYy50c28udHNvcGwgPSBkZXNjci0+dHNvLnRzb3BsOworCQl0cGQtPmJ1ZmZlcl9hZGRyID0gY3B1X3RvX2xlNjQoYnVmZmVyX2luZm8tPmRtYSk7CisJCXRwZC0+ZGVzYy5kYXRhID0gZGVzY3ItPmRhdGE7CisJCXRwZC0+ZGVzYy5jc3VtLmNzdW1wdSB8PSAoY3B1X3RvX2xlMTYoYnVmZmVyX2luZm8tPmxlbmd0aCkgJgorCQkJQ1NVTV9QQVJBTV9CVUZMRU5fTUFTSykgPDwgQ1NVTV9QQVJBTV9CVUZMRU5fU0hJRlQ7CisKKwkJdmFsID0gKGRlc2NyLT50c28udHNvcGwgPj4gVFNPX1BBUkFNX1NFR01FTlRfU0hJRlQpICYKKwkJCVRTT19QQVJBTV9TRUdNRU5UX01BU0s7CisJCWlmICh2YWwgJiYgIWopCisJCQl0cGQtPmRlc2MudHNvLnRzb3BsIHw9IDEgPDwgVFNPX1BBUkFNX0hEUkZMQUdfU0hJRlQ7CisKKwkJaWYgKGogPT0gKGNvdW50IC0gMSkpCisJCQl0cGQtPmRlc2MuY3N1bS5jc3VtcGwgfD0gMSA8PCBDU1VNX1BBUkFNX0VPUF9TSElGVDsKKworCQlpZiAoKyt0cGRfbmV4dF90b191c2UgPT0gdHBkX3JpbmctPmNvdW50KQorCQkJdHBkX25leHRfdG9fdXNlID0gMDsKKwl9CisJLyoKKwkgKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdworCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5CisJICogYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocywKKwkgKiBzdWNoIGFzIElBLTY0KS4KKwkgKi8KKwl3bWIoKTsKKworCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSwgKGludCl0cGRfbmV4dF90b191c2UpOworfQorCitzdGF0aWMgdm9pZCBhdGwxX3VwZGF0ZV9tYWlsYm94KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdHBkX25leHRfdG9fdXNlOworCXUzMiByZmRfbmV4dF90b191c2U7CisJdTMyIHJyZF9uZXh0X3RvX2NsZWFuOworCXUzMiB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5tYl9sb2NrLCBmbGFncyk7CisKKwl0cGRfbmV4dF90b191c2UgPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+dHBkX3JpbmcubmV4dF90b191c2UpOworCXJmZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZmRfcmluZy5uZXh0X3RvX3VzZSk7CisJcnJkX25leHRfdG9fY2xlYW4gPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+cnJkX3JpbmcubmV4dF90b19jbGVhbik7CisKKwl2YWx1ZSA9ICgocmZkX25leHRfdG9fdXNlICYgTUJfUkZEX1BST0RfSU5EWF9NQVNLKSA8PAorCQlNQl9SRkRfUFJPRF9JTkRYX1NISUZUKSB8CisJCSgocnJkX25leHRfdG9fY2xlYW4gJiBNQl9SUkRfQ09OU19JTkRYX01BU0spIDw8CisJCU1CX1JSRF9DT05TX0lORFhfU0hJRlQpIHwKKwkJKCh0cGRfbmV4dF90b191c2UgJiBNQl9UUERfUFJPRF9JTkRYX01BU0spIDw8CisJCU1CX1RQRF9QUk9EX0lORFhfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUlMQk9YKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPm1iX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBhdGwxX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisJaW50IHRzbzsKKwlpbnQgY291bnQgPSAxOworCWludCByZXRfdmFsOworCXUzMiB2YWw7CisJdW5pb24gdHBkX2Rlc2NyIHBhcmFtOworCXUxNiBmcmFnX3NpemU7CisJdTE2IHZsYW5fdGFnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG5yX2ZyYWdzID0gMDsKKwl1bnNpZ25lZCBpbnQgbXNzID0gMDsKKwl1bnNpZ25lZCBpbnQgZjsKKwl1bnNpZ25lZCBpbnQgcHJvdG9faGRyX2xlbjsKKworCWxlbiAtPSBza2ItPmRhdGFfbGVuOworCisJaWYgKHVubGlrZWx5KHNrYi0+bGVuID09IDApKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJcGFyYW0uZGF0YSA9IDA7CisJcGFyYW0udHNvLnRzb3B1ID0gMDsKKwlwYXJhbS50c28udHNvcGwgPSAwOworCXBhcmFtLmNzdW0uY3N1bXB1ID0gMDsKKwlwYXJhbS5jc3VtLmNzdW1wbCA9IDA7CisKKwkvKiBucl9mcmFncyB3aWxsIGJlIG5vbnplcm8gaWYgd2UncmUgZG9pbmcgc2NhdHRlci9nYXRoZXIgKFNHKSAqLworCW5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwlmb3IgKGYgPSAwOyBmIDwgbnJfZnJhZ3M7IGYrKykgeworCQlmcmFnX3NpemUgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZdLnNpemU7CisJCWlmIChmcmFnX3NpemUpCisJCQljb3VudCArPQorCQkJICAgIChmcmFnX3NpemUgKyBNQVhfVFhfQlVGX0xFTiAtIDEpIC8gTUFYX1RYX0JVRl9MRU47CisJfQorCisJLyogbXNzIHdpbGwgYmUgbm9uemVybyBpZiB3ZSdyZSBkb2luZyBzZWdtZW50IG9mZmxvYWQgKFRTTy9HU08pICovCisJbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKKwlpZiAobXNzKSB7CisJCWlmIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QX0lQKSkgeworCQkJcHJvdG9faGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKworCQkJCQkgKHNrYi0+aC50aC0+ZG9mZiA8PCAyKSk7CisJCQlpZiAodW5saWtlbHkocHJvdG9faGRyX2xlbiA+IGxlbikpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCXJldHVybiBORVRERVZfVFhfT0s7CisJCQl9CisJCQkvKiBuZWVkIGFkZGl0aW9uYWwgVFBEID8gKi8KKwkJCWlmIChwcm90b19oZHJfbGVuICE9IGxlbikKKwkJCQljb3VudCArPSAobGVuIC0gcHJvdG9faGRyX2xlbiArCisJCQkJCU1BWF9UWF9CVUZfTEVOIC0gMSkgLyBNQVhfVFhfQlVGX0xFTjsKKwkJfQorCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoIXNwaW5fdHJ5bG9jaygmYWRhcHRlci0+bG9jaykpIHsKKwkJLyogQ2FuJ3QgZ2V0IGxvY2sgLSB0ZWxsIHVwcGVyIGxheWVyIHRvIHJlcXVldWUgKi8KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRYIGxvY2tlZFxuIiwgYXRsMV9kcml2ZXJfbmFtZSk7CisJCXJldHVybiBORVRERVZfVFhfTE9DS0VEOworCX0KKworCWlmICh0cGRfYXZhaWwoJmFkYXB0ZXItPnRwZF9yaW5nKSA8IGNvdW50KSB7CisJCS8qIG5vdCBlbm91Z2ggZGVzY3JpcHRvcnMgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVFggYnVzeVxuIiwgYXRsMV9kcml2ZXJfbmFtZSk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlwYXJhbS5kYXRhID0gMDsKKworCWlmIChhZGFwdGVyLT52bGdycCAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKKwkJdmxhbl90YWcgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwkJdmxhbl90YWcgPSAodmxhbl90YWcgPDwgNCkgfCAodmxhbl90YWcgPj4gMTMpIHwKKwkJCSgodmxhbl90YWcgPj4gOSkgJiAweDgpOworCQlwYXJhbS5jc3VtLmNzdW1wbCB8PSAxIDw8IENTVU1fUEFSQU1fSU5TVkxBR19TSElGVDsKKwkJcGFyYW0uY3N1bS5jc3VtcHUgfD0gKHZsYW5fdGFnICYgQ1NVTV9QQVJBTV9WQUxBTlRBR19NQVNLKSA8PAorCQkJQ1NVTV9QQVJBTV9WQUxBTl9TSElGVDsKKwl9CisKKwl0c28gPSBhdGwxX3RzbyhhZGFwdGVyLCBza2IsICZwYXJhbS50c28pOworCWlmICh0c28gPCAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKwlpZiAoIXRzbykgeworCQlyZXRfdmFsID0gYXRsMV90eF9jc3VtKGFkYXB0ZXIsIHNrYiwgJnBhcmFtLmNzdW0pOworCQlpZiAocmV0X3ZhbCA8IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm4gTkVUREVWX1RYX09LOworCQl9CisJfQorCisJdmFsID0gKHBhcmFtLmNzdW0uY3N1bXBsID4+IENTVU1fUEFSQU1fU0VHTUVOVF9TSElGVCkgJgorCQlDU1VNX1BBUkFNX1NFR01FTlRfTUFTSzsKKwlhdGwxX3R4X21hcChhZGFwdGVyLCBza2IsIDEgPT0gdmFsKTsKKwlhdGwxX3R4X3F1ZXVlKGFkYXB0ZXIsIGNvdW50LCAmcGFyYW0pOworCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlhdGwxX3VwZGF0ZV9tYWlsYm94KGFkYXB0ZXIpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKy8qCisgKiBhdGwxX2dldF9zdGF0cyAtIEdldCBTeXN0ZW0gTmV0d29yayBTdGF0aXN0aWNzCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLgorICogVGhlIHN0YXRpc3RpY3MgYXJlIGFjdHVhbGx5IHVwZGF0ZWQgZnJvbSB0aGUgdGltZXIgY2FsbGJhY2suCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXRsMV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gJmFkYXB0ZXItPm5ldF9zdGF0czsKK30KKworLyoKKyAqIGF0bDFfY2xlYW5fcnhfcmluZyAtIEZyZWUgUkZEIEJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBhdGwxX2NsZWFuX3J4X3Jpbmcoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisJc3RydWN0IGF0bDFfcnJkX3JpbmcgKnJyZF9yaW5nID0gJmFkYXB0ZXItPnJyZF9yaW5nOworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEZyZWUgYWxsIHRoZSBSeCByaW5nIHNrX2J1ZmZzICovCisJZm9yIChpID0gMDsgaSA8IHJmZF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnJmZF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJaWYgKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJCXBjaV91bm1hcF9wYWdlKHBkZXYsCisJCQkJCWJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJCWJ1ZmZlcl9pbmZvLT5sZW5ndGgsCisJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlidWZmZXJfaW5mby0+ZG1hID0gMDsKKwkJfQorCQlpZiAoYnVmZmVyX2luZm8tPnNrYikgeworCQkJZGV2X2tmcmVlX3NrYihidWZmZXJfaW5mby0+c2tiKTsKKwkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCQl9CisJfQorCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXRsMV9idWZmZXIpICogcmZkX3JpbmctPmNvdW50OworCW1lbXNldChyZmRfcmluZy0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJLyogWmVybyBvdXQgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCW1lbXNldChyZmRfcmluZy0+ZGVzYywgMCwgcmZkX3JpbmctPnNpemUpOworCisJcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCWF0b21pY19zZXQoJnJmZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7CisKKwlycmRfcmluZy0+bmV4dF90b191c2UgPSAwOworCWF0b21pY19zZXQoJnJyZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKK30KKworLyoKKyAqIGF0bDFfY2xlYW5fdHhfcmluZyAtIEZyZWUgVHggQnVmZmVycworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfY2xlYW5fdHhfcmluZyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBGcmVlIGFsbCB0aGUgVHggcmluZyBza19idWZmcyAqLworCWZvciAoaSA9IDA7IGkgPCB0cGRfcmluZy0+Y291bnQ7IGkrKykgeworCQlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9baV07CisJCWlmIChidWZmZXJfaW5mby0+ZG1hKSB7CisJCQlwY2lfdW5tYXBfcGFnZShwZGV2LCBidWZmZXJfaW5mby0+ZG1hLAorCQkJCSAgICAgICBidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IHRwZF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJaWYgKGJ1ZmZlcl9pbmZvLT5za2IpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KGJ1ZmZlcl9pbmZvLT5za2IpOworCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdGwxX2J1ZmZlcikgKiB0cGRfcmluZy0+Y291bnQ7CisJbWVtc2V0KHRwZF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCisJbWVtc2V0KHRwZF9yaW5nLT5kZXNjLCAwLCB0cGRfcmluZy0+c2l6ZSk7CisKKwlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b191c2UsIDApOworCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKK30KKworLyoKKyAqIGF0bDFfZnJlZV9yaW5nX3Jlc291cmNlcyAtIEZyZWUgVHggLyBSWCBkZXNjcmlwdG9yIFJlc291cmNlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogRnJlZSBhbGwgdHJhbnNtaXQgc29mdHdhcmUgcmVzb3VyY2VzCisgKi8KK3ZvaWQgYXRsMV9mcmVlX3JpbmdfcmVzb3VyY2VzKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisJc3RydWN0IGF0bDFfcnJkX3JpbmcgKnJyZF9yaW5nID0gJmFkYXB0ZXItPnJyZF9yaW5nOworCXN0cnVjdCBhdGwxX3JpbmdfaGVhZGVyICpyaW5nX2hlYWRlciA9ICZhZGFwdGVyLT5yaW5nX2hlYWRlcjsKKworCWF0bDFfY2xlYW5fdHhfcmluZyhhZGFwdGVyKTsKKwlhdGwxX2NsZWFuX3J4X3JpbmcoYWRhcHRlcik7CisKKwlrZnJlZSh0cGRfcmluZy0+YnVmZmVyX2luZm8pOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgcmluZ19oZWFkZXItPnNpemUsIHJpbmdfaGVhZGVyLT5kZXNjLAorCQkJICAgIHJpbmdfaGVhZGVyLT5kbWEpOworCisJdHBkX3JpbmctPmJ1ZmZlcl9pbmZvID0gTlVMTDsKKwl0cGRfcmluZy0+ZGVzYyA9IE5VTEw7CisJdHBkX3JpbmctPmRtYSA9IDA7CisKKwlyZmRfcmluZy0+YnVmZmVyX2luZm8gPSBOVUxMOworCXJmZF9yaW5nLT5kZXNjID0gTlVMTDsKKwlyZmRfcmluZy0+ZG1hID0gMDsKKworCXJyZF9yaW5nLT5kZXNjID0gTlVMTDsKKwlycmRfcmluZy0+ZG1hID0gMDsKK30KKworczMyIGF0bDFfdXAoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCWludCBlcnI7CisJaW50IGlycV9mbGFncyA9IElSUUZfU0FNUExFX1JBTkRPTTsKKworCS8qIGhhcmR3YXJlIGhhcyBiZWVuIHJlc2V0LCB3ZSBuZWVkIHRvIHJlbG9hZCBzb21lIHRoaW5ncyAqLworCWF0bDFfc2V0X211bHRpKG5ldGRldik7CisJYXRsMV9yZXN0b3JlX3ZsYW4oYWRhcHRlcik7CisJZXJyID0gYXRsMV9hbGxvY19yeF9idWZmZXJzKGFkYXB0ZXIpOworCWlmICh1bmxpa2VseSghZXJyKSkJCS8qIG5vIFJYIEJVRkZFUiBhbGxvY2F0ZWQgKi8KKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodW5saWtlbHkoYXRsMV9jb25maWd1cmUoYWRhcHRlcikpKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX3VwOworCX0KKworCWVyciA9IHBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJVbmFibGUgdG8gZW5hYmxlIE1TSTogJWRcbiIsIGVycik7CisJCWlycV9mbGFncyB8PSBJUlFGX1NIQVJFRDsKKwl9CisKKwllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsICZhdGwxX2ludHIsIGlycV9mbGFncywKKwkJCW5ldGRldi0+bmFtZSwgbmV0ZGV2KTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBlcnJfdXA7CisKKwltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzKTsKKwlhdGwxX2lycV9lbmFibGUoYWRhcHRlcik7CisJYXRsMV9jaGVja19saW5rKGFkYXB0ZXIpOworCXJldHVybiAwOworCisJLyogRklYTUU6IHVucmVhY2hhYmxlIGNvZGUhIC0tIENIUyAqLworCS8qIGZyZWUgaXJxIGRpc2FibGUgYW55IGludGVycnVwdCAqLworCWlvd3JpdGUzMigwLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7CisJZnJlZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCBuZXRkZXYpOworCitlcnJfdXA6CisJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOworCS8qIGZyZWUgcnhfYnVmZmVycyAqLworCWF0bDFfY2xlYW5fcnhfcmluZyhhZGFwdGVyKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGF0bDFfZG93bihzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5waHlfY29uZmlnX3RpbWVyKTsKKwlhZGFwdGVyLT5waHlfdGltZXJfcGVuZGluZyA9IGZhbHNlOworCisJYXRsMV9pcnFfZGlzYWJsZShhZGFwdGVyKTsKKwlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7CisJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOworCWF0bDFfcmVzZXRfaHcoJmFkYXB0ZXItPmh3KTsKKwlhZGFwdGVyLT5jbWIuY21iLT5pbnRfc3RhdHMgPSAwOworCisJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7CisJYWRhcHRlci0+bGlua19kdXBsZXggPSAtMTsKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCWF0bDFfY2xlYW5fdHhfcmluZyhhZGFwdGVyKTsKKwlhdGwxX2NsZWFuX3J4X3JpbmcoYWRhcHRlcik7Cit9CisKKy8qCisgKiBhdGwxX2NoYW5nZV9tdHUgLSBDaGFuZ2UgdGhlIE1heGltdW0gVHJhbnNmZXIgVW5pdAorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQG5ld19tdHU6IG5ldyB2YWx1ZSBmb3IgbWF4aW11bSBmcmFtZSBzaXplCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBhdGwxX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IG9sZF9tdHUgPSBuZXRkZXYtPm10dTsKKwlpbnQgbWF4X2ZyYW1lID0gbmV3X210dSArIEVORVRfSEVBREVSX1NJWkUgKyBFVEhFUk5FVF9GQ1NfU0laRTsKKworCWlmICgobWF4X2ZyYW1lIDwgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFKSB8fAorCSAgICAobWF4X2ZyYW1lID4gTUFYX0pVTUJPX0ZSQU1FX1NJWkUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIE1UVSBzZXR0aW5nXG4iLAorCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkYXB0ZXItPmh3Lm1heF9mcmFtZV9zaXplID0gbWF4X2ZyYW1lOworCWFkYXB0ZXItPmh3LnR4X2p1bWJvX3Rhc2tfdGggPSAobWF4X2ZyYW1lICsgNykgPj4gMzsKKwlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gKG1heF9mcmFtZSArIDcpICYgfjc7CisJYWRhcHRlci0+aHcucnhfanVtYm9fdGggPSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuIC8gODsKKworCW5ldGRldi0+bXR1ID0gbmV3X210dTsKKwlpZiAoKG9sZF9tdHUgIT0gbmV3X210dSkgJiYgbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCWF0bDFfZG93bihhZGFwdGVyKTsKKwkJYXRsMV91cChhZGFwdGVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGF0bDFfc2V0X21hYyAtIENoYW5nZSB0aGUgRXRoZXJuZXQgQWRkcmVzcyBvZiB0aGUgTklDCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcDogcG9pbnRlciB0byBhbiBhZGRyZXNzIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgYXRsMV9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKwltZW1jcHkoYWRhcHRlci0+aHcubWFjX2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOworCisJYXRsMV9zZXRfbWFjX2FkZHIoJmFkYXB0ZXItPmh3KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGF0bDFfd2F0Y2hkb2cgLSBUaW1lciBDYWxsLWJhY2sKKyAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZworICovCitzdGF0aWMgdm9pZCBhdGwxX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKilkYXRhOworCisJLyogUmVzZXQgdGhlIHRpbWVyICovCisJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDIgKiBIWik7Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUxNiByZXN1bHQ7CisKKwlhdGwxX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIHJlZ19udW0gJiAweDFmLCAmcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0sIGludCB2YWwpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlhdGwxX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCByZWdfbnVtLCB2YWwpOworfQorCisvKgorICogYXRsMV9taWlfaW9jdGwgLQorICogQG5ldGRldjoKKyAqIEBpZnJlcToKKyAqIEBjbWQ6CisgKi8KK3N0YXRpYyBpbnQgYXRsMV9taWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlyZXR2YWwgPSBnZW5lcmljX21paV9pb2N0bCgmYWRhcHRlci0+bWlpLCBpZl9taWkoaWZyKSwgY21kLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogYXRsMV9pb2N0bCAtCisgKiBAbmV0ZGV2OgorICogQGlmcmVxOgorICogQGNtZDoKKyAqLworc3RhdGljIGludCBhdGwxX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToKKwljYXNlIFNJT0NHTUlJUkVHOgorCWNhc2UgU0lPQ1NNSUlSRUc6CisJCXJldHVybiBhdGwxX21paV9pb2N0bChuZXRkZXYsIGlmciwgY21kKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCisvKgorICogYXRsMV90eF90aW1lb3V0IC0gUmVzcG9uZCB0byBhIFR4IEhhbmcKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJLyogRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOworfQorCisvKgorICogYXRsMV9waHlfY29uZmlnIC0gVGltZXIgQ2FsbC1iYWNrCisgKiBAZGF0YTogcG9pbnRlciB0byBuZXRkZXYgY2FzdCBpbnRvIGFuIHVuc2lnbmVkIGxvbmcKKyAqLworc3RhdGljIHZvaWQgYXRsMV9waHlfY29uZmlnKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKilkYXRhOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlhZGFwdGVyLT5waHlfdGltZXJfcGVuZGluZyA9IGZhbHNlOworCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0FEVkVSVElTRSwgaHctPm1paV9hdXRvbmVnX2Fkdl9yZWcpOworCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0FUMDAxX0NSLCBody0+bWlpXzEwMDB0X2N0cmxfcmVnKTsKKwlhdGwxX3dyaXRlX3BoeV9yZWcoaHcsIE1JSV9CTUNSLCBNSUlfQ1JfUkVTRVQgfCBNSUlfQ1JfQVVUT19ORUdfRU4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKK30KKworaW50IGF0bDFfcmVzZXQoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYXRsMV9yZXNldF9odygmYWRhcHRlci0+aHcpOworCWlmIChyZXQgIT0gQVRMMV9TVUNDRVNTKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBhdGwxX2luaXRfaHcoJmFkYXB0ZXItPmh3KTsKK30KKworLyoKKyAqIGF0bDFfb3BlbiAtIENhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZSBhY3RpdmUKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZQorICoKKyAqIFRoZSBvcGVuIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZQorICogYWN0aXZlIGJ5IHRoZSBzeXN0ZW0gKElGRl9VUCkuICBBdCB0aGlzIHBvaW50IGFsbCByZXNvdXJjZXMgbmVlZGVkCisgKiBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmUgb3BlcmF0aW9ucyBhcmUgYWxsb2NhdGVkLCB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT1MsIHRoZSB3YXRjaGRvZyB0aW1lciBpcyBzdGFydGVkLAorICogYW5kIHRoZSBzdGFjayBpcyBub3RpZmllZCB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgcmVhZHkuCisgKi8KK3N0YXRpYyBpbnQgYXRsMV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGVycjsKKworCS8qIGFsbG9jYXRlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCisJZXJyID0gYXRsMV9zZXR1cF9yaW5nX3Jlc291cmNlcyhhZGFwdGVyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYXRsMV91cChhZGFwdGVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl91cDsKKworCXJldHVybiAwOworCitlcnJfdXA6CisJYXRsMV9yZXNldChhZGFwdGVyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogYXRsMV9jbG9zZSAtIERpc2FibGVzIGEgbmV0d29yayBpbnRlcmZhY2UKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAsIHRoaXMgaXMgbm90IGFsbG93ZWQgdG8gZmFpbAorICoKKyAqIFRoZSBjbG9zZSBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbiBhbiBpbnRlcmZhY2UgaXMgZGUtYWN0aXZhdGVkCisgKiBieSB0aGUgT1MuICBUaGUgaGFyZHdhcmUgaXMgc3RpbGwgdW5kZXIgdGhlIGRyaXZlcnMgY29udHJvbCwgYnV0CisgKiBuZWVkcyB0byBiZSBkaXNhYmxlZC4gIEEgZ2xvYmFsIE1BQyByZXNldCBpcyBpc3N1ZWQgdG8gc3RvcCB0aGUKKyAqIGhhcmR3YXJlLCBhbmQgYWxsIHRyYW5zbWl0IGFuZCByZWNlaXZlIHJlc291cmNlcyBhcmUgZnJlZWQuCisgKi8KK3N0YXRpYyBpbnQgYXRsMV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWF0bDFfZG93bihhZGFwdGVyKTsKKwlhdGwxX2ZyZWVfcmluZ19yZXNvdXJjZXMoYWRhcHRlcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJZiBUUEQgQnVmZmVyIHNpemUgZXF1YWwgdG8gMCwgUENJRSBETUFSX1RPX0lOVAorICogd2lsbCBhc3NlcnQuIFdlIGRvIHNvZnQgcmVzZXQgPDB4MTQwMD0xPiBhY2NvcmRpbmcKKyAqIHdpdGggdGhlIFNQRUMuIEJVVCwgaXQgc2VlbWVzIHRoYXQgUENJRSBvciBETUEKKyAqIHN0YXRlLW1hY2hpbmUgd2lsbCBub3QgYmUgcmVzZXQuIERNQVJfVE9fSU5UIHdpbGwKKyAqIGFzc2VydCBhZ2FpbiBhbmQgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfdHhfdGltZW91dF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGwxX2FkYXB0ZXIsIHR4X3RpbWVvdXRfdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKwlhdGwxX2Rvd24oYWRhcHRlcik7CisJYXRsMV91cChhZGFwdGVyKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7Cit9CisKKy8qCisgKiBhdGwxX2xpbmtfY2hnX3Rhc2sgLSBkZWFsIHdpdGggbGluayBjaGFuZ2UgZXZlbnQgT3V0IG9mIGludGVycnVwdCBjb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfbGlua19jaGdfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9CisgICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0bDFfYWRhcHRlciwgbGlua19jaGdfdGFzayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJYXRsMV9jaGVja19saW5rKGFkYXB0ZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIGF0bDFfcGNpZV9wYXRjaCAtIFBhdGNoIGZvciBQQ0lFIG1vZHVsZQorICovCitzdGF0aWMgdm9pZCBhdGwxX3BjaWVfcGF0Y2goc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgdmFsdWU7CisJdmFsdWUgPSAweDY1MDA7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgMHgxMkZDKTsKKwkvKiBwY2llIGZsb3cgY29udHJvbCBtb2RlIGNoYW5nZSAqLworCXZhbHVlID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIDB4MTAwOCk7CisJdmFsdWUgfD0gMHg4MDAwOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIDB4MTAwOCk7Cit9CisKKy8qCisgKiBXaGVuIEFDUEkgcmVzdW1lIG9uIHNvbWUgVklBIE1vdGhlckJvYXJkLCB0aGUgSW50ZXJydXB0IERpc2FibGUgYml0LzB4NDAwCisgKiBvbiBQQ0kgQ29tbWFuZCByZWdpc3RlciBpcyBkaXNhYmxlLgorICogVGhlIGZ1bmN0aW9uIGVuYWJsZSB0aGlzIGJpdC4KKyAqIEJyYWNrZXR0LCAyMDA2LzAzLzE1CisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfdmlhX3dvcmthcm91bmQoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJdmFsdWUgPSBpb3JlYWQxNihhZGFwdGVyLT5ody5od19hZGRyICsgUENJX0NPTU1BTkQpOworCWlmICh2YWx1ZSAmIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSkKKwkJdmFsdWUgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKKwlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBQQ0lfQ09NTUFORCk7Cit9CisKKy8qCisgKiBhdGwxX3Byb2JlIC0gRGV2aWNlIEluaXRpYWxpemF0aW9uIFJvdXRpbmUKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdAorICogQGVudDogZW50cnkgaW4gYXRsMV9wY2lfdGJsCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqCisgKiBhdGwxX3Byb2JlIGluaXRpYWxpemVzIGFuIGFkYXB0ZXIgaWRlbnRpZmllZCBieSBhIHBjaV9kZXYgc3RydWN0dXJlLgorICogVGhlIE9TIGluaXRpYWxpemF0aW9uLCBjb25maWd1cmluZyBvZiB0aGUgYWRhcHRlciBwcml2YXRlIHN0cnVjdHVyZSwKKyAqIGFuZCBhIGhhcmR3YXJlIHJlc2V0IG9jY3VyLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdGwxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RhdGljIGludCBjYXJkc19mb3VuZCA9IDA7CisJYm9vbCBwY2lfdXNpbmdfNjQgPSB0cnVlOworCWludCBlcnI7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSyk7CisJaWYgKGVycikgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkiJXM6IG5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvbiwgYWJvcnRpbmdcbiIsCisJCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJCQlnb3RvIGVycl9kbWE7CisJCX0KKwkJcGNpX3VzaW5nXzY0ID0gZmFsc2U7CisJfQorCS8qIE1hcmsgYWxsIFBDSSByZWdpb25zIGFzc29jaWF0ZWQgd2l0aCBQQ0kgZGV2aWNlCisJICogcGRldiBhcyBiZWluZyByZXNlcnZlZCBieSBvd25lciBhdGwxX2RyaXZlcl9uYW1lCisJICovCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBhdGwxX2RyaXZlcl9uYW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZXF1ZXN0X3JlZ2lvbnM7CisKKwkvKiBFbmFibGVzIGJ1cy1tYXN0ZXJpbmcgb24gdGhlIGRldmljZSBhbmQgY2FsbHMKKwkgKiBwY2liaW9zX3NldF9tYXN0ZXIgdG8gZG8gdGhlIG5lZWRlZCBhcmNoIHNwZWNpZmljIHNldHRpbmdzCisJICovCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGF0bDFfYWRhcHRlcikpOworCWlmICghbmV0ZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX2V0aGVyZGV2OworCX0KKwlTRVRfTU9EVUxFX09XTkVSKG5ldGRldik7CisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZXRkZXYpOworCWFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsKKwlhZGFwdGVyLT5wZGV2ID0gcGRldjsKKwlhZGFwdGVyLT5ody5iYWNrID0gYWRhcHRlcjsKKworCWFkYXB0ZXItPmh3Lmh3X2FkZHIgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7CisJaWYgKCFhZGFwdGVyLT5ody5od19hZGRyKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX3BjaV9pb21hcDsKKwl9CisJLyogZ2V0IGRldmljZSByZXZpc2lvbiBudW1iZXIgKi8KKwlhZGFwdGVyLT5ody5kZXZfcmV2ID0gaW9yZWFkMTYoYWRhcHRlci0+aHcuaHdfYWRkciArIChSRUdfTUFTVEVSX0NUUkwgKyAyKSk7CisKKwkvKiBzZXQgZGVmYXVsdCByaW5nIHJlc291cmNlIGNvdW50cyAqLworCWFkYXB0ZXItPnJmZF9yaW5nLmNvdW50ID0gYWRhcHRlci0+cnJkX3JpbmcuY291bnQgPSBBVEwxX0RFRkFVTFRfUkZEOworCWFkYXB0ZXItPnRwZF9yaW5nLmNvdW50ID0gQVRMMV9ERUZBVUxUX1RQRDsKKworCWFkYXB0ZXItPm1paS5kZXYgPSBuZXRkZXY7CisJYWRhcHRlci0+bWlpLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKwlhZGFwdGVyLT5taWkubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisJYWRhcHRlci0+bWlpLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlhZGFwdGVyLT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKKworCW5ldGRldi0+b3BlbiA9ICZhdGwxX29wZW47CisJbmV0ZGV2LT5zdG9wID0gJmF0bDFfY2xvc2U7CisJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmYXRsMV94bWl0X2ZyYW1lOworCW5ldGRldi0+Z2V0X3N0YXRzID0gJmF0bDFfZ2V0X3N0YXRzOworCW5ldGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmF0bDFfc2V0X211bHRpOworCW5ldGRldi0+c2V0X21hY19hZGRyZXNzID0gJmF0bDFfc2V0X21hYzsKKwluZXRkZXYtPmNoYW5nZV9tdHUgPSAmYXRsMV9jaGFuZ2VfbXR1OworCW5ldGRldi0+ZG9faW9jdGwgPSAmYXRsMV9pb2N0bDsKKwluZXRkZXYtPnR4X3RpbWVvdXQgPSAmYXRsMV90eF90aW1lb3V0OworCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7CisJbmV0ZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gYXRsMV92bGFuX3J4X3JlZ2lzdGVyOworCW5ldGRldi0+dmxhbl9yeF9hZGRfdmlkID0gYXRsMV92bGFuX3J4X2FkZF92aWQ7CisJbmV0ZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gYXRsMV92bGFuX3J4X2tpbGxfdmlkOworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmYXRsMV9ldGh0b29sX29wczsKKwlhZGFwdGVyLT5iZF9udW1iZXIgPSBjYXJkc19mb3VuZDsKKwlhZGFwdGVyLT5wY2lfdXNpbmdfNjQgPSBwY2lfdXNpbmdfNjQ7CisKKwkvKiBzZXR1cCB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwllcnIgPSBhdGwxX3N3X2luaXQoYWRhcHRlcik7CisJaWYgKGVycikKKwkJZ290byBlcnJfY29tbW9uOworCisJbmV0ZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfSFdfQ1NVTTsKKwluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0c7CisJbmV0ZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYKTsKKworCS8qCisJICogRklYTUUgLSBVbnRpbCB0c28gcGVyZm9ybWFuY2UgZ2V0cyBmaXhlZCwgZGlzYWJsZSB0aGUgZmVhdHVyZS4KKwkgKiBFbmFibGUgaXQgd2l0aCBldGh0b29sIC1LIGlmIGRlc2lyZWQuCisJICovCisJLyogbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsgKi8KKworCWlmIChwY2lfdXNpbmdfNjQpCisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCisJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CisKKwkvKgorCSAqIHBhdGNoIGZvciBzb21lIEwxIG9mIG9sZCB2ZXJzaW9uLAorCSAqIHRoZSBmaW5hbCB2ZXJzaW9uIG9mIEwxIG1heSBub3QgbmVlZCB0aGVzZQorCSAqIHBhdGNoZXMKKwkgKi8KKwkvKiBhdGwxX3BjaWVfcGF0Y2goYWRhcHRlcik7ICovCisKKwkvKiByZWFsbHkgcmVzZXQgR1BIWSBjb3JlICovCisJaW93cml0ZTE2KDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfR1BIWV9FTkFCTEUpOworCisJLyoKKwkgKiByZXNldCB0aGUgY29udHJvbGxlciB0bworCSAqIHB1dCB0aGUgZGV2aWNlIGluIGEga25vd24gZ29vZCBzdGFydGluZyBzdGF0ZQorCSAqLworCWlmIChhdGwxX3Jlc2V0X2h3KCZhZGFwdGVyLT5odykpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfY29tbW9uOworCX0KKworCS8qIGNvcHkgdGhlIE1BQyBhZGRyZXNzIG91dCBvZiB0aGUgRUVQUk9NICovCisJYXRsMV9yZWFkX21hY19hZGRyKCZhZGFwdGVyLT5odyk7CisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPmh3Lm1hY19hZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9jb21tb247CisJfQorCisJYXRsMV9jaGVja19vcHRpb25zKGFkYXB0ZXIpOworCisJLyogcHJlLWluaXQgdGhlIE1BQywgYW5kIHNldHVwIGxpbmsgKi8KKwllcnIgPSBhdGwxX2luaXRfaHcoJmFkYXB0ZXItPmh3KTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2NvbW1vbjsKKwl9CisKKwlhdGwxX3BjaWVfcGF0Y2goYWRhcHRlcik7CisJLyogYXNzdW1lIHdlIGhhdmUgbm8gbGluayBmb3Igbm93ICovCisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwlpbml0X3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CisJYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIuZnVuY3Rpb24gPSAmYXRsMV93YXRjaGRvZzsKKwlhZGFwdGVyLT53YXRjaGRvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpYWRhcHRlcjsKKworCWluaXRfdGltZXIoJmFkYXB0ZXItPnBoeV9jb25maWdfdGltZXIpOworCWFkYXB0ZXItPnBoeV9jb25maWdfdGltZXIuZnVuY3Rpb24gPSAmYXRsMV9waHlfY29uZmlnOworCWFkYXB0ZXItPnBoeV9jb25maWdfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWFkYXB0ZXI7CisJYWRhcHRlci0+cGh5X3RpbWVyX3BlbmRpbmcgPSBmYWxzZTsKKworCUlOSVRfV09SSygmYWRhcHRlci0+dHhfdGltZW91dF90YXNrLCBhdGwxX3R4X3RpbWVvdXRfdGFzayk7CisKKwlJTklUX1dPUksoJmFkYXB0ZXItPmxpbmtfY2hnX3Rhc2ssIGF0bDFfbGlua19jaGdfdGFzayk7CisKKwlJTklUX1dPUksoJmFkYXB0ZXItPnBjaWVfZG1hX3RvX3JzdF90YXNrLCBhdGwxX3R4X3RpbWVvdXRfdGFzayk7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9jb21tb247CisKKwljYXJkc19mb3VuZCsrOworCWF0bDFfdmlhX3dvcmthcm91bmQoYWRhcHRlcik7CisJcmV0dXJuIDA7CisKK2Vycl9jb21tb246CisJcGNpX2lvdW5tYXAocGRldiwgYWRhcHRlci0+aHcuaHdfYWRkcik7CitlcnJfcGNpX2lvbWFwOgorCWZyZWVfbmV0ZGV2KG5ldGRldik7CitlcnJfYWxsb2NfZXRoZXJkZXY6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9kbWE6CitlcnJfcmVxdWVzdF9yZWdpb25zOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogYXRsMV9yZW1vdmUgLSBEZXZpY2UgUmVtb3ZhbCBSb3V0aW5lCisgKiBAcGRldjogUENJIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3QKKyAqCisgKiBhdGwxX3JlbW92ZSBpcyBjYWxsZWQgYnkgdGhlIFBDSSBzdWJzeXN0ZW0gdG8gYWxlcnQgdGhlIGRyaXZlcgorICogdGhhdCBpdCBzaG91bGQgcmVsZWFzZSBhIFBDSSBkZXZpY2UuICBUaGUgY291bGQgYmUgY2F1c2VkIGJ5IGEKKyAqIEhvdC1QbHVnIGV2ZW50LCBvciBiZWNhdXNlIHRoZSBkcml2ZXIgaXMgZ29pbmcgdG8gYmUgcmVtb3ZlZCBmcm9tCisgKiBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhdGwxX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXI7CisJLyogRGV2aWNlIG5vdCBhdmFpbGFibGUuIFJldHVybi4gKi8KKwlpZiAoIW5ldGRldikKKwkJcmV0dXJuOworCisJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW93cml0ZTE2KDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfR1BIWV9FTkFCTEUpOworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJcGNpX2lvdW5tYXAocGRldiwgYWRhcHRlci0+aHcuaHdfYWRkcik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhdGwxX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MzIgY3RybCA9IDA7CisJdTMyIHd1ZmMgPSBhZGFwdGVyLT53b2w7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYXRsMV9kb3duKGFkYXB0ZXIpOworCisJYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAodTE2ICopICYgY3RybCk7CisJYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAodTE2ICopICYgY3RybCk7CisJaWYgKGN0cmwgJiBCTVNSX0xTVEFUVVMpCisJCXd1ZmMgJj0gfkFUTDFfV1VGQ19MTktDOworCisJLyogcmVkdWNlIHNwZWVkIHRvIDEwLzEwME0gKi8KKwlpZiAod3VmYykgeworCQlhdGwxX3BoeV9lbnRlcl9wb3dlcl9zYXZpbmcoaHcpOworCQkvKiBpZiByZXN1bWUsIGxldCBkcml2ZXIgdG8gcmUtIHNldHVwIGxpbmsgKi8KKwkJaHctPnBoeV9jb25maWd1cmVkID0gZmFsc2U7CisJCWF0bDFfc2V0X21hY19hZGRyKGh3KTsKKwkJYXRsMV9zZXRfbXVsdGkobmV0ZGV2KTsKKworCQljdHJsID0gMDsKKwkJLyogdHVybiBvbiBtYWdpYyBwYWNrZXQgd29sICovCisJCWlmICh3dWZjICYgQVRMMV9XVUZDX01BRykKKwkJCWN0cmwgPSBXT0xfTUFHSUNfRU4gfCBXT0xfTUFHSUNfUE1FX0VOOworCisJCS8qIHR1cm4gb24gTGluayBjaGFuZ2UgV09MICovCisJCWlmICh3dWZjICYgQVRMMV9XVUZDX0xOS0MpCisJCQljdHJsIHw9IChXT0xfTElOS19DSEdfRU4gfCBXT0xfTElOS19DSEdfUE1FX0VOKTsKKwkJaW93cml0ZTMyKGN0cmwsIGh3LT5od19hZGRyICsgUkVHX1dPTF9DVFJMKTsKKworCQkvKiB0dXJuIG9uIGFsbC1tdWx0aSBtb2RlIGlmIHdha2Ugb24gbXVsdGljYXN0IGlzIGVuYWJsZWQgKi8KKwkJY3RybCA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwkJY3RybCAmPSB+TUFDX0NUUkxfREJHOworCQljdHJsICY9IH5NQUNfQ1RSTF9QUk9NSVNfRU47CisJCWlmICh3dWZjICYgQVRMMV9XVUZDX01DKQorCQkJY3RybCB8PSBNQUNfQ1RSTF9NQ19BTExfRU47CisJCWVsc2UKKwkJCWN0cmwgJj0gfk1BQ19DVFJMX01DX0FMTF9FTjsKKworCQkvKiB0dXJuIG9uIGJyb2FkY2FzdCBtb2RlIGlmIHdha2Ugb24tQkMgaXMgZW5hYmxlZCAqLworCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19CQykKKwkJCWN0cmwgfD0gTUFDX0NUUkxfQkNfRU47CisJCWVsc2UKKwkJCWN0cmwgJj0gfk1BQ19DVFJMX0JDX0VOOworCisJCS8qIGVuYWJsZSBSWCAqLworCQljdHJsIHw9IE1BQ19DVFJMX1JYX0VOOworCQlpb3dyaXRlMzIoY3RybCwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAxKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDEpOwkvKiA0ID09IEQzIGNvbGQgKi8KKwl9IGVsc2UgeworCQlpb3dyaXRlMzIoMCwgaHctPmh3X2FkZHIgKyBSRUdfV09MX0NUUkwpOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwkvKiA0ID09IEQzIGNvbGQgKi8KKwl9CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGwxX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUzMiByZXRfdmFsOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCXJldF92YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CisKKwlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19XT0xfQ1RSTCk7CisJYXRsMV9yZXNldChhZGFwdGVyKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWF0bDFfdXAoYWRhcHRlcik7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCisJYXRsMV92aWFfd29ya2Fyb3VuZChhZGFwdGVyKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYXRsMV9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgYXRsMV9yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhdGwxX2RyaXZlciA9IHsKKwkubmFtZSA9IGF0bDFfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlID0gYXRsMV9wY2lfdGJsLAorCS5wcm9iZSA9IGF0bDFfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGF0bDFfcmVtb3ZlKSwKKwkvKiBQb3dlciBNYW5hZ21lbnQgSG9va3MgKi8KKwkvKiBwcm9iYWJseSBicm9rZW4gcmlnaHQgbm93IC0tIENIUyAqLworCS5zdXNwZW5kID0gYXRsMV9zdXNwZW5kLAorCS5yZXN1bWUgPSBhdGwxX3Jlc3VtZQorfTsKKworLyoKKyAqIGF0bDFfZXhpdF9tb2R1bGUgLSBEcml2ZXIgRXhpdCBDbGVhbnVwIFJvdXRpbmUKKyAqCisgKiBhdGwxX2V4aXRfbW9kdWxlIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgZHJpdmVyIGlzIHJlbW92ZWQKKyAqIGZyb20gbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRsMV9leGl0X21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYXRsMV9kcml2ZXIpOworfQorCisvKgorICogYXRsMV9pbml0X21vZHVsZSAtIERyaXZlciBSZWdpc3RyYXRpb24gUm91dGluZQorICoKKyAqIGF0bDFfaW5pdF9tb2R1bGUgaXMgdGhlIGZpcnN0IHJvdXRpbmUgY2FsbGVkIHdoZW4gdGhlIGRyaXZlciBpcworICogbG9hZGVkLiBBbGwgaXQgZG9lcyBpcyByZWdpc3RlciB3aXRoIHRoZSBQQ0kgc3Vic3lzdGVtLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhdGwxX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgLSB2ZXJzaW9uICVzXG4iLCBhdGwxX2RyaXZlcl9zdHJpbmcsIERSSVZFUl9WRVJTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgYXRsMV9jb3B5cmlnaHQpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhdGwxX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF0bDFfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYXRsMV9leGl0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfcGFyYW0uYyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9wYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MDcyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfcGFyYW0uYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAwNiBBdHRhbnNpYyBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDA2IENocmlzIFNub29rIDxjc25vb2tAcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodChjKSAyMDA2IEpheSBDbGlidXJuIDxqY2xpYnVybkBnbWFpbC5jb20+CisgKgorICogRGVyaXZlZCBmcm9tIEludGVsIGUxMDAwIGRyaXZlcgorICogQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSAiYXRsMS5oIgorCisvKgorICogVGhpcyBpcyB0aGUgb25seSB0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYWRqdXN0IHRoZQorICogbWF4aW11bSBudW1iZXIgb2YgcG9ydHMgdGhhdCB0aGUgZHJpdmVyIGNhbiBtYW5hZ2UuCisgKi8KKyNkZWZpbmUgQVRMMV9NQVhfTklDIDQKKworI2RlZmluZSBPUFRJT05fVU5TRVQgICAgLTEKKyNkZWZpbmUgT1BUSU9OX0RJU0FCTEVEIDAKKyNkZWZpbmUgT1BUSU9OX0VOQUJMRUQgIDEKKworI2RlZmluZSBBVEwxX1BBUkFNX0lOSVQgeyBbMCAuLi4gQVRMMV9NQVhfTklDXSA9IE9QVElPTl9VTlNFVCB9CisKKy8qCisgKiBJbnRlcnJ1cHQgTW9kZXJhdGUgVGltZXIgaW4gdW5pdHMgb2YgMiB1cworICoKKyAqIFZhbGlkIFJhbmdlOiAxMC02NTUzNQorICoKKyAqIERlZmF1bHQgVmFsdWU6IDEwMCAoMjAwdXMpCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0ZGF0YSBpbnRfbW9kX3RpbWVyW0FUTDFfTUFYX05JQysxXSA9IEFUTDFfUEFSQU1fSU5JVDsKK3N0YXRpYyBpbnQgbnVtX2ludF9tb2RfdGltZXIgPSAwOworbW9kdWxlX3BhcmFtX2FycmF5X25hbWVkKGludF9tb2RfdGltZXIsIGludF9tb2RfdGltZXIsIGludCwgJm51bV9pbnRfbW9kX3RpbWVyLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW50X21vZF90aW1lciwgIkludGVycnVwdCBtb2RlcmF0b3IgdGltZXIiKTsKKworLyoKKyAqIGZsYXNoX3ZlbmRvcgorICoKKyAqIFZhbGlkIFJhbmdlOiAwLTIKKyAqCisgKiAwIC0gQXRtZWwKKyAqIDEgLSBTU1QKKyAqIDIgLSBTVAorICoKKyAqIERlZmF1bHQgVmFsdWU6IDAKKyAqLworc3RhdGljIGludCBfX2RldmluaXRkYXRhIGZsYXNoX3ZlbmRvcltBVEwxX01BWF9OSUMrMV0gPSBBVEwxX1BBUkFNX0lOSVQ7CitzdGF0aWMgaW50IG51bV9mbGFzaF92ZW5kb3IgPSAwOworbW9kdWxlX3BhcmFtX2FycmF5X25hbWVkKGZsYXNoX3ZlbmRvciwgZmxhc2hfdmVuZG9yLCBpbnQsICZudW1fZmxhc2hfdmVuZG9yLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZmxhc2hfdmVuZG9yLCAiU1BJIGZsYXNoIHZlbmRvciIpOworCisjZGVmaW5lIERFRkFVTFRfSU5UX01PRF9DTlQJMTAwCS8qIDIwMHVzICovCisjZGVmaW5lIE1BWF9JTlRfTU9EX0NOVAkJNjUwMDAKKyNkZWZpbmUgTUlOX0lOVF9NT0RfQ05UCQk1MAorCisjZGVmaW5lIEZMQVNIX1ZFTkRPUl9ERUZBVUxUCTAKKyNkZWZpbmUgRkxBU0hfVkVORE9SX01JTgkwCisjZGVmaW5lIEZMQVNIX1ZFTkRPUl9NQVgJMgorCitzdHJ1Y3QgYXRsMV9vcHRpb24geworCWVudW0geyBlbmFibGVfb3B0aW9uLCByYW5nZV9vcHRpb24sIGxpc3Rfb3B0aW9uIH0gdHlwZTsKKwljaGFyICpuYW1lOworCWNoYXIgKmVycjsKKwlpbnQgZGVmOworCXVuaW9uIHsKKwkJc3RydWN0IHsJLyogcmFuZ2Vfb3B0aW9uIGluZm8gKi8KKwkJCWludCBtaW47CisJCQlpbnQgbWF4OworCQl9IHI7CisJCXN0cnVjdCB7CS8qIGxpc3Rfb3B0aW9uIGluZm8gKi8KKwkJCWludCBucjsKKwkJCXN0cnVjdCBhdGwxX29wdF9saXN0IHsKKwkJCQlpbnQgaTsKKwkJCQljaGFyICpzdHI7CisJCQl9ICpwOworCQl9IGw7CisJfSBhcmc7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdGwxX3ZhbGlkYXRlX29wdGlvbihpbnQgKnZhbHVlLCBzdHJ1Y3QgYXRsMV9vcHRpb24gKm9wdCkKK3sKKwlpZiAoKnZhbHVlID09IE9QVElPTl9VTlNFVCkgeworCQkqdmFsdWUgPSBvcHQtPmRlZjsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChvcHQtPnR5cGUpIHsKKwljYXNlIGVuYWJsZV9vcHRpb246CisJCXN3aXRjaCAoKnZhbHVlKSB7CisJCWNhc2UgT1BUSU9OX0VOQUJMRUQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgRW5hYmxlZFxuIiwgYXRsMV9kcml2ZXJfbmFtZSwKKwkJCQlvcHQtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgT1BUSU9OX0RJU0FCTEVEOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIERpc2FibGVkXG4iLCBhdGwxX2RyaXZlcl9uYW1lLAorCQkJCW9wdC0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIHJhbmdlX29wdGlvbjoKKwkJaWYgKCp2YWx1ZSA+PSBvcHQtPmFyZy5yLm1pbiAmJiAqdmFsdWUgPD0gb3B0LT5hcmcuci5tYXgpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBzZXQgdG8gJWlcbiIsCisJCQkJYXRsMV9kcml2ZXJfbmFtZSwgb3B0LT5uYW1lLCAqdmFsdWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBsaXN0X29wdGlvbjp7CisJCQlpbnQgaTsKKwkJCXN0cnVjdCBhdGwxX29wdF9saXN0ICplbnQ7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBvcHQtPmFyZy5sLm5yOyBpKyspIHsKKwkJCQllbnQgPSAmb3B0LT5hcmcubC5wW2ldOworCQkJCWlmICgqdmFsdWUgPT0gZW50LT5pKSB7CisJCQkJCWlmIChlbnQtPnN0clswXSAhPSAnXDAnKQorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzXG4iLAorCQkJCQkJICAgICAgIGF0bDFfZHJpdmVyX25hbWUsIGVudC0+c3RyKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgJXMgc3BlY2lmaWVkICglaSkgJXNcbiIsCisJICAgICAgIGF0bDFfZHJpdmVyX25hbWUsIG9wdC0+bmFtZSwgKnZhbHVlLCBvcHQtPmVycik7CisJKnZhbHVlID0gb3B0LT5kZWY7CisJcmV0dXJuIC0xOworfQorCisvKgorICogYXRsMV9jaGVja19vcHRpb25zIC0gUmFuZ2UgQ2hlY2tpbmcgZm9yIENvbW1hbmQgTGluZSBQYXJhbWV0ZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgY2hlY2tzIGFsbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyBmb3IgdmFsaWQgdXNlcgorICogaW5wdXQuICBJZiBhbiBpbnZhbGlkIHZhbHVlIGlzIGdpdmVuLCBvciBpZiBubyB1c2VyIHNwZWNpZmllZAorICogdmFsdWUgZXhpc3RzLCBhIGRlZmF1bHQgdmFsdWUgaXMgdXNlZC4gIFRoZSBmaW5hbCB2YWx1ZSBpcyBzdG9yZWQKKyAqIGluIGEgdmFyaWFibGUgaW4gdGhlIGFkYXB0ZXIgc3RydWN0dXJlLgorICovCit2b2lkIF9fZGV2aW5pdCBhdGwxX2NoZWNrX29wdGlvbnMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgYmQgPSBhZGFwdGVyLT5iZF9udW1iZXI7CisJaWYgKGJkID49IEFUTDFfTUFYX05JQykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB3YXJuaW5nOiBubyBjb25maWd1cmF0aW9uIGZvciBib2FyZCAjJWlcbiIsCisJCQlhdGwxX2RyaXZlcl9uYW1lLCBiZCk7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHVzaW5nIGRlZmF1bHRzIGZvciBhbGwgdmFsdWVzXG4iLAorCQkJYXRsMV9kcml2ZXJfbmFtZSk7CisJfQorCXsJCQkvKiBJbnRlcnJ1cHQgTW9kZXJhdGUgVGltZXIgKi8KKwkJc3RydWN0IGF0bDFfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiSW50ZXJydXB0IE1vZGVyYXRvciBUaW1lciIsCisJCQkuZXJyID0gInVzaW5nIGRlZmF1bHQgb2YgIgorCQkJCV9fTU9EVUxFX1NUUklORyhERUZBVUxUX0lOVF9NT0RfQ05UKSwKKwkJCS5kZWYgPSBERUZBVUxUX0lOVF9NT0RfQ05ULAorCQkJLmFyZyA9IHsuciA9CisJCQkJey5taW4gPSBNSU5fSU5UX01PRF9DTlQsLm1heCA9IE1BWF9JTlRfTU9EX0NOVH19CisJCX07CisJCWludCB2YWw7CisJCWlmIChudW1faW50X21vZF90aW1lciA+IGJkKSB7CisJCQl2YWwgPSBpbnRfbW9kX3RpbWVyW2JkXTsKKwkJCWF0bDFfdmFsaWRhdGVfb3B0aW9uKCZ2YWwsICZvcHQpOworCQkJYWRhcHRlci0+aW10ID0gKHUxNikgdmFsOworCQl9IGVsc2UKKwkJCWFkYXB0ZXItPmltdCA9ICh1MTYpIChvcHQuZGVmKTsKKwl9CisKKwl7CQkJLyogRmxhc2ggVmVuZG9yICovCisJCXN0cnVjdCBhdGwxX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIlNQSSBGbGFzaCBWZW5kb3IiLAorCQkJLmVyciA9ICJ1c2luZyBkZWZhdWx0IG9mICIKKwkJCQlfX01PRFVMRV9TVFJJTkcoRkxBU0hfVkVORE9SX0RFRkFVTFQpLAorCQkJLmRlZiA9IERFRkFVTFRfSU5UX01PRF9DTlQsCisJCQkuYXJnID0gey5yID0KKwkJCQl7Lm1pbiA9IEZMQVNIX1ZFTkRPUl9NSU4sLm1heCA9CisJCQkJIEZMQVNIX1ZFTkRPUl9NQVh9fQorCQl9OworCQlpbnQgdmFsOworCQlpZiAobnVtX2ZsYXNoX3ZlbmRvciA+IGJkKSB7CisJCQl2YWwgPSBmbGFzaF92ZW5kb3JbYmRdOworCQkJYXRsMV92YWxpZGF0ZV9vcHRpb24oJnZhbCwgJm9wdCk7CisJCQlhZGFwdGVyLT5ody5mbGFzaF92ZW5kb3IgPSAodTgpIHZhbDsKKwkJfSBlbHNlCisJCQlhZGFwdGVyLT5ody5mbGFzaF92ZW5kb3IgPSAodTgpIChvcHQuZGVmKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKaW5kZXggMzI5MjMxNi4uMjE3YTJlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmKGJvbmRfaW5mby0+dHhfaGFzaHRibF9sb2NrKSk7CiAKLQluZXdfaGFzaHRibCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbmV3X2hhc2h0YmwgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghbmV3X2hhc2h0YmwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCiAJCSAgICAgICAiOiAlczogRXJyb3I6IEZhaWxlZCB0byBhbGxvY2F0ZSBUTEIgaGFzaCB0YWJsZVxuIiwKQEAgLTE5NSw4ICsxOTUsNiBAQAogCiAJYm9uZF9pbmZvLT50eF9oYXNodGJsID0gbmV3X2hhc2h0Ymw7CiAKLQltZW1zZXQoYm9uZF9pbmZvLT50eF9oYXNodGJsLCAwLCBzaXplKTsKLQogCWZvciAoaSA9IDA7IGkgPCBUTEJfSEFTSF9UQUJMRV9TSVpFOyBpKyspIHsKIAkJdGxiX2luaXRfdGFibGVfZW50cnkoJmJvbmRfaW5mby0+dHhfaGFzaHRibFtpXSwgMSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggZDM4MDFhMC4uOGNlOGZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC0xMzQzLDE0ICsxMzQzLDEyIEBACiAJCQkiaW5hY2N1cmF0ZS5cbiIsIGJvbmRfZGV2LT5uYW1lLCBzbGF2ZV9kZXYtPm5hbWUpOwogCX0KIAotCW5ld19zbGF2ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbGF2ZSksIEdGUF9LRVJORUwpOworCW5ld19zbGF2ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbGF2ZSksIEdGUF9LRVJORUwpOwogCWlmICghbmV3X3NsYXZlKSB7CiAJCXJlcyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3VuZG9fZmxhZ3M7CiAJfQogCi0JbWVtc2V0KG5ld19zbGF2ZSwgMCwgc2l6ZW9mKHN0cnVjdCBzbGF2ZSkpOwotCiAJLyogc2F2ZSBzbGF2ZSdzIG9yaWdpbmFsIGZsYWdzIGJlZm9yZSBjYWxsaW5nCiAJICogbmV0ZGV2X3NldF9tYXN0ZXIgYW5kIGRldl9vcGVuCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMKaW5kZXggZGZhMDM1YS4uYzY3ZjdkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYwpAQCAtNzQsOCArNzQsNiBAQAogCiAjZGVmaW5lIEVFUFJPTV9NQUdJQyAweDM4RTJGMTBDCiAKLSNkZWZpbmUgdG9fbmV0X2RldihjbGFzcykgY29udGFpbmVyX29mKGNsYXNzLCBzdHJ1Y3QgbmV0X2RldmljZSwgY2xhc3NfZGV2KQotCiAjZGVmaW5lIENIX0RFVklDRShkZXZpZCwgc3NpZCwgaWR4KSBcCiAJeyBQQ0lfVkVORE9SX0lEX0NIRUxTSU8sIGRldmlkLCBQQ0lfQU5ZX0lELCBzc2lkLCAwLCAwLCBpZHggfQogCkBAIC00MzQsMTEgKzQzMiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCBhdHRyX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IGF0dHJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYsCiAJCQkgc3NpemVfdCgqZm9ybWF0KSAoc3RydWN0IGFkYXB0ZXIgKiwgY2hhciAqKSkKIHsKIAlzc2l6ZV90IGxlbjsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHRvX25ldF9kZXYoY2QpLT5wcml2OworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gdG9fbmV0X2RldihkKS0+cHJpdjsKIAogCS8qIFN5bmNocm9uaXplIHdpdGggaW9jdGxzIHRoYXQgbWF5IHNodXQgZG93biB0aGUgZGV2aWNlICovCiAJcnRubF9sb2NrKCk7CkBAIC00NDcsMTQgKzQ0NiwxNSBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGF0dHJfc3RvcmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKK3N0YXRpYyBzc2l6ZV90IGF0dHJfc3RvcmUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKIAkJCSAgc3NpemVfdCgqc2V0KSAoc3RydWN0IGFkYXB0ZXIgKiwgdW5zaWduZWQgaW50KSwKIAkJCSAgdW5zaWduZWQgaW50IG1pbl92YWwsIHVuc2lnbmVkIGludCBtYXhfdmFsKQogewogCWNoYXIgKmVuZHA7CiAJc3NpemVfdCByZXQ7CiAJdW5zaWduZWQgaW50IHZhbDsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHRvX25ldF9kZXYoY2QpLT5wcml2OworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gdG9fbmV0X2RldihkKS0+cHJpdjsKIAogCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTQ3Niw5ICs0NzYsMTAgQEAKIHsgXAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWxfZXhwcik7IFwKIH0gXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI25hbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI25hbWUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJCSAgIGNoYXIgKmJ1ZikgXAogeyBcCi0JcmV0dXJuIGF0dHJfc2hvdyhjZCwgYnVmLCBmb3JtYXRfIyNuYW1lKTsgXAorCXJldHVybiBhdHRyX3Nob3coZCwgYXR0ciwgYnVmLCBmb3JtYXRfIyNuYW1lKTsgXAogfQogCiBzdGF0aWMgc3NpemVfdCBzZXRfbmZpbHRlcnMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB2YWwpCkBAIC00OTMsMTAgKzQ5NCwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9uZmlsdGVycyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY29uc3QgY2hhciAqYnVmLAotCQkJICAgICAgc2l6ZV90IGxlbikKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX25maWx0ZXJzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewotCXJldHVybiBhdHRyX3N0b3JlKGNkLCBidWYsIGxlbiwgc2V0X25maWx0ZXJzLCAwLCB+MCk7CisJcmV0dXJuIGF0dHJfc3RvcmUoZCwgYXR0ciwgYnVmLCBsZW4sIHNldF9uZmlsdGVycywgMCwgfjApOwogfQogCiBzdGF0aWMgc3NpemVfdCBzZXRfbnNlcnZlcnMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB2YWwpCkBAIC01MDksMzggKzUxMCwzOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9uc2VydmVycyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY29uc3QgY2hhciAqYnVmLAotCQkJICAgICAgc2l6ZV90IGxlbikKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX25zZXJ2ZXJzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewotCXJldHVybiBhdHRyX3N0b3JlKGNkLCBidWYsIGxlbiwgc2V0X25zZXJ2ZXJzLCAwLCB+MCk7CisJcmV0dXJuIGF0dHJfc3RvcmUoZCwgYXR0ciwgYnVmLCBsZW4sIHNldF9uc2VydmVycywgMCwgfjApOwogfQogCiAjZGVmaW5lIENYR0IzX0FUVFJfUihuYW1lLCB2YWxfZXhwcikgXAogQ1hHQjNfU0hPVyhuYW1lLCB2YWxfZXhwcikgXAotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKQorc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKQogCiAjZGVmaW5lIENYR0IzX0FUVFJfUlcobmFtZSwgdmFsX2V4cHIsIHN0b3JlX21ldGhvZCkgXAogQ1hHQjNfU0hPVyhuYW1lLCB2YWxfZXhwcikgXAotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93XyMjbmFtZSwgc3RvcmVfbWV0aG9kKQorc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93XyMjbmFtZSwgc3RvcmVfbWV0aG9kKQogCiBDWEdCM19BVFRSX1IoY2FtX3NpemUsIHQzX21jNV9zaXplKCZhZGFwLT5tYzUpKTsKIENYR0IzX0FUVFJfUlcobmZpbHRlcnMsIGFkYXAtPnBhcmFtcy5tYzUubmZpbHRlcnMsIHN0b3JlX25maWx0ZXJzKTsKIENYR0IzX0FUVFJfUlcobnNlcnZlcnMsIGFkYXAtPnBhcmFtcy5tYzUubnNlcnZlcnMsIHN0b3JlX25zZXJ2ZXJzKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmN4Z2IzX2F0dHJzW10gPSB7Ci0JJmNsYXNzX2RldmljZV9hdHRyX2NhbV9zaXplLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX25maWx0ZXJzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX25zZXJ2ZXJzLmF0dHIsCisJJmRldl9hdHRyX2NhbV9zaXplLmF0dHIsCisJJmRldl9hdHRyX25maWx0ZXJzLmF0dHIsCisJJmRldl9hdHRyX25zZXJ2ZXJzLmF0dHIsCiAJTlVMTAogfTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY3hnYjNfYXR0cl9ncm91cCA9IHsuYXR0cnMgPSBjeGdiM19hdHRycyB9OwogCi1zdGF0aWMgc3NpemVfdCB0bV9hdHRyX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZiwgaW50IHNjaGVkKQorc3RhdGljIHNzaXplX3QgdG1fYXR0cl9zaG93KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZiwgaW50IHNjaGVkKQogewogCXNzaXplX3QgbGVuOwogCXVuc2lnbmVkIGludCB2LCBhZGRyLCBicHQsIGNwdDsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHRvX25ldF9kZXYoY2QpLT5wcml2OworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gdG9fbmV0X2RldihkKS0+cHJpdjsKIAogCWFkZHIgPSBBX1RQX1RYX01PRF9RMV9RMF9SQVRFX0xJTUlUIC0gc2NoZWQgLyAyOwogCXJ0bmxfbG9jaygpOwpAQCAtNTYwLDEzICs1NjIsMTMgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgc3NpemVfdCB0bV9hdHRyX3N0b3JlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgIHNpemVfdCBsZW4sIGludCBzY2hlZCkKK3N0YXRpYyBzc2l6ZV90IHRtX2F0dHJfc3RvcmUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgaW50IHNjaGVkKQogewogCWNoYXIgKmVuZHA7CiAJc3NpemVfdCByZXQ7CiAJdW5zaWduZWQgaW50IHZhbDsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHRvX25ldF9kZXYoY2QpLT5wcml2OworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gdG9fbmV0X2RldihkKS0+cHJpdjsKIAogCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTU4NCwxNSArNTg2LDE3IEBACiB9CiAKICNkZWZpbmUgVE1fQVRUUihuYW1lLCBzY2hlZCkgXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI25hbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI25hbWUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJCSAgIGNoYXIgKmJ1ZikgXAogeyBcCi0JcmV0dXJuIHRtX2F0dHJfc2hvdyhjZCwgYnVmLCBzY2hlZCk7IFwKKwlyZXR1cm4gdG1fYXR0cl9zaG93KGQsIGF0dHIsIGJ1Ziwgc2NoZWQpOyBcCiB9IFwKLXN0YXRpYyBzc2l6ZV90IHN0b3JlXyMjbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV8jI25hbWUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pIFwKIHsgXAotCXJldHVybiB0bV9hdHRyX3N0b3JlKGNkLCBidWYsIGxlbiwgc2NoZWQpOyBcCisJcmV0dXJuIHRtX2F0dHJfc3RvcmUoZCwgYXR0ciwgYnVmLCBsZW4sIHNjaGVkKTsgXAogfSBcCi1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfIyNuYW1lLCBzdG9yZV8jI25hbWUpCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfIyNuYW1lLCBzdG9yZV8jI25hbWUpCiAKIFRNX0FUVFIoc2NoZWQwLCAwKTsKIFRNX0FUVFIoc2NoZWQxLCAxKTsKQEAgLTYwNCwxNCArNjA4LDE0IEBACiBUTV9BVFRSKHNjaGVkNywgNyk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpvZmZsb2FkX2F0dHJzW10gPSB7Ci0JJmNsYXNzX2RldmljZV9hdHRyX3NjaGVkMC5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9zY2hlZDEuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfc2NoZWQyLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3NjaGVkMy5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9zY2hlZDQuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfc2NoZWQ1LmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3NjaGVkNi5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9zY2hlZDcuYXR0ciwKKwkmZGV2X2F0dHJfc2NoZWQwLmF0dHIsCisJJmRldl9hdHRyX3NjaGVkMS5hdHRyLAorCSZkZXZfYXR0cl9zY2hlZDIuYXR0ciwKKwkmZGV2X2F0dHJfc2NoZWQzLmF0dHIsCisJJmRldl9hdHRyX3NjaGVkNC5hdHRyLAorCSZkZXZfYXR0cl9zY2hlZDUuYXR0ciwKKwkmZGV2X2F0dHJfc2NoZWQ2LmF0dHIsCisJJmRldl9hdHRyX3NjaGVkNy5hdHRyLAogCU5VTEwKIH07CiAKQEAgLTgzNiw3ICs4NDAsNyBAQAogCWluaXRfc210KGFkYXB0ZXIpOwogCiAJLyogTmV2ZXIgbWluZCBpZiB0aGUgbmV4dCBzdGVwIGZhaWxzICovCi0Jc3lzZnNfY3JlYXRlX2dyb3VwKCZ0ZGV2LT5sbGRldi0+Y2xhc3NfZGV2LmtvYmosICZvZmZsb2FkX2F0dHJfZ3JvdXApOworCXN5c2ZzX2NyZWF0ZV9ncm91cCgmdGRldi0+bGxkZXYtPmRldi5rb2JqLCAmb2ZmbG9hZF9hdHRyX2dyb3VwKTsKIAogCS8qIENhbGwgYmFjayBhbGwgcmVnaXN0ZXJlZCBjbGllbnRzICovCiAJY3hnYjNfYWRkX2NsaWVudHModGRldik7CkBAIC04NjEsNyArODY1LDcgQEAKIAkvKiBDYWxsIGJhY2sgYWxsIHJlZ2lzdGVyZWQgY2xpZW50cyAqLwogCWN4Z2IzX3JlbW92ZV9jbGllbnRzKHRkZXYpOwogCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZ0ZGV2LT5sbGRldi0+Y2xhc3NfZGV2LmtvYmosICZvZmZsb2FkX2F0dHJfZ3JvdXApOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmdGRldi0+bGxkZXYtPmRldi5rb2JqLCAmb2ZmbG9hZF9hdHRyX2dyb3VwKTsKIAogCXRkZXYtPmxsZGV2ID0gTlVMTDsKIAljeGdiM19zZXRfZHVtbXlfb3BzKHRkZXYpOwpAQCAtMjQyMCw3ICsyNDI0LDcgQEAKIAllbHNlIGlmIChtc2kgPiAwICYmIHBjaV9lbmFibGVfbXNpKHBkZXYpID09IDApCiAJCWFkYXB0ZXItPmZsYWdzIHw9IFVTSU5HX01TSTsKIAotCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmYWRhcHRlci0+cG9ydFswXS0+Y2xhc3NfZGV2LmtvYmosCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZhZGFwdGVyLT5wb3J0WzBdLT5kZXYua29iaiwKIAkJCQkgJmN4Z2IzX2F0dHJfZ3JvdXApOwogCiAJcHJpbnRfcG9ydF9pbmZvKGFkYXB0ZXIsIGFpKTsKQEAgLTI0NTIsNyArMjQ1Niw3IEBACiAJCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OwogCiAJCXQzX3NnZV9zdG9wKGFkYXB0ZXIpOwotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmFkYXB0ZXItPnBvcnRbMF0tPmNsYXNzX2Rldi5rb2JqLAorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmFkYXB0ZXItPnBvcnRbMF0tPmRldi5rb2JqLAogCQkJCSAgICZjeGdiM19hdHRyX2dyb3VwKTsKIAogCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMKaW5kZXggYzNhMDJkNi4uYzZiNzI2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJCQkJaW50IG4pCiB7CiAJQ0hfRVJSKHRkZXYyYWRhcChkZXYpLCAiJWQgdW5leHBlY3RlZCBvZmZsb2FkIHBhY2tldHMsIGZpcnN0IGRhdGEgJXVcbiIsCi0JICAgICAgIG4sIG50b2hsKCoodTMyICopc2tic1swXS0+ZGF0YSkpOworCSAgICAgICBuLCBudG9obCgqKF9fYmUzMiAqKXNrYnNbMF0tPmRhdGEpKTsKIAl3aGlsZSAobi0tKQogCQlkZXZfa2ZyZWVfc2tiX2FueShza2JzW25dKTsKIAlyZXR1cm4gMDsKQEAgLTc1NSw3ICs3NTUsNyBAQAogewogCXN0cnVjdCBjcGxfdHJhY2VfcGt0ICpwID0gY3BsaGRyKHNrYik7CiAKLQlza2ItPnByb3RvY29sID0gMHhmZmZmOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucygweGZmZmYpOwogCXNrYi0+ZGV2ID0gZGV2LT5sbGRldjsKIAlza2JfcHVsbChza2IsIHNpemVvZigqcCkpOwogCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UyMTAwLmMgYi9kcml2ZXJzL25ldC9lMjEwMC5jCmluZGV4IGM2MmQ5YzYuLmIyYjBhOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UyMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTIxMDAuYwpAQCAtMzU1LDggKzM1NSw3IEBACiAKIAltZW1fb24oaW9hZGRyLCBzaGFyZWRfbWVtLCAocmluZ19vZmZzZXQ+PjgpKTsKIAotCS8qIFBhY2tldCBpcyBhbHdheXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCi0JZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIGVpX3N0YXR1cy5tZW0gKyAocmluZ19vZmZzZXQgJiAweGZmKSwgY291bnQsIDApOworCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCBlaV9zdGF0dXMubWVtICsgKHJpbmdfb2Zmc2V0ICYgMHhmZiksIGNvdW50KTsKIAogCW1lbV9vZmYoaW9hZGRyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VzMzIxMC5jIGIvZHJpdmVycy9uZXQvZXMzMjEwLmMKaW5kZXggMmQyZWE5NC4uODIyZTViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXMzMjEwLmMKKysrIGIvZHJpdmVycy9uZXQvZXMzMjEwLmMKQEAgLTM3NSw3ICszNzUsNyBAQAogCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGVpX3N0YXR1cy5tZW0sIGNvdW50KTsKIAl9IGVsc2UgewogCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rLiAqLwotCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgeGZlcl9zdGFydCwgY291bnQsIDApOworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgY291bnQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjc29uaWMuYyBiL2RyaXZlcnMvbmV0L21hY3NvbmljLmMKaW5kZXggMjRmNjA1MGYuLjhjYTU3YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY3NvbmljLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjc29uaWMuYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CiAKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwppbmRleCBiM2JmODY0Li5kOThlNTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKQEAgLTI3ODAsNyArMjc4MCw2IEBACiAJLmdldF9saW5rICAgICAgICAgICAgICAgPSBtdjY0M3h4X2V0aF9nZXRfbGluaywKIAkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKIAkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKLQkuZ2V0X3N0cmluZ3MgICAgICAgICAgICA9IG12NjQzeHhfZ2V0X3N0cmluZ3MsCiAJLmdldF9zdGF0c19jb3VudCAgICAgICAgPSBtdjY0M3h4X2dldF9zdGF0c19jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMgICAgICA9IG12NjQzeHhfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9zdHJpbmdzICAgICAgICAgICAgPSBtdjY0M3h4X2dldF9zdHJpbmdzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKaW5kZXggNTc3YmFiZC4uNTU5OGQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcjgxNjkuYworKysgYi9kcml2ZXJzL25ldC9yODE2OS5jCkBAIC0yMDE2LDcgKzIwMTYsNyBAQAogCWlmICghc2tiKQogCQlnb3RvIGVycl9vdXQ7CiAKLQlza2JfcmVzZXJ2ZShza2IsIChhbGlnbiAtIDEpICYgKHUzMilza2ItPmRhdGEpOworCXNrYl9yZXNlcnZlKHNrYiwgKGFsaWduIC0gMSkgJiAodW5zaWduZWQgbG9uZylza2ItPmRhdGEpOwogCSpza19idWZmID0gc2tiOwogCiAJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwgcnhfYnVmX3N6LApAQCAtMjQ4Nyw3ICsyNDg3LDcgQEAKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9zaXplICsgYWxpZ24pOwogCQlpZiAoc2tiKSB7Ci0JCQlza2JfcmVzZXJ2ZShza2IsIChhbGlnbiAtIDEpICYgKHUzMilza2ItPmRhdGEpOworCQkJc2tiX3Jlc2VydmUoc2tiLCAoYWxpZ24gLSAxKSAmICh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSk7CiAJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgc2tfYnVmZlswXS0+ZGF0YSwgcGt0X3NpemUsIDApOwogCQkJKnNrX2J1ZmYgPSBza2I7CiAJCQlydGw4MTY5X21hcmtfdG9fYXNpYyhkZXNjLCByeF9idWZfc3opOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5jIGIvZHJpdmVycy9uZXQvczJpby5jCmluZGV4IDYzOWZiYzAuLjg2NDZiNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3MyaW8uYworKysgYi9kcml2ZXJzL25ldC9zMmlvLmMKQEAgLTcyOTgsNyArNzI5OCw3IEBACiB7CiAJc3RydWN0IGlwaGRyICppcCA9IGxyby0+aXBoOwogCXN0cnVjdCB0Y3BoZHIgKnRjcCA9IGxyby0+dGNwaDsKLQl1MTYgbmNoazsKKwlfX3N1bTE2IG5jaGs7CiAJc3RydWN0IHN0YXRfYmxvY2sgKnN0YXRpbmZvID0gc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm87CiAJREJHX1BSSU5UKElORk9fREJHLCIlczogQmVlbiBoZXJlLi4uXG4iLCBfX0ZVTkNUSU9OX18pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmggYi9kcml2ZXJzL25ldC9zMmlvLmgKaW5kZXggYTVlMWE1MS4uMGRlMGM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5oCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uaApAQCAtNzI3LDEyICs3MjcsMTIgQEAKIAlzdHJ1Y3QgaXBoZHIJKmlwaDsKIAlzdHJ1Y3QgdGNwaGRyCSp0Y3BoOwogCXUzMgkJdGNwX25leHRfc2VxOwotCXUzMgkJdGNwX2FjazsKKwlfX2JlMzIJCXRjcF9hY2s7CiAJaW50CQl0b3RhbF9sZW47CiAJaW50CQlmcmFnc19sZW47CiAJaW50CQlzZ19udW07CiAJaW50CQlpbl91c2U7Ci0JdTE2CQl3aW5kb3c7CisJX19iZTE2CQl3aW5kb3c7CiAJdTMyCQljdXJfdHN2YWw7CiAJdTMyCQljdXJfdHNlY3I7CiAJdTgJCXNhd190czsKQEAgLTEwMDUsNyArMTAwNSw3IEBACiBzdGF0aWMgdm9pZCBzMmlvX2NhcmRfZG93bihzdHJ1Y3QgczJpb19uaWMgKm5pYyk7CiBzdGF0aWMgaW50IHMyaW9fY2FyZF91cChzdHJ1Y3QgczJpb19uaWMgKm5pYyk7CiBzdGF0aWMgaW50IGdldF94ZW5hX3Jldl9pZChzdHJ1Y3QgcGNpX2RldiAqcGRldik7Ci1zdGF0aWMgaW50IHdhaXRfZm9yX2NtZF9jb21wbGV0ZSh2b2lkICphZGRyLCB1NjQgYnVzeV9iaXQpOworc3RhdGljIGludCB3YWl0X2Zvcl9jbWRfY29tcGxldGUodm9pZCBfX2lvbWVtICphZGRyLCB1NjQgYnVzeV9iaXQpOwogc3RhdGljIGludCBzMmlvX2FkZF9pc3Ioc3RydWN0IHMyaW9fbmljICogc3ApOwogc3RhdGljIHZvaWQgczJpb19yZW1faXNyKHN0cnVjdCBzMmlvX25pYyAqIHNwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2xpcC5jIGIvZHJpdmVycy9uZXQvc2xpcC5jCmluZGV4IGEwODA2ZDIuLjJmNGIxZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NsaXAuYworKysgYi9kcml2ZXJzL25ldC9zbGlwLmMKQEAgLTEzNDMsMTUgKzEzNDMsMTIgQEAKIAlwcmludGsoS0VSTl9JTkZPICJTTElQIGxpbmVmaWxsL2tlZXBhbGl2ZSBvcHRpb24uXG4iKTsKICNlbmRpZgogCi0Jc2xpcF9kZXZzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UgKikqc2xpcF9tYXhkZXYsIEdGUF9LRVJORUwpOworCXNsaXBfZGV2cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlICopKnNsaXBfbWF4ZGV2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNsaXBfZGV2cykgewogCQlwcmludGsoS0VSTl9FUlIgIlNMSVA6IENhbid0IGFsbG9jYXRlIHNsaXAgZGV2aWNlcyBhcnJheSEgIFVhYXJnaCEgKC0+IE5vIFNMSVAgYXZhaWxhYmxlKVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCS8qIENsZWFyIHRoZSBwb2ludGVyIGFycmF5LCB3ZSBhbGxvY2F0ZSBkZXZpY2VzIHdoZW4gd2UgbmVlZCB0aGVtICovCi0JbWVtc2V0KHNsaXBfZGV2cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlICopKnNsaXBfbWF4ZGV2KTsKLQogCS8qIEZpbGwgaW4gb3VyIGxpbmUgcHJvdG9jb2wgZGlzY2lwbGluZSwgYW5kIHJlZ2lzdGVyIGl0ICovCiAJaWYgKChzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9TTElQLCAmc2xfbGRpc2MpKSAhPSAwKSAgewogCQlwcmludGsoS0VSTl9FUlIgIlNMSVA6IGNhbid0IHJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLCBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jLW1jYS5jIGIvZHJpdmVycy9uZXQvc21jLW1jYS5jCmluZGV4IDcxMjI5MzIuLmFlMWFlMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYy1tY2EuYworKysgYi9kcml2ZXJzL25ldC9zbWMtbWNhLmMKQEAgLTQ4Miw4ICs0ODIsNyBAQAogCQljb3VudCAtPSBzZW1pX2NvdW50OwogCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGVpX3N0YXR1cy5tZW0gKyBUWF9QQUdFUyAqIDI1NiwgY291bnQpOwogCX0gZWxzZSB7Ci0JCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KLQkJZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIHhmZXJfc3RhcnQsIGNvdW50LCAwKTsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHhmZXJfc3RhcnQsIGNvdW50KTsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKaW5kZXggZDcwYmM5Ny4uYTUyYjIyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKKysrIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKQEAgLTQ1NCw4ICs0NTQsNyBAQAogCQljb3VudCAtPSBzZW1pX2NvdW50OwogCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGVpX3N0YXR1cy5tZW0gKyBUWF9QQUdFUyAqIDI1NiwgY291bnQpOwogCX0gZWxzZSB7Ci0JCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KLQkJZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIHhmZXJfc3RhcnQsIGNvdW50LCAwKTsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHhmZXJfc3RhcnQsIGNvdW50KTsKIAl9CiAKIAlvdXRiKDB4MDAsIGRldi0+YmFzZV9hZGRyIC0gVUxUUkFfTklDX09GRlNFVCk7CS8qIERpc2FibGUgbWVtb3J5LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jLXVsdHJhMzIuYyBiL2RyaXZlcnMvbmV0L3NtYy11bHRyYTMyLmMKaW5kZXggMmM1MzE5Yy4uODhhMzBlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jLXVsdHJhMzIuYworKysgYi9kcml2ZXJzL25ldC9zbWMtdWx0cmEzMi5jCkBAIC0zOTUsOCArMzk1LDcgQEAKIAkJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwgZWlfc3RhdHVzLm1lbSArIFRYX1BBR0VTICogMjU2LCBjb3VudCk7CiAJCX0KIAl9IGVsc2UgewotCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCi0JCWV0aF9pb19jb3B5X2FuZF9zdW0oc2tiLCB4ZmVyX3N0YXJ0LCBjb3VudCwgMCk7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCB4ZmVyX3N0YXJ0LCBjb3VudCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKaW5kZXggYmY2ZmYzOS4uNjRlZDhmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYwpAQCAtMTkwNyw3ICsxOTA3LDcgQEAKIAlzcGlkZXJfbmV0X3dyaXRlX3JlZyhjYXJkLCBTUElERVJfTkVUX0dISUlOVDJNU0ssIDApOwogCiAJLyogZnJlZV9pcnEobmV0ZGV2LT5pcnEsIG5ldGRldik7Ki8KLQlmcmVlX2lycSh0b19wY2lfZGV2KG5ldGRldi0+Y2xhc3NfZGV2LmRldiktPmlycSwgbmV0ZGV2KTsKKwlmcmVlX2lycSh0b19wY2lfZGV2KG5ldGRldi0+ZGV2LnBhcmVudCktPmlycSwgbmV0ZGV2KTsKIAogCXNwaWRlcl9uZXRfd3JpdGVfcmVnKGNhcmQsIFNQSURFUl9ORVRfR0RURE1BQ0NOVFIsCiAJCQkgICAgIFNQSURFUl9ORVRfRE1BX1RYX0ZFTkRfVkFMVUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmMgYi9kcml2ZXJzL25ldC90ZzMuYwppbmRleCAxMzVjMDk4Li5lMTM2YmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuYworKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtMzM4MCw3ICszMzgwLDcgQEAKIAkJfQogbmV4dF9wa3Rfbm9wb3N0OgogCQlzd19pZHgrKzsKLQkJc3dfaWR4ICU9IFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKTsKKwkJc3dfaWR4ICY9IChURzNfUlhfUkNCX1JJTkdfU0laRSh0cCkgLSAxKTsKIAogCQkvKiBSZWZyZXNoIGh3X2lkeCB0byBzZWUgaWYgdGhlcmUgaXMgbmV3IHdvcmsgKi8KIAkJaWYgKHN3X2lkeCA9PSBod19pZHgpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCmluZGV4IGFiYjg2MTEuLjMxYzk3YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwpAQCAtMTcwOSw3NSArMTcwOSwxMyBAQAogCQlpZiAobWlpX2luZm8tPnNwZWVkICE9IHVnZXRoLT5vbGRzcGVlZCkgewogCQkJc3dpdGNoIChtaWlfaW5mby0+c3BlZWQpIHsKIAkJCWNhc2UgMTAwMDoKLSNpZmRlZiBDT05GSUdfUFBDX01QQzgzNngKLS8qIEZJWE1FOiBUaGlzIGNvZGUgaXMgZm9yIDEwME1icyBCVUcgZml4aW5nLAotcmVtb3ZlIHRoaXMgd2hlbiBpdCBpcyBmaXhlZCEhISAqLwotCQkJCWlmICh1Z2V0aC0+dWdfaW5mby0+ZW5ldF9pbnRlcmZhY2UgPT0KLQkJCQkgICAgRU5FVF8xMDAwX0dNSUkpCi0JCQkJLyogUnVuIHRoZSBjb21tYW5kcyB3aGljaCBpbml0aWFsaXplIHRoZSBQSFkgKi8KLQkJCQl7Ci0JCQkJCXRlbXB2YWwgPQotCQkJCQkgICAgKHUzMikgbWlpX2luZm8tPm1kaW9fcmVhZCh1Z2V0aC0+Ci0JCQkJCQlkZXYsIG1paV9pbmZvLT5taWlfaWQsIDB4MWIpOwotCQkJCQl0ZW1wdmFsIHw9IDB4MDAwZjsKLQkJCQkJbWlpX2luZm8tPm1kaW9fd3JpdGUodWdldGgtPmRldiwKLQkJCQkJCW1paV9pbmZvLT5taWlfaWQsIDB4MWIsCi0JCQkJCQkodTE2KSB0ZW1wdmFsKTsKLQkJCQkJdGVtcHZhbCA9Ci0JCQkJCSAgICAodTMyKSBtaWlfaW5mby0+bWRpb19yZWFkKHVnZXRoLT4KLQkJCQkJCWRldiwgbWlpX2luZm8tPm1paV9pZCwKLQkJCQkJCU1JSV9CTUNSKTsKLQkJCQkJbWlpX2luZm8tPm1kaW9fd3JpdGUodWdldGgtPmRldiwKLQkJCQkJCW1paV9pbmZvLT5taWlfaWQsIE1JSV9CTUNSLAotCQkJCQkJKHUxNikgKHRlbXB2YWwgfCBCTUNSX1JFU0VUKSk7Ci0JCQkJfSBlbHNlIGlmICh1Z2V0aC0+dWdfaW5mby0+ZW5ldF9pbnRlcmZhY2UgPT0KLQkJCQkJICAgRU5FVF8xMDAwX1JHTUlJKQotCQkJCS8qIFJ1biB0aGUgY29tbWFuZHMgd2hpY2ggaW5pdGlhbGl6ZSB0aGUgUEhZICovCi0JCQkJewotCQkJCQl0ZW1wdmFsID0KLQkJCQkJICAgICh1MzIpIG1paV9pbmZvLT5tZGlvX3JlYWQodWdldGgtPgotCQkJCQkJZGV2LCBtaWlfaW5mby0+bWlpX2lkLCAweDFiKTsKLQkJCQkJdGVtcHZhbCA9ICh0ZW1wdmFsICYgfjB4MDAwZikgfCAweDAwMGI7Ci0JCQkJCW1paV9pbmZvLT5tZGlvX3dyaXRlKHVnZXRoLT5kZXYsCi0JCQkJCQltaWlfaW5mby0+bWlpX2lkLCAweDFiLAotCQkJCQkJKHUxNikgdGVtcHZhbCk7Ci0JCQkJCXRlbXB2YWwgPQotCQkJCQkgICAgKHUzMikgbWlpX2luZm8tPm1kaW9fcmVhZCh1Z2V0aC0+Ci0JCQkJCQlkZXYsIG1paV9pbmZvLT5taWlfaWQsCi0JCQkJCQlNSUlfQk1DUik7Ci0JCQkJCW1paV9pbmZvLT5tZGlvX3dyaXRlKHVnZXRoLT5kZXYsCi0JCQkJCQltaWlfaW5mby0+bWlpX2lkLCBNSUlfQk1DUiwKLQkJCQkJCSh1MTYpICh0ZW1wdmFsIHwgQk1DUl9SRVNFVCkpOwotCQkJCX0KLQkJCQltc2xlZXAoNDAwMCk7Ci0jZW5kaWYJCQkJLyogQ09ORklHX01QQzgzNjAgKi8KLQkJCQlhZGp1c3RfZW5ldF9pbnRlcmZhY2UodWdldGgpOworCQkJCXVnZXRoLT51Z19pbmZvLT5lbmV0X2ludGVyZmFjZSA9IEVORVRfMTAwMF9SR01JSTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMTAwOgotCQkJY2FzZSAxMDoKLSNpZmRlZiBDT05GSUdfUFBDX01QQzgzNngKLS8qIEZJWE1FOiBUaGlzIGNvZGUgaXMgZm9yIDEwME1icyBCVUcgZml4aW5nLAotcmVtb3ZlIHRoaXMgbGluZXMgd2hlbiBpdCB3aWxsIGJlIGZpeGVkISEhICovCiAJCQkJdWdldGgtPnVnX2luZm8tPmVuZXRfaW50ZXJmYWNlID0gRU5FVF8xMDBfUkdNSUk7Ci0JCQkJdGVtcHZhbCA9Ci0JCQkJICAgICh1MzIpIG1paV9pbmZvLT5tZGlvX3JlYWQodWdldGgtPmRldiwKLQkJCQkJCQkgICAgICBtaWlfaW5mby0+bWlpX2lkLAotCQkJCQkJCSAgICAgIDB4MWIpOwotCQkJCXRlbXB2YWwgPSAodGVtcHZhbCAmIH4weDAwMGYpIHwgMHgwMDBiOwotCQkJCW1paV9pbmZvLT5tZGlvX3dyaXRlKHVnZXRoLT5kZXYsCi0JCQkJCQkgICAgIG1paV9pbmZvLT5taWlfaWQsIDB4MWIsCi0JCQkJCQkgICAgICh1MTYpIHRlbXB2YWwpOwotCQkJCXRlbXB2YWwgPQotCQkJCSAgICAodTMyKSBtaWlfaW5mby0+bWRpb19yZWFkKHVnZXRoLT5kZXYsCi0JCQkJCQkJICAgICAgbWlpX2luZm8tPm1paV9pZCwKLQkJCQkJCQkgICAgICBNSUlfQk1DUik7Ci0JCQkJbWlpX2luZm8tPm1kaW9fd3JpdGUodWdldGgtPmRldiwKLQkJCQkJCSAgICAgbWlpX2luZm8tPm1paV9pZCwgTUlJX0JNQ1IsCi0JCQkJCQkgICAgICh1MTYpICh0ZW1wdmFsIHwKLQkJCQkJCQkgICAgQk1DUl9SRVNFVCkpOwotCQkJCW1zbGVlcCg0MDAwKTsKLSNlbmRpZgkJCQkvKiBDT05GSUdfTVBDODM2MCAqLwotCQkJCWFkanVzdF9lbmV0X2ludGVyZmFjZSh1Z2V0aCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDEwOgorCQkJCXVnZXRoLT51Z19pbmZvLT5lbmV0X2ludGVyZmFjZSA9IEVORVRfMTBfUkdNSUk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCXVnZXRoX3dhcm4KQEAgLTE3ODUsNiArMTcyMyw3IEBACiAJCQkJICAgICBkZXYtPm5hbWUsIG1paV9pbmZvLT5zcGVlZCk7CiAJCQkJYnJlYWs7CiAJCQl9CisJCQlhZGp1c3RfZW5ldF9pbnRlcmZhY2UodWdldGgpOwogCiAJCQl1Z2V0aF9pbmZvKCIlczogU3BlZWQgJWRCVCIsIGRldi0+bmFtZSwKIAkJCQkgICBtaWlfaW5mby0+c3BlZWQpOwpAQCAtNDEzMyw2ICs0MDcyLDcgQEAKIAlzdGF0aWMgaW50IG1paV9tbmdfY29uZmlndXJlZCA9IDA7CiAJY29uc3QgcGhhbmRsZSAqcGg7CiAJY29uc3QgdW5zaWduZWQgaW50ICpwcm9wOworCWNvbnN0IHZvaWQgKm1hY19hZGRyOwogCiAJdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKIApAQCAtNDI1OCw3ICs0MTk4LDEyIEBACiAKIAl1Z2V0aC0+dWdfaW5mbyA9IHVnX2luZm87CiAJdWdldGgtPmRldiA9IGRldjsKLQltZW1jcHkoZGV2LT5kZXZfYWRkciwgZ2V0X3Byb3BlcnR5KG5wLCAibWFjLWFkZHJlc3MiLCBOVUxMKSwgNik7CisKKwltYWNfYWRkciA9IGdldF9wcm9wZXJ0eShucCwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7CisJaWYgKG1hY19hZGRyID09IE5VTEwpCisJCW1hY19hZGRyID0gZ2V0X3Byb3BlcnR5KG5wLCAibG9jYWwtbWFjLWFkZHJlc3MiLCBOVUxMKTsKKwlpZiAobWFjX2FkZHIpCisJCW1lbWNweShkZXYtPmRldl9hZGRyLCBtYWNfYWRkciwgNik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoX3BoeS5jIGIvZHJpdmVycy9uZXQvdWNjX2dldGhfcGh5LmMKaW5kZXggM2M4NjU5Mi4uNmZkYTZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdWNjX2dldGhfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGhfcGh5LmMKQEAgLTM3Niw2ICszNzYsOCBAQAogCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CiAKIAl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIDB4MTQsIDB4MGNkMik7CisJdWNjX2dldGhfcGh5X3dyaXRlKG1paV9pbmZvLCAweDFiLAorCQkodWNjX2dldGhfcGh5X3JlYWQobWlpX2luZm8sIDB4MWIpICYgfjB4MDAwZikgfCAweDAwMGIpOwogCXVjY19nZXRoX3BoeV93cml0ZShtaWlfaW5mbywgTUlJX0JNQ1IsCiAJCSAgdWNjX2dldGhfcGh5X3JlYWQobWlpX2luZm8sIE1JSV9CTUNSKSB8IEJNQ1JfUkVTRVQpOwogCW1zbGVlcCg0MDAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMHRvby5jIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwdG9vLmMKaW5kZXggNzliMmQ1NC4uYmMxNTZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwdG9vLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwdG9vLmMKQEAgLTEwMSw4ICsxMDEsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgY2FyZF9zIHsKIAlpbnQgdHlwZTsJCS8qIFJTViwgWDIxLCBldGMuICovCiAJaW50IG5fcG9ydHM7CQkvKiAxIG9yIDIgcG9ydHMgKi8KLQl1OCogX19pb21lbSByYW1iYXNlOwkvKiBidWZmZXIgbWVtb3J5IGJhc2UgKHZpcnR1YWwpICovCi0JdTgqIF9faW9tZW0gc2NhYmFzZTsJLyogU0NBIG1lbW9yeSBiYXNlICh2aXJ0dWFsKSAqLworCXU4IF9faW9tZW0gKnJhbWJhc2U7CS8qIGJ1ZmZlciBtZW1vcnkgYmFzZSAodmlydHVhbCkgKi8KKwl1OCBfX2lvbWVtICpzY2FiYXNlOwkvKiBTQ0EgbWVtb3J5IGJhc2UgKHZpcnR1YWwpICovCiAJcGx4OTA1MCBfX2lvbWVtICpwbHhiYXNlOyAvKiBQTFggcmVnaXN0ZXJzIG1lbW9yeSBiYXNlICh2aXJ0dWFsKSAqLwogCXUzMiBpbml0X2N0cmxfdmFsdWU7CS8qIFNhdmVkIHZhbHVlIC0gOTA1MCBidWcgd29ya2Fyb3VuZCAqLwogCXUxNiByeF9yaW5nX2J1ZmZlcnM7CS8qIG51bWJlciBvZiBidWZmZXJzIGluIGEgcmluZyAqLwpAQCAtMTM0LDcgKzEzNCw3IEBACiBzdGF0aWMgdm9pZCBwYzMwMF9zZXRfaWZhY2UocG9ydF90ICpwb3J0KQogewogCWNhcmRfdCAqY2FyZCA9IHBvcnQtPmNhcmQ7Ci0JdTMyKiBpbml0X2N0cmwgPSAmY2FyZC0+cGx4YmFzZS0+aW5pdF9jdHJsOworCXUzMiBfX2lvbWVtICogaW5pdF9jdHJsID0gJmNhcmQtPnBseGJhc2UtPmluaXRfY3RybDsKIAl1MTYgbXNjaSA9IGdldF9tc2NpKHBvcnQpOwogCXU4IHJ4cyA9IHBvcnQtPnJ4cyAmIENMS19CUkdfTUFTSzsKIAl1OCB0eHMgPSBwb3J0LT50eHMgJiBDTEtfQlJHX01BU0s7CkBAIC0zOTMsNyArMzkzLDcgQEAKIAogCS8qIFBMWCBQQ0kgOTA1MCB3b3JrYXJvdW5kIGZvciBsb2NhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHJlYWQgYnVnICovCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsIHNjYXBoeXMpOwotCWNhcmQtPmluaXRfY3RybF92YWx1ZSA9IHJlYWRsKCYoKHBseDkwNTAqKWNhcmQtPnNjYWJhc2UpLT5pbml0X2N0cmwpOworCWNhcmQtPmluaXRfY3RybF92YWx1ZSA9IHJlYWRsKCYoKHBseDkwNTAgX19pb21lbSAqKWNhcmQtPnNjYWJhc2UpLT5pbml0X2N0cmwpOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCBwbHhwaHlzKTsKIAogCS8qIFJlc2V0IFBMWCAqLwpAQCAtNTE5LDEwICs1MTksMTAgQEAKIAogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGMzMDBfcGNpX2RyaXZlciA9IHsKLQluYW1lOiAgICAgICAgICAgIlBDMzAwIiwKLQlpZF90YWJsZTogICAgICAgcGMzMDBfcGNpX3RibCwKLQlwcm9iZTogICAgICAgICAgcGMzMDBfcGNpX2luaXRfb25lLAotCXJlbW92ZTogICAgICAgICBwYzMwMF9wY2lfcmVtb3ZlX29uZSwKKwkubmFtZSA9ICAgICAgICAgICJQQzMwMCIsCisJLmlkX3RhYmxlID0gICAgICBwYzMwMF9wY2lfdGJsLAorCS5wcm9iZSA9ICAgICAgICAgcGMzMDBfcGNpX2luaXRfb25lLAorCS5yZW1vdmUgPSAgICAgICAgcGMzMDBfcGNpX3JlbW92ZV9vbmUsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dkLmMgYi9kcml2ZXJzL25ldC93ZC5jCmluZGV4IDdmMzgwMTIuLmEwMzI2ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dkLmMKKysrIGIvZHJpdmVycy9uZXQvd2QuYwpAQCAtNDMzLDcgKzQzMyw3IEBACiAJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwgZWlfc3RhdHVzLm1lbSArIFRYX1BBR0VTICogMjU2LCBjb3VudCk7CiAJfSBlbHNlIHsKIAkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLwotCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgeGZlcl9zdGFydCwgY291bnQsIDApOworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgY291bnQpOwogCX0KIAogCS8qIFR1cm4gb2ZmIDE2IGJpdCBhY2Nlc3Mgc28gdGhhdCByZWJvb3Qgd29ya3MuCSBJU0EgYnJhaW4tZGFtYWdlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jIGIvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuYwppbmRleCBiYmYwMjU4Li40ZGJlZjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfcGNjLmMKQEAgLTcyMiw3ICs3MjIsNyBAQAogCS8qIFNldCB1cCBpbnRlcnJ1cHQgaGFuZGxlcihzKSAqLwogCiAJZm9yIChpID0gMCA7IGkgPCBwY2Nfc29ja2V0cyA7IGkrKykgewotCQlzb2NrZXRbaV0uc29ja2V0LmRldi5kZXYgPSAmcGNjX2RldmljZS5kZXY7CisJCXNvY2tldFtpXS5zb2NrZXQuZGV2LnBhcmVudCA9ICZwY2NfZGV2aWNlLmRldjsKIAkJc29ja2V0W2ldLnNvY2tldC5vcHMgPSAmcGNjX29wZXJhdGlvbnM7CiAJCXNvY2tldFtpXS5zb2NrZXQucmVzb3VyY2Vfb3BzID0gJnBjY2FyZF9zdGF0aWNfb3BzOwogCQlzb2NrZXRbaV0uc29ja2V0Lm93bmVyID0gVEhJU19NT0RVTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKaW5kZXggOTRkM2RmNi4uODJmMmFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRldi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAKIAljYXNlIFJUQ19JUlFQX1JFQUQ6CiAJCWlmIChvcHMtPmlycV9zZXRfZnJlcSkKLQkJCWVyciA9IHB1dF91c2VyKHJ0Yy0+aXJxX2ZyZXEsICh1bnNpZ25lZCBsb25nICopIGFyZyk7CisJCQllcnIgPSBwdXRfdXNlcihydGMtPmlycV9mcmVxLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKil1YXJnKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJUQ19JUlFQX1NFVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL21vbnJlYWRlci5jIGIvZHJpdmVycy9zMzkwL2NoYXIvbW9ucmVhZGVyLmMKaW5kZXggYTEzOGIxNS4uM2ExYTk1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvbW9ucmVhZGVyLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvbW9ucmVhZGVyLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ2hhcmFjdGVyIGRldmljZSBkcml2ZXIgZm9yIHJlYWRpbmcgei9WTSAqTU9OSVRPUiBzZXJ2aWNlIHJlY29yZHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiwgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkguCisgKiBDb3B5cmlnaHQgMjAwNCBJQk0gQ29ycG9yYXRpb24sIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILgogICoKICAqIEF1dGhvcjogR2VyYWxkIFNjaGFlZmVyIDxnZXJhbGRzY0BkZS5pYm0uY29tPgogICovCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgogI2luY2x1ZGUgPGFzbS9leHRtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSAiLi4vbmV0L2l1Y3YuaCIKKyNpbmNsdWRlIDxuZXQvaXVjdi9pdWN2Lmg+CiAKIAogLy8jZGVmaW5lIE1PTl9ERUJVRwkJCS8qIERlYnVnIG1lc3NhZ2VzIG9uL29mZiAqLwpAQCAtNTAsMTQgKzUwLDEzIEBACiBzdHJ1Y3QgbW9uX21zZyB7CiAJdTMyIHBvczsKIAl1MzIgbWNhX29mZnNldDsKLQlpdWN2X01lc3NhZ2VQZW5kaW5nIGxvY2FsX2VpYjsKKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlIG1zZzsKIAljaGFyIG1zZ2xpbV9yZWFjaGVkOwogCWNoYXIgcmVwbGllZF9tc2dsaW07CiB9OwogCiBzdHJ1Y3QgbW9uX3ByaXZhdGUgewotCXUxNiBwYXRoaWQ7Ci0JaXVjdl9oYW5kbGVfdCBpdWN2X2hhbmRsZTsKKwlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoOwogCXN0cnVjdCBtb25fbXNnICptc2dfYXJyYXlbTU9OX01TR0xJTV07CiAJdW5zaWduZWQgaW50ICAgd3JpdGVfaW5kZXg7CiAJdW5zaWduZWQgaW50ICAgcmVhZF9pbmRleDsKQEAgLTc1LDggKzc0LDYgQEAKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChtb25fcmVhZF93YWl0X3F1ZXVlKTsKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChtb25fY29ubl93YWl0X3F1ZXVlKTsKIAotc3RhdGljIHU4IGl1Y3ZfaG9zdFs4XSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLQogc3RhdGljIHU4IHVzZXJfZGF0YV9jb25uZWN0WzE2XSA9IHsKIAkvKiBWZXJzaW9uIGNvZGUsIG11c3QgYmUgMHgwMSBmb3Igc2hhcmVkIG1vZGUgKi8KIAkweDAxLApAQCAtMTAwLDggKzk3LDcgQEAKICAqIENyZWF0ZSB0aGUgOCBieXRlcyBFQkNESUMgRENTUyBzZWdtZW50IG5hbWUgZnJvbQogICogYW4gQVNDSUkgbmFtZSwgaW5jbC4gcGFkZGluZwogICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRjc3NfbWtuYW1lKGNoYXIgKmFzY2lpX25hbWUsIGNoYXIgKmViY2RpY19uYW1lKQorc3RhdGljIGlubGluZSB2b2lkIGRjc3NfbWtuYW1lKGNoYXIgKmFzY2lpX25hbWUsIGNoYXIgKmViY2RpY19uYW1lKQogewogCWludCBpOwogCkBAIC0xMTksOCArMTE1LDcgQEAKICAqIHByaW50IGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UgZm9yIHNlZ21lbnRfbG9hZCgpL3NlZ21lbnRfdHlwZSgpCiAgKiByZXR1cm4gY29kZQogICovCi1zdGF0aWMgdm9pZAotbW9uX3NlZ21lbnRfd2FybihpbnQgcmMsIGNoYXIqIHNlZ19uYW1lKQorc3RhdGljIHZvaWQgbW9uX3NlZ21lbnRfd2FybihpbnQgcmMsIGNoYXIqIHNlZ19uYW1lKQogewogCXN3aXRjaCAocmMpIHsKIAljYXNlIC1FTk9FTlQ6CkBAIC0xNjYsNDQgKzE2MSwzNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1tb25fbWNhX3N0YXJ0KHN0cnVjdCBtb25fbXNnICptb25tc2cpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW9uX21jYV9zdGFydChzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQogewotCXJldHVybiBtb25tc2ctPmxvY2FsX2VpYi5sbjFtc2cxLmlwcm1tc2cxX3UzMjsKKwlyZXR1cm4gKih1MzIgKikgJm1vbm1zZy0+bXNnLnJtbXNnOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLW1vbl9tY2FfZW5kKHN0cnVjdCBtb25fbXNnICptb25tc2cpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW9uX21jYV9lbmQoc3RydWN0IG1vbl9tc2cgKm1vbm1zZykKIHsKLQlyZXR1cm4gbW9ubXNnLT5sb2NhbF9laWIubG4xbXNnMi5pcGJmbG4xZjsKKwlyZXR1cm4gKih1MzIgKikgJm1vbm1zZy0+bXNnLnJtbXNnWzRdOwogfQogCi1zdGF0aWMgaW5saW5lIHU4Ci1tb25fbWNhX3R5cGUoc3RydWN0IG1vbl9tc2cgKm1vbm1zZywgdTggaW5kZXgpCitzdGF0aWMgaW5saW5lIHU4IG1vbl9tY2FfdHlwZShzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnLCB1OCBpbmRleCkKIHsKIAlyZXR1cm4gKigodTggKikgbW9uX21jYV9zdGFydChtb25tc2cpICsgbW9ubXNnLT5tY2Ffb2Zmc2V0ICsgaW5kZXgpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMgotbW9uX21jYV9zaXplKHN0cnVjdCBtb25fbXNnICptb25tc2cpCitzdGF0aWMgaW5saW5lIHUzMiBtb25fbWNhX3NpemUoc3RydWN0IG1vbl9tc2cgKm1vbm1zZykKIHsKIAlyZXR1cm4gbW9uX21jYV9lbmQobW9ubXNnKSAtIG1vbl9tY2Ffc3RhcnQobW9ubXNnKSArIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyCi1tb25fcmVjX3N0YXJ0KHN0cnVjdCBtb25fbXNnICptb25tc2cpCitzdGF0aWMgaW5saW5lIHUzMiBtb25fcmVjX3N0YXJ0KHN0cnVjdCBtb25fbXNnICptb25tc2cpCiB7CiAJcmV0dXJuICooKHUzMiAqKSAobW9uX21jYV9zdGFydChtb25tc2cpICsgbW9ubXNnLT5tY2Ffb2Zmc2V0ICsgNCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMgotbW9uX3JlY19lbmQoc3RydWN0IG1vbl9tc2cgKm1vbm1zZykKK3N0YXRpYyBpbmxpbmUgdTMyIG1vbl9yZWNfZW5kKHN0cnVjdCBtb25fbXNnICptb25tc2cpCiB7CiAJcmV0dXJuICooKHUzMiAqKSAobW9uX21jYV9zdGFydChtb25tc2cpICsgbW9ubXNnLT5tY2Ffb2Zmc2V0ICsgOCkpOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotbW9uX2NoZWNrX21jYShzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQorc3RhdGljIGlubGluZSBpbnQgbW9uX2NoZWNrX21jYShzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQogewogCWlmICgobW9uX3JlY19lbmQobW9ubXNnKSA8PSBtb25fcmVjX3N0YXJ0KG1vbm1zZykpIHx8CiAJICAgIChtb25fcmVjX3N0YXJ0KG1vbm1zZykgPCBtb25fZGNzc19zdGFydCkgfHwKQEAgLTIyMSwyMCArMjA5LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1tb25fc2VuZF9yZXBseShzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnLCBzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYpCitzdGF0aWMgaW5saW5lIGludCBtb25fc2VuZF9yZXBseShzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnLAorCQkJCSBzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYpCiB7Ci0JdTggcHJtbXNnWzhdOwogCWludCByYzsKIAogCVBfREVCVUcoInJlYWQsIFJFUExZOiBwYXRoaWQgPSAweCUwNFgsIG1zZ2lkID0gMHglMDhYLCB0cmdjbHMgPSAiCiAJCSIweCUwOFhcblxuIiwKLQkJbW9ubXNnLT5sb2NhbF9laWIuaXBwYXRoaWQsIG1vbm1zZy0+bG9jYWxfZWliLmlwbXNnaWQsCi0JCW1vbm1zZy0+bG9jYWxfZWliLmlwdHJnY2xzKTsKLQlyYyA9IGl1Y3ZfcmVwbHlfcHJtbXNnKG1vbm1zZy0+bG9jYWxfZWliLmlwcGF0aGlkLAotCQkJCW1vbm1zZy0+bG9jYWxfZWliLmlwbXNnaWQsCi0JCQkJbW9ubXNnLT5sb2NhbF9laWIuaXB0cmdjbHMsCi0JCQkJMCwgcHJtbXNnKTsKKwkJbW9ucHJpdi0+cGF0aC0+cGF0aGlkLCBtb25tc2ctPm1zZy5pZCwgbW9ubXNnLT5tc2cuY2xhc3MpOworCisJcmMgPSBpdWN2X21lc3NhZ2VfcmVwbHkobW9ucHJpdi0+cGF0aCwgJm1vbm1zZy0+bXNnLAorCQkJCUlVQ1ZfSVBSTURBVEEsIE5VTEwsIDApOwogCWF0b21pY19kZWMoJm1vbnByaXYtPm1zZ2xpbV9jb3VudCk7CiAJaWYgKGxpa2VseSghbW9ubXNnLT5tc2dsaW1fcmVhY2hlZCkpIHsKIAkJbW9ubXNnLT5wb3MgPSAwOwpAQCAtMjUxLDEwICsyMzYsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbW9uX3ByaXZhdGUgKgotbW9uX2FsbG9jX21lbSh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIG1vbl9mcmVlX21lbShzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYpCiB7Ci0JaW50IGksajsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNT05fTVNHTElNOyBpKyspCisJCWlmIChtb25wcml2LT5tc2dfYXJyYXlbaV0pCisJCQlrZnJlZShtb25wcml2LT5tc2dfYXJyYXlbaV0pOworCWtmcmVlKG1vbnByaXYpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtb25fcHJpdmF0ZSAqbW9uX2FsbG9jX21lbSh2b2lkKQoreworCWludCBpOwogCXN0cnVjdCBtb25fcHJpdmF0ZSAqbW9ucHJpdjsKIAogCW1vbnByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW9uX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKQEAgLTI2NywxNiArMjYxLDE1IEBACiAJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghbW9ucHJpdi0+bXNnX2FycmF5W2ldKSB7CiAJCQlQX0VSUk9SKCJvcGVuLCBubyBtZW1vcnkgZm9yIG1zZ19hcnJheVxuIik7Ci0JCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQkJCWtmcmVlKG1vbnByaXYtPm1zZ19hcnJheVtqXSk7CisJCQltb25fZnJlZV9tZW0obW9ucHJpdik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0KIAlyZXR1cm4gbW9ucHJpdjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1tb25fcmVhZF9kZWJ1ZyhzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnLCBzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYpCitzdGF0aWMgaW5saW5lIHZvaWQgbW9uX3JlYWRfZGVidWcoc3RydWN0IG1vbl9tc2cgKm1vbm1zZywKKwkJCQkgIHN0cnVjdCBtb25fcHJpdmF0ZSAqbW9ucHJpdikKIHsKICNpZmRlZiBNT05fREVCVUcKIAl1OCBtc2dfdHlwZVsyXSwgbWNhX3R5cGU7CkBAIC0yODQsNyArMjc3LDcgQEAKIAogCXJlY29yZHNfbGVuID0gbW9uX3JlY19lbmQobW9ubXNnKSAtIG1vbl9yZWNfc3RhcnQobW9ubXNnKSArIDE7CiAKLQltZW1jcHkobXNnX3R5cGUsICZtb25tc2ctPmxvY2FsX2VpYi5pcHRyZ2NscywgMik7CisJbWVtY3B5KG1zZ190eXBlLCAmbW9ubXNnLT5tc2cuY2xhc3MsIDIpOwogCUVCQ0FTQyhtc2dfdHlwZSwgMik7CiAJbWNhX3R5cGUgPSBtb25fbWNhX3R5cGUobW9ubXNnLCAwKTsKIAlFQkNBU0MoJm1jYV90eXBlLCAxKTsKQEAgLTI5Miw4ICsyODUsNyBAQAogCVBfREVCVUcoInJlYWQsIG1vbl9yZWFkX2luZGV4ID0gJWksIG1vbl93cml0ZV9pbmRleCA9ICVpXG4iLAogCQltb25wcml2LT5yZWFkX2luZGV4LCBtb25wcml2LT53cml0ZV9pbmRleCk7CiAJUF9ERUJVRygicmVhZCwgcGF0aGlkID0gMHglMDRYLCBtc2dpZCA9IDB4JTA4WCwgdHJnY2xzID0gMHglMDhYXG4iLAotCQltb25tc2ctPmxvY2FsX2VpYi5pcHBhdGhpZCwgbW9ubXNnLT5sb2NhbF9laWIuaXBtc2dpZCwKLQkJbW9ubXNnLT5sb2NhbF9laWIuaXB0cmdjbHMpOworCQltb25wcml2LT5wYXRoLT5wYXRoaWQsIG1vbm1zZy0+bXNnLmlkLCBtb25tc2ctPm1zZy5jbGFzcyk7CiAJUF9ERUJVRygicmVhZCwgbXNnX3R5cGUgPSAnJWMlYycsIG1jYV90eXBlID0gJyVjJyAvIDB4JVggLyAweCVYXG4iLAogCQltc2dfdHlwZVswXSwgbXNnX3R5cGVbMV0sIG1jYV90eXBlID8gbWNhX3R5cGUgOiAnWCcsCiAJCW1vbl9tY2FfdHlwZShtb25tc2csIDEpLCBtb25fbWNhX3R5cGUobW9ubXNnLCAyKSk7CkBAIC0zMDYsOCArMjk4LDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1vbl9uZXh0X21jYShzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQorc3RhdGljIGlubGluZSB2b2lkIG1vbl9uZXh0X21jYShzdHJ1Y3QgbW9uX21zZyAqbW9ubXNnKQogewogCWlmIChsaWtlbHkoKG1vbl9tY2Ffc2l6ZShtb25tc2cpIC0gbW9ubXNnLT5tY2Ffb2Zmc2V0KSA9PSAxMikpCiAJCXJldHVybjsKQEAgLTMxNiw4ICszMDcsNyBAQAogCW1vbm1zZy0+cG9zID0gMDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbW9uX21zZyAqCi1tb25fbmV4dF9tZXNzYWdlKHN0cnVjdCBtb25fcHJpdmF0ZSAqbW9ucHJpdikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1vbl9tc2cgKm1vbl9uZXh0X21lc3NhZ2Uoc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2KQogewogCXN0cnVjdCBtb25fbXNnICptb25tc2c7CiAKQEAgLTM0MiwzOSArMzMyLDM3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVUNWIGhhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotbW9uX2l1Y3ZfQ29ubmVjdGlvbkNvbXBsZXRlKGl1Y3ZfQ29ubmVjdGlvbkNvbXBsZXRlICplaWIsIHZvaWQgKnBnbV9kYXRhKQorc3RhdGljIHZvaWQgbW9uX2l1Y3ZfcGF0aF9jb21wbGV0ZShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCB1OCBpcHVzZXJbMTZdKQogewotCXN0cnVjdCBtb25fcHJpdmF0ZSAqbW9ucHJpdiA9IChzdHJ1Y3QgbW9uX3ByaXZhdGUgKikgcGdtX2RhdGE7CisJc3RydWN0IG1vbl9wcml2YXRlICptb25wcml2ID0gcGF0aC0+cHJpdmF0ZTsKIAogCVBfREVCVUcoIklVQ1YgY29ubmVjdGlvbiBjb21wbGV0ZWRcbiIpOwogCVBfREVCVUcoIklVQ1YgQUNDRVBUIChmcm9tICpNT05JVE9SKTogVmVyc2lvbiA9IDB4JTAyWCwgRXZlbnQgPSAiCiAJCSIweCUwMlgsIFNhbXBsZSA9IDB4JTAyWFxuIiwKLQkJZWliLT5pcHVzZXJbMF0sIGVpYi0+aXB1c2VyWzFdLCBlaWItPmlwdXNlclsyXSk7CisJCWlwdXNlclswXSwgaXB1c2VyWzFdLCBpcHVzZXJbMl0pOwogCWF0b21pY19zZXQoJm1vbnByaXYtPml1Y3ZfY29ubmVjdGVkLCAxKTsKIAl3YWtlX3VwKCZtb25fY29ubl93YWl0X3F1ZXVlKTsKIH0KIAotc3RhdGljIHZvaWQKLW1vbl9pdWN2X0Nvbm5lY3Rpb25TZXZlcmVkKGl1Y3ZfQ29ubmVjdGlvblNldmVyZWQgKmVpYiwgdm9pZCAqcGdtX2RhdGEpCitzdGF0aWMgdm9pZCBtb25faXVjdl9wYXRoX3NldmVyZWQoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggaXB1c2VyWzE2XSkKIHsKLQlzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYgPSAoc3RydWN0IG1vbl9wcml2YXRlICopIHBnbV9kYXRhOworCXN0cnVjdCBtb25fcHJpdmF0ZSAqbW9ucHJpdiA9IHBhdGgtPnByaXZhdGU7CiAKLQlQX0VSUk9SKCJJVUNWIGNvbm5lY3Rpb24gc2V2ZXJlZCB3aXRoIHJjID0gMHglWFxuIiwKLQkJKHU4KSBlaWItPmlwdXNlclswXSk7CisJUF9FUlJPUigiSVVDViBjb25uZWN0aW9uIHNldmVyZWQgd2l0aCByYyA9IDB4JVhcbiIsIGlwdXNlclswXSk7CisJaXVjdl9wYXRoX3NldmVyKHBhdGgsIE5VTEwpOwogCWF0b21pY19zZXQoJm1vbnByaXYtPml1Y3Zfc2V2ZXJlZCwgMSk7CiAJd2FrZV91cCgmbW9uX2Nvbm5fd2FpdF9xdWV1ZSk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtb25fcmVhZF93YWl0X3F1ZXVlKTsKIH0KIAotc3RhdGljIHZvaWQKLW1vbl9pdWN2X01lc3NhZ2VQZW5kaW5nKGl1Y3ZfTWVzc2FnZVBlbmRpbmcgKmVpYiwgdm9pZCAqcGdtX2RhdGEpCitzdGF0aWMgdm9pZCBtb25faXVjdl9tZXNzYWdlX3BlbmRpbmcoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwKKwkJCQkgICAgIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZykKIHsKLQlzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYgPSAoc3RydWN0IG1vbl9wcml2YXRlICopIHBnbV9kYXRhOworCXN0cnVjdCBtb25fcHJpdmF0ZSAqbW9ucHJpdiA9IHBhdGgtPnByaXZhdGU7CiAKIAlQX0RFQlVHKCJJVUNWIG1lc3NhZ2UgcGVuZGluZ1xuIik7Ci0JbWVtY3B5KCZtb25wcml2LT5tc2dfYXJyYXlbbW9ucHJpdi0+d3JpdGVfaW5kZXhdLT5sb2NhbF9laWIsIGVpYiwKLQkgICAgICAgc2l6ZW9mKGl1Y3ZfTWVzc2FnZVBlbmRpbmcpKTsKKwltZW1jcHkoJm1vbnByaXYtPm1zZ19hcnJheVttb25wcml2LT53cml0ZV9pbmRleF0tPm1zZywKKwkgICAgICAgbXNnLCBzaXplb2YoKm1zZykpOwogCWlmIChhdG9taWNfaW5jX3JldHVybigmbW9ucHJpdi0+bXNnbGltX2NvdW50KSA9PSBNT05fTVNHTElNKSB7CiAJCVBfV0FSTklORygiSVVDViBtZXNzYWdlIHBlbmRpbmcsIG1lc3NhZ2UgbGltaXQgKCVpKSByZWFjaGVkXG4iLAogCQkJICBNT05fTVNHTElNKTsKQEAgLTM4NSw1NCArMzczLDQ1IEBACiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtb25fcmVhZF93YWl0X3F1ZXVlKTsKIH0KIAotc3RhdGljIGl1Y3ZfaW50ZXJydXB0X29wc190IG1vbl9pdWN2b3BzID0gewotCS5Db25uZWN0aW9uQ29tcGxldGUgPSBtb25faXVjdl9Db25uZWN0aW9uQ29tcGxldGUsCi0JLkNvbm5lY3Rpb25TZXZlcmVkICA9IG1vbl9pdWN2X0Nvbm5lY3Rpb25TZXZlcmVkLAotCS5NZXNzYWdlUGVuZGluZyAgICAgPSBtb25faXVjdl9NZXNzYWdlUGVuZGluZywKK3N0YXRpYyBzdHJ1Y3QgaXVjdl9oYW5kbGVyIG1vbnJlYWRlcl9pdWN2X2hhbmRsZXIgPSB7CisJLnBhdGhfY29tcGxldGUJID0gbW9uX2l1Y3ZfcGF0aF9jb21wbGV0ZSwKKwkucGF0aF9zZXZlcmVkCSA9IG1vbl9pdWN2X3BhdGhfc2V2ZXJlZCwKKwkubWVzc2FnZV9wZW5kaW5nID0gbW9uX2l1Y3ZfbWVzc2FnZV9wZW5kaW5nLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotbW9uX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IG1vbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWludCByYywgaTsKIAlzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXY7CisJaW50IHJjOwogCiAJLyoKIAkgKiBvbmx5IG9uZSB1c2VyIGFsbG93ZWQKIAkgKi8KKwlyYyA9IC1FQlVTWTsKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChNT05fSU5fVVNFLCAmbW9uX2luX3VzZSkpCi0JCXJldHVybiAtRUJVU1k7CisJCWdvdG8gb3V0OwogCisJcmMgPSAtRU5PTUVNOwogCW1vbnByaXYgPSBtb25fYWxsb2NfbWVtKCk7CiAJaWYgKCFtb25wcml2KQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXRfdXNlOwogCiAJLyoKLQkgKiBSZWdpc3RlciB3aXRoIElVQ1YgYW5kIGNvbm5lY3QgdG8gKk1PTklUT1Igc2VydmljZQorCSAqIENvbm5lY3QgdG8gKk1PTklUT1Igc2VydmljZQogCSAqLwotCW1vbnByaXYtPml1Y3ZfaGFuZGxlID0gaXVjdl9yZWdpc3Rlcl9wcm9ncmFtKCJteV9tb25yZWFkZXIgICAgIiwKLQkJCQkJCQlNT05fU0VSVklDRSwKLQkJCQkJCQlOVUxMLAotCQkJCQkJCSZtb25faXVjdm9wcywKLQkJCQkJCQltb25wcml2KTsKLQlpZiAoIW1vbnByaXYtPml1Y3ZfaGFuZGxlKSB7Ci0JCVBfRVJST1IoImZhaWxlZCB0byByZWdpc3RlciB3aXRoIGl1Y3YgZHJpdmVyXG4iKTsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dF9lcnJvcjsKLQl9Ci0JUF9JTkZPKCJvcGVuLCByZWdpc3RlcmVkIHdpdGggSVVDVlxuIik7Ci0KLQlyYyA9IGl1Y3ZfY29ubmVjdCgmbW9ucHJpdi0+cGF0aGlkLCBNT05fTVNHTElNLCB1c2VyX2RhdGFfY29ubmVjdCwKLQkJCSAgTU9OX1NFUlZJQ0UsIGl1Y3ZfaG9zdCwgSVBSTURBVEEsIE5VTEwsIE5VTEwsCi0JCQkgIG1vbnByaXYtPml1Y3ZfaGFuZGxlLCBOVUxMKTsKKwltb25wcml2LT5wYXRoID0gaXVjdl9wYXRoX2FsbG9jKE1PTl9NU0dMSU0sIElVQ1ZfSVBSTURBVEEsIEdGUF9LRVJORUwpOworCWlmICghbW9ucHJpdi0+cGF0aCkKKwkJZ290byBvdXRfcHJpdjsKKwlyYyA9IGl1Y3ZfcGF0aF9jb25uZWN0KG1vbnByaXYtPnBhdGgsICZtb25yZWFkZXJfaXVjdl9oYW5kbGVyLAorCQkJICAgICAgIE1PTl9TRVJWSUNFLCBOVUxMLCB1c2VyX2RhdGFfY29ubmVjdCwgbW9ucHJpdik7CiAJaWYgKHJjKSB7CiAJCVBfRVJST1IoIml1Y3YgY29ubmVjdGlvbiB0byAqTU9OSVRPUiBmYWlsZWQgd2l0aCAiCiAJCQkiSVBVU0VSIFNFVkVSIGNvZGUgPSAlaVxuIiwgcmMpOwogCQlyYyA9IC1FSU87Ci0JCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJCWdvdG8gb3V0X3BhdGg7CiAJfQogCS8qCiAJICogV2FpdCBmb3IgY29ubmVjdGlvbiBjb25maXJtYXRpb24KQEAgLTQ0NCwyNCArNDIzLDIzIEBACiAJCWF0b21pY19zZXQoJm1vbnByaXYtPml1Y3Zfc2V2ZXJlZCwgMCk7CiAJCWF0b21pY19zZXQoJm1vbnByaXYtPml1Y3ZfY29ubmVjdGVkLCAwKTsKIAkJcmMgPSAtRUlPOwotCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCQlnb3RvIG91dF9wYXRoOwogCX0KIAlQX0lORk8oIm9wZW4sIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24gdG8gKk1PTklUT1Igc2VydmljZVxuXG4iKTsKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBtb25wcml2OwogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKIAotb3V0X3VucmVnaXN0ZXI6Ci0JaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0obW9ucHJpdi0+aXVjdl9oYW5kbGUpOwotb3V0X2Vycm9yOgotCWZvciAoaSA9IDA7IGkgPCBNT05fTVNHTElNOyBpKyspCi0JCWtmcmVlKG1vbnByaXYtPm1zZ19hcnJheVtpXSk7Ci0Ja2ZyZWUobW9ucHJpdik7CitvdXRfcGF0aDoKKwlrZnJlZShtb25wcml2LT5wYXRoKTsKK291dF9wcml2OgorCW1vbl9mcmVlX21lbShtb25wcml2KTsKK291dF91c2U6CiAJY2xlYXJfYml0KE1PTl9JTl9VU0UsICZtb25faW5fdXNlKTsKK291dDoKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQKLW1vbl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgbW9uX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWludCByYywgaTsKIAlzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CkBAIC00NjksMTggKzQ0NywxMiBAQAogCS8qCiAJICogQ2xvc2UgSVVDViBjb25uZWN0aW9uIGFuZCB1bnJlZ2lzdGVyCiAJICovCi0JcmMgPSBpdWN2X3NldmVyKG1vbnByaXYtPnBhdGhpZCwgdXNlcl9kYXRhX3NldmVyKTsKKwlyYyA9IGl1Y3ZfcGF0aF9zZXZlcihtb25wcml2LT5wYXRoLCB1c2VyX2RhdGFfc2V2ZXIpOwogCWlmIChyYykKIAkJUF9FUlJPUigiY2xvc2UsIGl1Y3Zfc2V2ZXIgZmFpbGVkIHdpdGggcmMgPSAlaVxuIiwgcmMpOwogCWVsc2UKIAkJUF9JTkZPKCJjbG9zZSwgdGVybWluYXRlZCBjb25uZWN0aW9uIHRvICpNT05JVE9SIHNlcnZpY2VcbiIpOwogCi0JcmMgPSBpdWN2X3VucmVnaXN0ZXJfcHJvZ3JhbShtb25wcml2LT5pdWN2X2hhbmRsZSk7Ci0JaWYgKHJjKQotCQlQX0VSUk9SKCJjbG9zZSwgaXVjdl91bnJlZ2lzdGVyIGZhaWxlZCB3aXRoIHJjID0gJWlcbiIsIHJjKTsKLQllbHNlCi0JCVBfSU5GTygiY2xvc2UsIHVucmVnaXN0ZXJlZCB3aXRoIElVQ1ZcbiIpOwotCiAJYXRvbWljX3NldCgmbW9ucHJpdi0+aXVjdl9zZXZlcmVkLCAwKTsKIAlhdG9taWNfc2V0KCZtb25wcml2LT5pdWN2X2Nvbm5lY3RlZCwgMCk7CiAJYXRvbWljX3NldCgmbW9ucHJpdi0+cmVhZF9yZWFkeSwgMCk7CkBAIC00OTUsOCArNDY3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QKLW1vbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqZGF0YSwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCBtb25fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmRhdGEsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG1vbl9tc2cgKm1vbm1zZzsKQEAgLTU2Myw4ICs1MzUsNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludAotbW9uX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbW9uX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcCkKIHsKIAlzdHJ1Y3QgbW9uX3ByaXZhdGUgKm1vbnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKQEAgLTU5Myw4ICs1NjQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaW5pdC9leGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBfX2luaXQKLW1vbl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtb25faW5pdCh2b2lkKQogewogCWludCByYzsKIApAQCAtNjAzLDIyICs1NzMsMzQgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJLyoKKwkgKiBSZWdpc3RlciB3aXRoIElVQ1YgYW5kIGNvbm5lY3QgdG8gKk1PTklUT1Igc2VydmljZQorCSAqLworCXJjID0gaXVjdl9yZWdpc3RlcigmbW9ucmVhZGVyX2l1Y3ZfaGFuZGxlciwgMSk7CisJaWYgKHJjKSB7CisJCVBfRVJST1IoImZhaWxlZCB0byByZWdpc3RlciB3aXRoIGl1Y3YgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKwlQX0lORk8oIm9wZW4sIHJlZ2lzdGVyZWQgd2l0aCBJVUNWXG4iKTsKKwogCXJjID0gc2VnbWVudF90eXBlKG1vbl9kY3NzX25hbWUpOwogCWlmIChyYyA8IDApIHsKIAkJbW9uX3NlZ21lbnRfd2FybihyYywgbW9uX2Rjc3NfbmFtZSk7Ci0JCXJldHVybiByYzsKKwkJZ290byBvdXRfaXVjdjsKIAl9CiAJaWYgKHJjICE9IFNFR19UWVBFX1NDKSB7CiAJCVBfRVJST1IoInNlZ21lbnQgJXMgaGFzIHVuc3VwcG9ydGVkIHR5cGUsIHNob3VsZCBiZSBTQ1xuIiwKIAkJCW1vbl9kY3NzX25hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF9pdWN2OwogCX0KIAogCXJjID0gc2VnbWVudF9sb2FkKG1vbl9kY3NzX25hbWUsIFNFR01FTlRfU0hBUkVELAogCQkJICAmbW9uX2Rjc3Nfc3RhcnQsICZtb25fZGNzc19lbmQpOwogCWlmIChyYyA8IDApIHsKIAkJbW9uX3NlZ21lbnRfd2FybihyYywgbW9uX2Rjc3NfbmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2l1Y3Y7CiAJfQogCWRjc3NfbWtuYW1lKG1vbl9kY3NzX25hbWUsICZ1c2VyX2RhdGFfY29ubmVjdFs4XSk7CiAKQEAgLTYzNCwxNCArNjE2LDE2IEBACiAKIG91dDoKIAlzZWdtZW50X3VubG9hZChtb25fZGNzc19uYW1lKTsKK291dF9pdWN2OgorCWl1Y3ZfdW5yZWdpc3RlcigmbW9ucmVhZGVyX2l1Y3ZfaGFuZGxlciwgMSk7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLW1vbl9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgbW9uX2V4aXQodm9pZCkKIHsKIAlzZWdtZW50X3VubG9hZChtb25fZGNzc19uYW1lKTsKIAlXQVJOX09OKG1pc2NfZGVyZWdpc3RlcigmbW9uX2RldikgIT0gMCk7CisJaXVjdl91bnJlZ2lzdGVyKCZtb25yZWFkZXJfaXVjdl9oYW5kbGVyLCAxKTsKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMgYi9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jCmluZGV4IDRmODk0ZGMuLjg0MzJhNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYwpAQCAtMyw3ICszLDcgQEAKICAqCWNoYXJhY3RlciBkZXZpY2UgZHJpdmVyIGZvciByZWFkaW5nIHovVk0gc3lzdGVtIHNlcnZpY2UgcmVjb3JkcwogICoKICAqCi0gKglDb3B5cmlnaHQgKEMpIDIwMDQgSUJNIENvcnBvcmF0aW9uCisgKglDb3B5cmlnaHQgMjAwNCBJQk0gQ29ycG9yYXRpb24KICAqCWNoYXJhY3RlciBkZXZpY2UgZHJpdmVyIGZvciByZWFkaW5nIHovVk0gc3lzdGVtIHNlcnZpY2UgcmVjb3JkcywKICAqCVZlcnNpb24gMS4wCiAgKglBdXRob3Iocyk6IFhlbmlhIFRrYXRzY2hvdyA8eGVuaWFAdXMuaWJtLmNvbT4KQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxhc20vY3BjbWQuaD4KICNpbmNsdWRlIDxhc20vZGVidWcuaD4KICNpbmNsdWRlIDxhc20vZWJjZGljLmg+Ci0jaW5jbHVkZSAiLi4vbmV0L2l1Y3YuaCIKKyNpbmNsdWRlIDxuZXQvaXVjdi9pdWN2Lmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTYwLDEyICs2MCwxMSBAQAogCWNoYXIgc3lzdGVtX3NlcnZpY2VbOF07CiAJY2hhciBpbnRlcm5hbF9uYW1lWzhdOwogCWNoYXIgcmVjb3JkaW5nX25hbWVbOF07Ci0JdTE2IHBhdGhpZDsKKwlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoOwogCWludCBjb25uZWN0aW9uX2VzdGFibGlzaGVkOwogCWludCBpdWN2X3BhdGhfc2V2ZXJlZDsKLQlpdWN2X01lc3NhZ2VQZW5kaW5nIGxvY2FsX2ludGVycnVwdF9idWZmZXI7CisJc3RydWN0IGl1Y3ZfbWVzc2FnZSBsb2NhbF9pbnRlcnJ1cHRfYnVmZmVyOwogCWF0b21pY190IHJlY2VpdmVfcmVhZHk7Ci0JaXVjdl9oYW5kbGVfdCBpdWN2X2hhbmRsZTsKIAlpbnQgbWlub3JfbnVtOwogCWNoYXIgKiBidWZmZXI7CiAJY2hhciAqIGN1cnJlbnRfcG9zaXRpb247CkBAIC05NywzNyArOTYsMTkgQEAKIH07CiAKIAotc3RhdGljIHU4IGl1Y3ZNYWdpY1sxNl0gPSB7Ci0JMHhGMCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwKLQkweEYwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwCitzdGF0aWMgdm9pZCB2bWxvZ3Jkcl9pdWN2X3BhdGhfY29tcGxldGUoc3RydWN0IGl1Y3ZfcGF0aCAqLCB1OCBpcHVzZXJbMTZdKTsKK3N0YXRpYyB2b2lkIHZtbG9ncmRyX2l1Y3ZfcGF0aF9zZXZlcmVkKHN0cnVjdCBpdWN2X3BhdGggKiwgdTggaXB1c2VyWzE2XSk7CitzdGF0aWMgdm9pZCB2bWxvZ3Jkcl9pdWN2X21lc3NhZ2VfcGVuZGluZyhzdHJ1Y3QgaXVjdl9wYXRoICosCisJCQkJCSAgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqKTsKKworCitzdGF0aWMgc3RydWN0IGl1Y3ZfaGFuZGxlciB2bWxvZ3Jkcl9pdWN2X2hhbmRsZXIgPSB7CisJLnBhdGhfY29tcGxldGUJID0gdm1sb2dyZHJfaXVjdl9wYXRoX2NvbXBsZXRlLAorCS5wYXRoX3NldmVyZWQJID0gdm1sb2dyZHJfaXVjdl9wYXRoX3NldmVyZWQsCisJLm1lc3NhZ2VfcGVuZGluZyA9IHZtbG9ncmRyX2l1Y3ZfbWVzc2FnZV9wZW5kaW5nLAogfTsKIAogCi1zdGF0aWMgdTggbWFza1tdID0gewotCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0JMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKLX07Ci0KLQotc3RhdGljIHU4IGl1Y3ZfaG9zdFs4XSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwotCi0KLXN0YXRpYyB2b2lkCi12bWxvZ3Jkcl9pdWN2X0Nvbm5lY3Rpb25Db21wbGV0ZShpdWN2X0Nvbm5lY3Rpb25Db21wbGV0ZSAqZWliLCB2b2lkICpwZ21fZGF0YSk7Ci1zdGF0aWMgdm9pZAotdm1sb2dyZHJfaXVjdl9Db25uZWN0aW9uU2V2ZXJlZChpdWN2X0Nvbm5lY3Rpb25TZXZlcmVkICplaWIsIHZvaWQgKnBnbV9kYXRhKTsKLXN0YXRpYyB2b2lkCi12bWxvZ3Jkcl9pdWN2X01lc3NhZ2VQZW5kaW5nKGl1Y3ZfTWVzc2FnZVBlbmRpbmcgKmVpYiwgdm9pZCAqcGdtX2RhdGEpOwotCi0KLXN0YXRpYyBpdWN2X2ludGVycnVwdF9vcHNfdCB2bWxvZ3Jkcl9pdWN2b3BzID0gewotCS5Db25uZWN0aW9uQ29tcGxldGUgPSB2bWxvZ3Jkcl9pdWN2X0Nvbm5lY3Rpb25Db21wbGV0ZSwKLQkuQ29ubmVjdGlvblNldmVyZWQgID0gdm1sb2dyZHJfaXVjdl9Db25uZWN0aW9uU2V2ZXJlZCwKLQkuTWVzc2FnZVBlbmRpbmcgICAgID0gdm1sb2dyZHJfaXVjdl9NZXNzYWdlUGVuZGluZywKLX07Ci0KIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChjb25uX3dhaXRfcXVldWUpOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHJlYWRfd2FpdF9xdWV1ZSk7CiAKQEAgLTE3NiwyOCArMTU3LDI5IEBACiBzdGF0aWMgaW50IHJlY29yZGluZ19jbGFzc19BQjsKIAogCi1zdGF0aWMgdm9pZAotdm1sb2dyZHJfaXVjdl9Db25uZWN0aW9uQ29tcGxldGUgKGl1Y3ZfQ29ubmVjdGlvbkNvbXBsZXRlICogZWliLAotCQkJCSAgIHZvaWQgKiBwZ21fZGF0YSkKK3N0YXRpYyB2b2lkIHZtbG9ncmRyX2l1Y3ZfcGF0aF9jb21wbGV0ZShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCB1OCBpcHVzZXJbMTZdKQogewotCXN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKiBsb2dwdHIgPSBwZ21fZGF0YTsKKwlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICogbG9ncHRyID0gcGF0aC0+cHJpdmF0ZTsKKwogCXNwaW5fbG9jaygmbG9ncHRyLT5wcml2X2xvY2spOwogCWxvZ3B0ci0+Y29ubmVjdGlvbl9lc3RhYmxpc2hlZCA9IDE7CiAJc3Bpbl91bmxvY2soJmxvZ3B0ci0+cHJpdl9sb2NrKTsKIAl3YWtlX3VwKCZjb25uX3dhaXRfcXVldWUpOwotCXJldHVybjsKIH0KIAogCi1zdGF0aWMgdm9pZAotdm1sb2dyZHJfaXVjdl9Db25uZWN0aW9uU2V2ZXJlZCAoaXVjdl9Db25uZWN0aW9uU2V2ZXJlZCAqIGVpYiwgdm9pZCAqIHBnbV9kYXRhKQorc3RhdGljIHZvaWQgdm1sb2dyZHJfaXVjdl9wYXRoX3NldmVyZWQoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggaXB1c2VyWzE2XSkKIHsKLQl1OCByZWFzb24gPSAodTgpIGVpYi0+aXB1c2VyWzhdOwotCXN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKiBsb2dwdHIgPSBwZ21fZGF0YTsKKwlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICogbG9ncHRyID0gcGF0aC0+cHJpdmF0ZTsKKwl1OCByZWFzb24gPSAodTgpIGlwdXNlcls4XTsKIAogCXByaW50ayAoS0VSTl9FUlIgInZtbG9ncmRyOiBjb25uZWN0aW9uIHNldmVyZWQgd2l0aCIKIAkJIiByZWFzb24gJWlcbiIsIHJlYXNvbik7CiAKKwlpdWN2X3BhdGhfc2V2ZXIocGF0aCwgTlVMTCk7CisJa2ZyZWUocGF0aCk7CisJbG9ncHRyLT5wYXRoID0gTlVMTDsKKwogCXNwaW5fbG9jaygmbG9ncHRyLT5wcml2X2xvY2spOwogCWxvZ3B0ci0+Y29ubmVjdGlvbl9lc3RhYmxpc2hlZCA9IDA7CiAJbG9ncHRyLT5pdWN2X3BhdGhfc2V2ZXJlZCA9IDE7CkBAIC0yMDksMTAgKzE5MSwxMCBAQAogfQogCiAKLXN0YXRpYyB2b2lkCi12bWxvZ3Jkcl9pdWN2X01lc3NhZ2VQZW5kaW5nIChpdWN2X01lc3NhZ2VQZW5kaW5nICogZWliLCB2b2lkICogcGdtX2RhdGEpCitzdGF0aWMgdm9pZCB2bWxvZ3Jkcl9pdWN2X21lc3NhZ2VfcGVuZGluZyhzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLAorCQkJCQkgIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZykKIHsKLQlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICogbG9ncHRyID0gcGdtX2RhdGE7CisJc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqIGxvZ3B0ciA9IHBhdGgtPnByaXZhdGU7CiAKIAkvKgogCSAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGJvdHRvbSBoYWxmIHNvIGl0IHNob3VsZCBiZSBxdWljay4KQEAgLTIyMCwxNSArMjAyLDE1IEBACiAJICogdGhlIHVzYWdlIGNvdW50CiAJICovCiAJc3Bpbl9sb2NrKCZsb2dwdHItPnByaXZfbG9jayk7Ci0JbWVtY3B5KCYobG9ncHRyLT5sb2NhbF9pbnRlcnJ1cHRfYnVmZmVyKSwgZWliLCBzaXplb2YoKmVpYikpOworCW1lbWNweSgmbG9ncHRyLT5sb2NhbF9pbnRlcnJ1cHRfYnVmZmVyLCBtc2csIHNpemVvZigqbXNnKSk7CiAJYXRvbWljX2luYygmbG9ncHRyLT5yZWNlaXZlX3JlYWR5KTsKIAlzcGluX3VubG9jaygmbG9ncHRyLT5wcml2X2xvY2spOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmVhZF93YWl0X3F1ZXVlKTsKIH0KIAogCi1zdGF0aWMgaW50Ci12bWxvZ3Jkcl9nZXRfcmVjb3JkaW5nX2NsYXNzX0FCKHZvaWQpIHsKK3N0YXRpYyBpbnQgdm1sb2dyZHJfZ2V0X3JlY29yZGluZ19jbGFzc19BQih2b2lkKQorewogCWNoYXIgY3BfY29tbWFuZFtdPSJRVUVSWSBDT01NQU5EIFJFQ09SRElORyAiOwogCWNoYXIgY3BfcmVzcG9uc2VbODBdOwogCWNoYXIgKnRhaWw7CkBAIC0yNTgsOCArMjQwLDkgQEAKIH0KIAogCi1zdGF0aWMgaW50Ci12bWxvZ3Jkcl9yZWNvcmRpbmcoc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqIGxvZ3B0ciwgaW50IGFjdGlvbiwgaW50IHB1cmdlKSB7CitzdGF0aWMgaW50IHZtbG9ncmRyX3JlY29yZGluZyhzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICogbG9ncHRyLAorCQkJICAgICAgaW50IGFjdGlvbiwgaW50IHB1cmdlKQorewogCiAJY2hhciBjcF9jb21tYW5kWzgwXTsKIAljaGFyIGNwX3Jlc3BvbnNlWzE2MF07CkBAIC0zMTcsOCArMzAwLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50Ci12bWxvZ3Jkcl9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgdm1sb2dyZHJfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaW50IGRldl9udW0gPSAwOwogCXN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKiBsb2dwdHIgPSBOVUxMOwpAQCAtMzI4LDEwICszMTAsNyBAQAogCWRldl9udW0gPSBpbWlub3IoaW5vZGUpOwogCWlmIChkZXZfbnVtID4gTUFYTUlOT1IpCiAJCXJldHVybiAtRU5PREVWOwotCiAJbG9ncHRyID0gJnN5c19zZXJbZGV2X251bV07Ci0JaWYgKGxvZ3B0ciA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qCiAJICogb25seSBhbGxvdyBmb3IgYmxvY2tpbmcgcmVhZHMgdG8gYmUgb3BlbgpAQCAtMzQ0LDUyICszMjMsMzggQEAKIAlpZiAobG9ncHRyLT5kZXZfaW5fdXNlKQl7CiAJCXNwaW5fdW5sb2NrX2JoKCZsb2dwdHItPnByaXZfbG9jayk7CiAJCXJldHVybiAtRUJVU1k7Ci0JfSBlbHNlIHsKLQkJbG9ncHRyLT5kZXZfaW5fdXNlID0gMTsKLQkJc3Bpbl91bmxvY2tfYmgoJmxvZ3B0ci0+cHJpdl9sb2NrKTsKIAl9Ci0KKwlsb2dwdHItPmRldl9pbl91c2UgPSAxOworCWxvZ3B0ci0+Y29ubmVjdGlvbl9lc3RhYmxpc2hlZCA9IDA7CisJbG9ncHRyLT5pdWN2X3BhdGhfc2V2ZXJlZCA9IDA7CiAJYXRvbWljX3NldCgmbG9ncHRyLT5yZWNlaXZlX3JlYWR5LCAwKTsKIAlsb2dwdHItPmJ1ZmZlcl9mcmVlID0gMTsKKwlzcGluX3VubG9ja19iaCgmbG9ncHRyLT5wcml2X2xvY2spOwogCiAJLyogc2V0IHRoZSBmaWxlIG9wdGlvbnMgKi8KIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBsb2dwdHI7CiAJZmlscC0+Zl9vcCA9ICZ2bWxvZ3Jkcl9mb3BzOwogCiAJLyogc3RhcnQgcmVjb3JkaW5nIGZvciB0aGlzIHNlcnZpY2UqLwotCXJldD0wOwotCWlmIChsb2dwdHItPmF1dG9yZWNvcmRpbmcpCisJaWYgKGxvZ3B0ci0+YXV0b3JlY29yZGluZykgewogCQlyZXQgPSB2bWxvZ3Jkcl9yZWNvcmRpbmcobG9ncHRyLDEsbG9ncHRyLT5hdXRvcHVyZ2UpOwotCWlmIChyZXQpCi0JCXByaW50ayAoS0VSTl9XQVJOSU5HICJ2bWxvZ3JkcjogZmFpbGVkIHRvIHN0YXJ0ICIKLQkJCSJyZWNvcmRpbmcgYXV0b21hdGljYWxseVxuIik7Ci0KLQkvKiBSZWdpc3RlciB3aXRoIGl1Y3YgZHJpdmVyICovCi0JbG9ncHRyLT5pdWN2X2hhbmRsZSA9IGl1Y3ZfcmVnaXN0ZXJfcHJvZ3JhbShpdWN2TWFnaWMsCi0JCQlsb2dwdHItPnN5c3RlbV9zZXJ2aWNlLCBtYXNrLCAmdm1sb2dyZHJfaXVjdm9wcywKLQkJCWxvZ3B0cik7Ci0KLQlpZiAobG9ncHRyLT5pdWN2X2hhbmRsZSA9PSBOVUxMKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgInZtbG9ncmRyOiBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCIKLQkJCSJpdWN2IGRyaXZlclxuIik7Ci0JCWdvdG8gbm90X3JlZ2lzdGVyZWQ7CisJCWlmIChyZXQpCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAidm1sb2dyZHI6IGZhaWxlZCB0byBzdGFydCAiCisJCQkJInJlY29yZGluZyBhdXRvbWF0aWNhbGx5XG4iKTsKIAl9CiAKIAkvKiBjcmVhdGUgY29ubmVjdGlvbiB0byB0aGUgc3lzdGVtIHNlcnZpY2UgKi8KLQlzcGluX2xvY2tfYmgoJmxvZ3B0ci0+cHJpdl9sb2NrKTsKLQlsb2dwdHItPmNvbm5lY3Rpb25fZXN0YWJsaXNoZWQgPSAwOwotCWxvZ3B0ci0+aXVjdl9wYXRoX3NldmVyZWQgPSAwOwotCXNwaW5fdW5sb2NrX2JoKCZsb2dwdHItPnByaXZfbG9jayk7Ci0KLQljb25uZWN0X3JjID0gaXVjdl9jb25uZWN0ICgmKGxvZ3B0ci0+cGF0aGlkKSwgMTAsIGl1Y3ZNYWdpYywKLQkJCQkJbG9ncHRyLT5zeXN0ZW1fc2VydmljZSwgaXVjdl9ob3N0LCAwLAotCQkJCQlOVUxMLCBOVUxMLAotCQkJCQlsb2dwdHItPml1Y3ZfaGFuZGxlLCBOVUxMKTsKKwlsb2dwdHItPnBhdGggPSBpdWN2X3BhdGhfYWxsb2MoMTAsIDAsIEdGUF9LRVJORUwpOworCWlmICghbG9ncHRyLT5wYXRoKQorCQlnb3RvIG91dF9kZXY7CisJY29ubmVjdF9yYyA9IGl1Y3ZfcGF0aF9jb25uZWN0KGxvZ3B0ci0+cGF0aCwgJnZtbG9ncmRyX2l1Y3ZfaGFuZGxlciwKKwkJCQkgICAgICAgbG9ncHRyLT5zeXN0ZW1fc2VydmljZSwgTlVMTCwgTlVMTCwKKwkJCQkgICAgICAgbG9ncHRyKTsKIAlpZiAoY29ubmVjdF9yYykgewogCQlwcmludGsgKEtFUk5fRVJSICJ2bWxvZ3JkcjogaXVjdiBjb25uZWN0aW9uIHRvICVzICIKIAkJCSJmYWlsZWQgd2l0aCByYyAlaSBcbiIsIGxvZ3B0ci0+c3lzdGVtX3NlcnZpY2UsCiAJCQljb25uZWN0X3JjKTsKLQkJZ290byBub3RfY29ubmVjdGVkOworCQlnb3RvIG91dF9wYXRoOwogCX0KIAogCS8qIFdlJ3ZlIGlzc3VlZCB0aGUgY29ubmVjdCBhbmQgbm93IHdlIG11c3Qgd2FpdCBmb3IgYQpAQCAtMzk4LDM1ICszNjMsMjggQEAKIAkgKi8KIAl3YWl0X2V2ZW50KGNvbm5fd2FpdF9xdWV1ZSwgKGxvZ3B0ci0+Y29ubmVjdGlvbl9lc3RhYmxpc2hlZCkKIAkJICAgfHwgKGxvZ3B0ci0+aXVjdl9wYXRoX3NldmVyZWQpKTsKLQlpZiAobG9ncHRyLT5pdWN2X3BhdGhfc2V2ZXJlZCkgewotCQlnb3RvIG5vdF9jb25uZWN0ZWQ7Ci0JfQotCisJaWYgKGxvZ3B0ci0+aXVjdl9wYXRoX3NldmVyZWQpCisJCWdvdG8gb3V0X3JlY29yZDsKICAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApOwogCi1ub3RfY29ubmVjdGVkOgotCWl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtKGxvZ3B0ci0+aXVjdl9oYW5kbGUpOwotCWxvZ3B0ci0+aXVjdl9oYW5kbGUgPSBOVUxMOwotbm90X3JlZ2lzdGVyZWQ6CitvdXRfcmVjb3JkOgogCWlmIChsb2dwdHItPmF1dG9yZWNvcmRpbmcpCiAJCXZtbG9ncmRyX3JlY29yZGluZyhsb2dwdHIsMCxsb2dwdHItPmF1dG9wdXJnZSk7CitvdXRfcGF0aDoKKwlrZnJlZShsb2dwdHItPnBhdGgpOwkvKiBrZnJlZShOVUxMKSBpcyBvay4gKi8KKwlsb2dwdHItPnBhdGggPSBOVUxMOworb3V0X2RldjoKIAlsb2dwdHItPmRldl9pbl91c2UgPSAwOwogCXJldHVybiAtRUlPOwotCi0KIH0KIAogCi1zdGF0aWMgaW50Ci12bWxvZ3Jkcl9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgdm1sb2dyZHJfcmVsZWFzZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaW50IHJldDsKIAogCXN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKiBsb2dwdHIgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKLQlpdWN2X3VucmVnaXN0ZXJfcHJvZ3JhbShsb2dwdHItPml1Y3ZfaGFuZGxlKTsKLQlsb2dwdHItPml1Y3ZfaGFuZGxlID0gTlVMTDsKLQogCWlmIChsb2dwdHItPmF1dG9yZWNvcmRpbmcpIHsKIAkJcmV0ID0gdm1sb2dyZHJfcmVjb3JkaW5nKGxvZ3B0ciwwLGxvZ3B0ci0+YXV0b3B1cmdlKTsKIAkJaWYgKHJldCkKQEAgLTQzOSw4ICszOTcsOCBAQAogfQogCiAKLXN0YXRpYyBpbnQKLXZtbG9ncmRyX3JlY2VpdmVfZGF0YShzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICpwcml2KSB7CitzdGF0aWMgaW50IHZtbG9ncmRyX3JlY2VpdmVfZGF0YShzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICpwcml2KQorewogCWludCByYywgKnRlbXA7CiAJLyogd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHR3byBkYXRhIHNpemVzIGhlcmU6CiAJICogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBuZWVkIHRvIHJlY2VpdmUgZnJvbSBpdWN2IGFuZApAQCAtNDYxLDggKzQxOSw3IEBACiAJCQkgKiBXZSBuZWVkIHRvIHJldHVybiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSByZWNvcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAqICsgc2l6ZSBvZiBGRU5DRSBpbiB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgYnVmZmVyLgogCQkgICAgICAgICAqLwotCQkJaXVjdl9kYXRhX2NvdW50ID0KLQkJCQlwcml2LT5sb2NhbF9pbnRlcnJ1cHRfYnVmZmVyLmxuMW1zZzIuaXBiZmxuMWY7CisJCQlpdWN2X2RhdGFfY291bnQgPSBwcml2LT5sb2NhbF9pbnRlcnJ1cHRfYnVmZmVyLmxlbmd0aDsKIAkJCXVzZXJfZGF0YV9jb3VudCA9IHNpemVvZihpbnQpOwogCQkJdGVtcCA9IChpbnQqKXByaXYtPmJ1ZmZlcjsKIAkJCSp0ZW1wPSBpdWN2X2RhdGFfY291bnQgKyBzaXplb2YoRkVOQ0UpOwpAQCAtNDc0LDE0ICs0MzEsMTAgQEAKIAkJICovCiAJCWlmIChpdWN2X2RhdGFfY291bnQgPiBORVRfQlVGRkVSX1NJWkUpCiAJCQlpdWN2X2RhdGFfY291bnQgPSBORVRfQlVGRkVSX1NJWkU7Ci0JCXJjID0gaXVjdl9yZWNlaXZlKHByaXYtPnBhdGhpZCwKLQkJCQkgIHByaXYtPmxvY2FsX2ludGVycnVwdF9idWZmZXIuaXBtc2dpZCwKLQkJCQkgIHByaXYtPmxvY2FsX2ludGVycnVwdF9idWZmZXIuaXB0cmdjbHMsCi0JCQkJICBidWZmZXIsCi0JCQkJICBpdWN2X2RhdGFfY291bnQsCi0JCQkJICBOVUxMLAotCQkJCSAgTlVMTCwKLQkJCQkgICZwcml2LT5yZXNpZHVhbF9sZW5ndGgpOworCQlyYyA9IGl1Y3ZfbWVzc2FnZV9yZWNlaXZlKHByaXYtPnBhdGgsCisJCQkJCSAgJnByaXYtPmxvY2FsX2ludGVycnVwdF9idWZmZXIsCisJCQkJCSAgMCwgYnVmZmVyLCBpdWN2X2RhdGFfY291bnQsCisJCQkJCSAgJnByaXYtPnJlc2lkdWFsX2xlbmd0aCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5wcml2X2xvY2spOwogCQkvKiBBbiByYyBvZiA1IGluZGljYXRlcyB0aGF0IHRoZSByZWNvcmQgd2FzIGJpZ2dlciB0aGVuCiAJCSAqIHRoZSBidWZmZXIsIHdoaWNoIGlzIE9LIGZvciB1cy4gQSA5IGluZGljYXRlcyB0aGF0IHRoZQpAQCAtNTEzLDggKzQ2Niw4IEBACiB9CiAKIAotc3RhdGljIHNzaXplX3QKLXZtbG9ncmRyX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCitzdGF0aWMgc3NpemVfdCB2bWxvZ3Jkcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewogCWludCByYzsKIAlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICogcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKQEAgLTU0Niw4ICs0OTksMTAgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci12bWxvZ3Jkcl9hdXRvcHVyZ2Vfc3RvcmUoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkgeworc3RhdGljIHNzaXplX3Qgdm1sb2dyZHJfYXV0b3B1cmdlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiBkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CiAJc3RydWN0IHZtbG9ncmRyX3ByaXZfdCAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAJc3NpemVfdCByZXQgPSBjb3VudDsKIApAQCAtNTY1LDggKzUyMCwxMCBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90Ci12bWxvZ3Jkcl9hdXRvcHVyZ2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIHsKK3N0YXRpYyBzc2l6ZV90IHZtbG9ncmRyX2F1dG9wdXJnZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKIAlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcHJpdi0+YXV0b3B1cmdlKTsKIH0KQEAgLTU3Niw4ICs1MzMsMTAgQEAKIAkJICAgdm1sb2dyZHJfYXV0b3B1cmdlX3N0b3JlKTsKIAogCi1zdGF0aWMgc3NpemVfdAotdm1sb2dyZHJfcHVyZ2Vfc3RvcmUoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkgeworc3RhdGljIHNzaXplX3Qgdm1sb2dyZHJfcHVyZ2Vfc3RvcmUoc3RydWN0IGRldmljZSAqIGRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKIAogCWNoYXIgY3BfY29tbWFuZFs4MF07CiAJY2hhciBjcF9yZXNwb25zZVs4MF07CkBAIC02MTcsOSArNTc2LDEwIEBACiBzdGF0aWMgREVWSUNFX0FUVFIocHVyZ2UsIDAyMDAsIE5VTEwsIHZtbG9ncmRyX3B1cmdlX3N0b3JlKTsKIAogCi1zdGF0aWMgc3NpemVfdAotdm1sb2dyZHJfYXV0b3JlY29yZGluZ19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgIHNpemVfdCBjb3VudCkgeworc3RhdGljIHNzaXplX3Qgdm1sb2dyZHJfYXV0b3JlY29yZGluZ19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorewogCXN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCXNzaXplX3QgcmV0ID0gY291bnQ7CiAKQEAgLTYzNyw4ICs1OTcsMTAgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdAotdm1sb2dyZHJfYXV0b3JlY29yZGluZ19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zikgeworc3RhdGljIHNzaXplX3Qgdm1sb2dyZHJfYXV0b3JlY29yZGluZ19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgIGNoYXIgKmJ1ZikKK3sKIAlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcHJpdi0+YXV0b3JlY29yZGluZyk7CiB9CkBAIC02NDgsOSArNjEwLDEwIEBACiAJCSAgIHZtbG9ncmRyX2F1dG9yZWNvcmRpbmdfc3RvcmUpOwogCiAKLXN0YXRpYyBzc2l6ZV90Ci12bWxvZ3Jkcl9yZWNvcmRpbmdfc3RvcmUoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkgewotCitzdGF0aWMgc3NpemVfdCB2bWxvZ3Jkcl9yZWNvcmRpbmdfc3RvcmUoc3RydWN0IGRldmljZSAqIGRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKIAlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIAlzc2l6ZV90IHJldDsKIApAQCAtNjc1LDggKzYzOCw5IEBACiBzdGF0aWMgREVWSUNFX0FUVFIocmVjb3JkaW5nLCAwMjAwLCBOVUxMLCB2bWxvZ3Jkcl9yZWNvcmRpbmdfc3RvcmUpOwogCiAKLXN0YXRpYyBzc2l6ZV90Ci12bWxvZ3Jkcl9yZWNvcmRpbmdfc3RhdHVzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciwgY2hhciAqYnVmKSB7CitzdGF0aWMgc3NpemVfdCB2bWxvZ3Jkcl9yZWNvcmRpbmdfc3RhdHVzX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciwKKwkJCQkJICAgICAgY2hhciAqYnVmKQorewogCiAJY2hhciBjcF9jb21tYW5kW10gPSAiUVVFUlkgUkVDT1JESU5HICI7CiAJaW50IGxlbjsKQEAgLTcwOSw1MiArNjczLDYzIEBACiB9OwogCiAKLXN0YXRpYyBpbnQKLXZtbG9ncmRyX3JlZ2lzdGVyX2RyaXZlcih2b2lkKSB7CitzdGF0aWMgaW50IHZtbG9ncmRyX3JlZ2lzdGVyX2RyaXZlcih2b2lkKQorewogCWludCByZXQ7CiAKKwkvKiBSZWdpc3RlciB3aXRoIGl1Y3YgZHJpdmVyICovCisJcmV0ID0gaXVjdl9yZWdpc3Rlcigmdm1sb2dyZHJfaXVjdl9oYW5kbGVyLCAxKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayAoS0VSTl9FUlIgInZtbG9ncmRyOiBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCIKKwkJCSJpdWN2IGRyaXZlclxuIik7CisJCWdvdG8gb3V0OworCX0KKwogCXJldCA9IGRyaXZlcl9yZWdpc3Rlcigmdm1sb2dyZHJfZHJpdmVyKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAidm1sb2dyZHI6IGZhaWxlZCB0byByZWdpc3RlciBkcml2ZXIuXG4iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfaXVjdjsKIAl9CiAKIAlyZXQgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJnZtbG9ncmRyX2RyaXZlciwKIAkJCQkgJmRyaXZlcl9hdHRyX3JlY29yZGluZ19zdGF0dXMpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ2bWxvZ3JkcjogZmFpbGVkIHRvIGFkZCBkcml2ZXIgYXR0cmlidXRlLlxuIik7Ci0JCWdvdG8gdW5yZWdkcml2ZXI7CisJCWdvdG8gb3V0X2RyaXZlcjsKIAl9CiAKIAl2bWxvZ3Jkcl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInZtbG9ncmRyIik7CiAJaWYgKElTX0VSUih2bWxvZ3Jkcl9jbGFzcykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ2bWxvZ3JkcjogZmFpbGVkIHRvIGNyZWF0ZSBjbGFzcy5cbiIpOwotCQlyZXQ9UFRSX0VSUih2bWxvZ3Jkcl9jbGFzcyk7Ci0JCXZtbG9ncmRyX2NsYXNzPU5VTEw7Ci0JCWdvdG8gdW5yZWdhdHRyOworCQlyZXQgPSBQVFJfRVJSKHZtbG9ncmRyX2NsYXNzKTsKKwkJdm1sb2dyZHJfY2xhc3MgPSBOVUxMOworCQlnb3RvIG91dF9hdHRyOwogCX0KIAlyZXR1cm4gMDsKIAotdW5yZWdhdHRyOgorb3V0X2F0dHI6CiAJZHJpdmVyX3JlbW92ZV9maWxlKCZ2bWxvZ3Jkcl9kcml2ZXIsICZkcml2ZXJfYXR0cl9yZWNvcmRpbmdfc3RhdHVzKTsKLXVucmVnZHJpdmVyOgorb3V0X2RyaXZlcjoKIAlkcml2ZXJfdW5yZWdpc3Rlcigmdm1sb2dyZHJfZHJpdmVyKTsKK291dF9pdWN2OgorCWl1Y3ZfdW5yZWdpc3Rlcigmdm1sb2dyZHJfaXVjdl9oYW5kbGVyLCAxKTsKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCiAKLXN0YXRpYyB2b2lkCi12bWxvZ3Jkcl91bnJlZ2lzdGVyX2RyaXZlcih2b2lkKSB7CitzdGF0aWMgdm9pZCB2bWxvZ3Jkcl91bnJlZ2lzdGVyX2RyaXZlcih2b2lkKQorewogCWNsYXNzX2Rlc3Ryb3kodm1sb2dyZHJfY2xhc3MpOwogCXZtbG9ncmRyX2NsYXNzID0gTlVMTDsKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnZtbG9ncmRyX2RyaXZlciwgJmRyaXZlcl9hdHRyX3JlY29yZGluZ19zdGF0dXMpOwogCWRyaXZlcl91bnJlZ2lzdGVyKCZ2bWxvZ3Jkcl9kcml2ZXIpOwotCXJldHVybjsKKwlpdWN2X3VucmVnaXN0ZXIoJnZtbG9ncmRyX2l1Y3ZfaGFuZGxlciwgMSk7CiB9CiAKIAotc3RhdGljIGludAotdm1sb2dyZHJfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKnByaXYpIHsKK3N0YXRpYyBpbnQgdm1sb2dyZHJfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKnByaXYpCit7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCWludCByZXQ7CiAKQEAgLTgwMyw5ICs3NzgsMTAgQEAKIH0KIAogCi1zdGF0aWMgaW50Ci12bWxvZ3Jkcl91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICpwcml2ICkgewotCWNsYXNzX2RldmljZV9kZXN0cm95KHZtbG9ncmRyX2NsYXNzLCBNS0RFVih2bWxvZ3Jkcl9tYWpvciwgcHJpdi0+bWlub3JfbnVtKSk7CitzdGF0aWMgaW50IHZtbG9ncmRyX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2bWxvZ3Jkcl9wcml2X3QgKnByaXYpCit7CisJY2xhc3NfZGV2aWNlX2Rlc3Ryb3kodm1sb2dyZHJfY2xhc3MsCisJCQkgICAgIE1LREVWKHZtbG9ncmRyX21ham9yLCBwcml2LT5taW5vcl9udW0pKTsKIAlpZiAocHJpdi0+ZGV2aWNlICE9IE5VTEwpIHsKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwcml2LT5kZXZpY2UtPmtvYmosICZ2bWxvZ3Jkcl9hdHRyX2dyb3VwKTsKIAkJZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+ZGV2aWNlKTsKQEAgLTgxNSw4ICs3OTEsOCBAQAogfQogCiAKLXN0YXRpYyBpbnQKLXZtbG9ncmRyX3JlZ2lzdGVyX2NkZXYoZGV2X3QgZGV2KSB7CitzdGF0aWMgaW50IHZtbG9ncmRyX3JlZ2lzdGVyX2NkZXYoZGV2X3QgZGV2KQorewogCWludCByYyA9IDA7CiAJdm1sb2dyZHJfY2RldiA9IGNkZXZfYWxsb2MoKTsKIAlpZiAoIXZtbG9ncmRyX2NkZXYpIHsKQEAgLTgzNiw5ICs4MTIsMTAgQEAKIH0KIAogCi1zdGF0aWMgdm9pZAotdm1sb2dyZHJfY2xlYW51cCh2b2lkKSB7CitzdGF0aWMgdm9pZCB2bWxvZ3Jkcl9jbGVhbnVwKHZvaWQpCit7CiAgICAgICAgIGludCBpOworCiAJaWYgKHZtbG9ncmRyX2NkZXYpIHsKIAkJY2Rldl9kZWwodm1sb2dyZHJfY2Rldik7CiAJCXZtbG9ncmRyX2NkZXY9TlVMTDsKQEAgLTg1NSw4ICs4MzIsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQKLXZtbG9ncmRyX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgdm1sb2dyZHJfaW5pdCh2b2lkKQogewogCWludCByYzsKIAlpbnQgaTsKQEAgLTkwNiw4ICs4ODIsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkCi12bWxvZ3Jkcl9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCB2bWxvZ3Jkcl9leGl0KHZvaWQpCiB7CiAJdm1sb2dyZHJfY2xlYW51cCgpOwogCXByaW50ayAoS0VSTl9JTkZPICJ2bWxvZ3JkcjogZHJpdmVyIHVubG9hZGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvczM5MC9uZXQvS2NvbmZpZwppbmRleCA1MjYyNTE1Li5mOThmYTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9zMzkwL25ldC9LY29uZmlnCkBAIC0yMiwxMyArMjIsNiBAQAogCSAgYXZhaWxhYmxlLiAgVGhpcyBvcHRpb24gaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgd2hpY2ggd2lsbCBiZQogCSAgY2FsbGVkIGN0Yy5rby4gIElmIHlvdSBkbyBub3Qga25vdyB3aGF0IGl0IGlzLCBpdCdzIHNhZmUgdG8gc2F5ICJZIi4KIAotY29uZmlnIElVQ1YKLQl0cmlzdGF0ZSAiSVVDViBzdXBwb3J0IChWTSBvbmx5KSIKLQloZWxwCi0JICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIGludGVyLXVzZXIgY29tbXVuaWNhdGlvbgotCSAgdW5kZXIgVk0gb3IgVklGLiBJZiB1bnN1cmUsIHNheSAiWSIgdG8gZW5hYmxlIGEgZmFzdCBjb21tdW5pY2F0aW9uCi0JICBsaW5rIGJldHdlZW4gVk0gZ3Vlc3RzLgotCiBjb25maWcgTkVUSVVDVgogCXRyaXN0YXRlICJJVUNWIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQgKFZNIG9ubHkpIgogCWRlcGVuZHMgb24gSVVDViAmJiBORVRERVZJQ0VTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9zMzkwL25ldC9NYWtlZmlsZQppbmRleCA0Nzc3ZTM2Li5iYmUzYWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvTWFrZWZpbGUKQEAgLTQsNyArNCw2IEBACiAKIGN0Yy1vYmpzIDo9IGN0Y21haW4ubyBjdGNkYnVnLm8KIAotb2JqLSQoQ09ORklHX0lVQ1YpICs9IGl1Y3Yubwogb2JqLSQoQ09ORklHX05FVElVQ1YpICs9IG5ldGl1Y3YubyBmc20ubwogb2JqLSQoQ09ORklHX1NNU0dJVUNWKSArPSBzbXNnaXVjdi5vCiBvYmotJChDT05GSUdfQ1RDKSArPSBjdGMubyBmc20ubyBjdTMwODgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9pdWN2LmMgYi9kcml2ZXJzL3MzOTAvbmV0L2l1Y3YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5YWViNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2l1Y3YuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NDAgKzAsMCBAQAotLyoKLSAqIElVQ1YgbmV0d29yayBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgotICogQXV0aG9yKHMpOgotICogICAgT3JpZ2luYWwgc291cmNlOgotICogICAgICBBbGFuIEFsdG1hcmsgKEFsYW5fQWx0bWFya0B1cy5pYm0uY29tKSAgU2VwdC4gMjAwMAotICogICAgICBYZW5pYSBUa2F0c2Nob3cgKHhlbmlhQHVzLmlibS5jb20pCi0gKiAgICAyR2IgYXdhcmVuZXNzIGFuZCBnZW5lcmFsIGNsZWFudXA6Ci0gKiAgICAgIEZyaXR6IEVsZmVydCAoZWxmZXJ0QGRlLmlibS5jb20sIGZlbGZlcnRAbWlsbGVudXguY29tKQotICoKLSAqIERvY3VtZW50YXRpb24gdXNlZDoKLSAqICAgIFRoZSBvcmlnaW5hbCBzb3VyY2UKLSAqICAgIENQIFByb2dyYW1taW5nIFNlcnZpY2UsIElCTSBkb2N1bWVudCAjIFNDMjQtNTc2MAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqLwotCi0vKiAjZGVmaW5lIERFQlVHICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlICJpdWN2LmgiCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+Ci0KLS8qIEZMQUdTOgotICogQWxsIGZsYWdzIGFyZSBkZWZpbmVkIGluIHRoZSBmaWVsZCBJUEZMQUdTMSBvZiBlYWNoIGZ1bmN0aW9uCi0gKiBhbmQgY2FuIGJlIGZvdW5kIGluIENQIFByb2dyYW1taW5nIFNlcnZpY2VzLgotICogSVBTUkNDTFMgLSBJbmRpY2F0ZXMgeW91IGhhdmUgc3BlY2lmaWVkIGEgc291cmNlIGNsYXNzCi0gKiBJUEZHTUNMICAtIEluZGljYXRlcyB5b3UgaGF2ZSBzcGVjaWZpZWQgYSB0YXJnZXQgY2xhc3MKLSAqIElQRkdQSUQgIC0gSW5kaWNhdGVzIHlvdSBoYXZlIHNwZWNpZmllZCBhIHBhdGhpZAotICogSVBGR01JRCAgLSBJbmRpY2F0ZXMgeW91IGhhdmUgc3BlY2lmaWVkIGEgbWVzc2FnZSBJRAotICogSVBBTlNMU1QgLSBJbmRpY2F0ZXMgdGhhdCB5b3UgYXJlIHVzaW5nIGFuIGFkZHJlc3MgbGlzdCBmb3IKLSAqICAgICAgICAgICAgcmVwbHkgZGF0YQotICogSVBCVUZMU1QgLSBJbmRpY2F0ZXMgdGhhdCB5b3UgYXJlIHVzaW5nIGFuIGFkZHJlc3MgbGlzdCBmb3IKLSAqICAgICAgICAgICAgbWVzc2FnZSBkYXRhCi0gKi8KLQotI2RlZmluZSBJUFNSQ0NMUyAJMHgwMQotI2RlZmluZSBJUEZHTUNMICAgICAgICAgMHgwMQotI2RlZmluZSBJUEZHUElEICAgICAgICAgMHgwMgotI2RlZmluZSBJUEZHTUlEICAgICAgICAgMHgwNAotI2RlZmluZSBJUEFOU0xTVCAgICAgICAgMHgwOAotI2RlZmluZSBJUEJVRkxTVCAgICAgICAgMHg0MAotCi1zdGF0aWMgaW50Ci1pdWN2X2J1c19tYXRjaCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQotewotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgYnVzX3R5cGUgaXVjdl9idXMgPSB7Ci0JLm5hbWUgPSAiaXVjdiIsCi0JLm1hdGNoID0gaXVjdl9idXNfbWF0Y2gsCi19OwotCi1zdHJ1Y3QgZGV2aWNlICppdWN2X3Jvb3Q7Ci0KLS8qIEdlbmVyYWwgSVVDViBpbnRlcnJ1cHQgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JX191MTYgaXBwYXRoaWQ7Ci0JX191OCAgcmVzMTsKLQlfX3U4ICBpcHR5cGU7Ci0JX191MzIgcmVzMjsKLQlfX3U4ICBpcHZtaWRbOF07Ci0JX191OCAgcmVzM1syNF07Ci19IGl1Y3ZfR2VuZXJhbEludGVycnVwdDsKLQotc3RhdGljIGl1Y3ZfR2VuZXJhbEludGVycnVwdCAqaXVjdl9leHRlcm5hbF9pbnRfYnVmZmVyID0gTlVMTDsKLQotLyogU3BpbiBMb2NrIGRlY2xhcmF0aW9uICovCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXVjdl9sb2NrKTsKLQotc3RhdGljIGludCBtZXNzYWdlc0Rpc2FibGVkID0gMDsKLQotLyoqKioqKioqKioqKioqKklOVEVSUlVQVCBIQU5ETElORyAqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOwotCWl1Y3ZfR2VuZXJhbEludGVycnVwdCBkYXRhOwotfSBpdWN2X2lycWRhdGE7Ci0KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICBpdWN2X2lycV9xdWV1ZTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXVjdl9pcnFfcXVldWVfbG9jayk7Ci0KLS8qCi0gKkludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqLwotc3RhdGljIHZvaWQgaXVjdl90YXNrbGV0X2hhbmRsZXIodW5zaWduZWQgbG9uZyk7Ci1zdGF0aWMgdm9pZCBpdWN2X2lycV9oYW5kbGVyKF9fdTE2KTsKLQotc3RhdGljIERFQ0xBUkVfVEFTS0xFVChpdWN2X3Rhc2tsZXQsaXVjdl90YXNrbGV0X2hhbmRsZXIsMCk7Ci0KLS8qKioqKioqKioqKiogRlVOQ1RJT04gSUQnUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEFDQ0VQVCAgICAgICAgICAxMAotI2RlZmluZSBDT05ORUNUICAgICAgICAgMTEKLSNkZWZpbmUgREVDTEFSRV9CVUZGRVIgIDEyCi0jZGVmaW5lIFBVUkdFICAgICAgICAgICA5Ci0jZGVmaW5lIFFVRVJZICAgICAgICAgICAwCi0jZGVmaW5lIFFVSUVTQ0UgICAgICAgICAxMwotI2RlZmluZSBSRUNFSVZFICAgICAgICAgNQotI2RlZmluZSBSRUpFQ1QgICAgICAgICAgOAotI2RlZmluZSBSRVBMWSAgICAgICAgICAgNgotI2RlZmluZSBSRVNVTUUgICAgICAgICAgMTQKLSNkZWZpbmUgUkVUUklFVkVfQlVGRkVSIDIKLSNkZWZpbmUgU0VORCAgICAgICAgICAgIDQKLSNkZWZpbmUgU0VUTUFTSyAgICAgICAgIDE2Ci0jZGVmaW5lIFNFVkVSICAgICAgICAgICAxNQotCi0vKioKLSAqIFN0cnVjdHVyZTogaGFuZGxlcgotICogbWVtYmVyczogbGlzdCAtIGxpc3QgbWFuYWdlbWVudC4KLSAqICAgICAgICAgIHN0cnVjdHVyZTogaWQKLSAqICAgICAgICAgICAgIHVzZXJpZCAtIDggY2hhciBhcnJheSBvZiBtYWNoaW5lIGlkZW50aWZpY2F0aW9uCi0gKiAgICAgICAgICAgICB1c2VyX2RhdGEgLSAxNiBjaGFyIGFycmF5IGZvciB1c2VyIGlkZW50aWZpY2F0aW9uCi0gKiAgICAgICAgICAgICBtYXNrIC0gMjQgY2hhciBhcnJheSB1c2VkIHRvIGNvbXBhcmUgdGhlIDIgcHJldmlvdXMKLSAqICAgICAgICAgIGludGVycnVwdF90YWJsZSAtIHZlY3RvciBvZiBpbnRlcnJ1cHQgZnVuY3Rpb25zLgotICogICAgICAgICAgcGdtX2RhdGEgLSAgdWxvbmcsIGFwcGxpY2F0aW9uIGRhdGEgdGhhdCBpcyBwYXNzZWQKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMKLSovCi10eXBlZGVmIHN0cnVjdCBoYW5kbGVyX3QgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgewotCQlfX3U4IHVzZXJpZFs4XTsKLQkJX191OCB1c2VyX2RhdGFbMTZdOwotCQlfX3U4IG1hc2tbMjRdOwotCX0gICAgICAgICAgICAgICAgICAgIGlkOwotCWl1Y3ZfaW50ZXJydXB0X29wc190ICppbnRlcnJ1cHRfdGFibGU7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgKnBnbV9kYXRhOwotfSBoYW5kbGVyOwotCi0vKioKLSAqIGl1Y3ZfaGFuZGxlcl90YWJsZTogTGlzdCBvZiByZWdpc3RlcmVkIGhhbmRsZXJzLgotICovCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBpdWN2X2hhbmRsZXJfdGFibGU7Ci0KLS8qKgotICogaXVjdl9wYXRoaWRfdGFibGU6IGFuIGFycmF5IG9mICpoYW5kbGVyIHBvaW50aW5nIGludG8KLSAqICAgICAgICAgICAgICAgICAgICBpdWN2X2hhbmRsZXJfdGFibGUgZm9yIGZhc3QgaW5kZXhpbmcgYnkgcGF0aGlkOwotICovCi1zdGF0aWMgaGFuZGxlciAqKml1Y3ZfcGF0aGlkX3RhYmxlOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfY29ubmVjdGlvbnM7Ci0KLS8qKgotICogaXVjdl9jcHVpZDogY29udGFpbnMgdGhlIGxvZ2ljYWwgY3B1IG51bWJlciBvZiB0aGUgY3B1IHdoaWNoCi0gKiBoYXMgZGVjbGFyZWQgdGhlIGl1Y3YgYnVmZmVyIGJ5IGlzc3VpbmcgREVDTEFSRV9CVUZGRVIuCi0gKiBJZiBubyBjcHUgaGFzIGRvbmUgdGhlIGluaXRpYWxpemF0aW9uIGl1Y3ZfY3B1aWQgY29udGFpbnMgLTEuCi0gKi8KLXN0YXRpYyBpbnQgaXVjdl9jcHVpZCA9IC0xOwotLyoqCi0gKiByZWdpc3Rlcl9mbGFnOiBpcyAwIHdoZW4gZXh0ZXJuYWwgaW50ZXJydXB0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkCi0gKi8KLXN0YXRpYyBpbnQgcmVnaXN0ZXJfZmxhZzsKLQotLyoqKioqKioqKioqKioqKipGSVZFIDQwLUJZVEUgUEFSQU1FVEVSIFNUUlVDVFVSRVMqKioqKioqKioqKioqKioqKiovCi0vKiBEYXRhIHN0cnVjdCAxOiBpcGFybWxfY29udHJvbAotICogVXNlZCBmb3IgaXVjdl9hY2NlcHQKLSAqICAgICAgICAgIGl1Y3ZfY29ubmVjdAotICogICAgICAgICAgaXVjdl9xdWllc2NlCi0gKiAgICAgICAgICBpdWN2X3Jlc3VtZQotICogICAgICAgICAgaXVjdl9zZXZlcgotICogICAgICAgICAgaXVjdl9yZXRyaWV2ZV9idWZmZXIKLSAqIERhdGEgc3RydWN0IDI6IGlwYXJtbF9kcGwgICAgIChkYXRhIGluIHBhcmFtZXRlciBsaXN0KQotICogVXNlZCBmb3IgaXVjdl9zZW5kX3BybW1zZwotICogICAgICAgICAgaXVjdl9zZW5kMndheV9wcm1tc2cKLSAqICAgICAgICAgIGl1Y3Zfc2VuZDJ3YXlfcHJtbXNnX2FycmF5Ci0gKiAgICAgICAgICBpdWN2X3JlcGx5X3BybW1zZwotICogRGF0YSBzdHJ1Y3QgMzogaXBhcm1sX2RiICAgICAgIChkYXRhIGluIGEgYnVmZmVyKQotICogVXNlZCBmb3IgaXVjdl9yZWNlaXZlCi0gKiAgICAgICAgICBpdWN2X3JlY2VpdmVfYXJyYXkKLSAqICAgICAgICAgIGl1Y3ZfcmVqZWN0Ci0gKiAgICAgICAgICBpdWN2X3JlcGx5Ci0gKiAgICAgICAgICBpdWN2X3JlcGx5X2FycmF5Ci0gKiAgICAgICAgICBpdWN2X3NlbmQKLSAqICAgICAgICAgIGl1Y3Zfc2VuZF9hcnJheQotICogICAgICAgICAgaXVjdl9zZW5kMndheQotICogICAgICAgICAgaXVjdl9zZW5kMndheV9hcnJheQotICogICAgICAgICAgaXVjdl9kZWNsYXJlX2J1ZmZlcgotICogRGF0YSBzdHJ1Y3QgNDogaXBhcm1sX3B1cmdlCi0gKiBVc2VkIGZvciBpdWN2X3B1cmdlCi0gKiAgICAgICAgICBpdWN2X3F1ZXJ5Ci0gKiBEYXRhIHN0cnVjdCA1OiBpcGFybWxfc2V0X21hc2sKLSAqIFVzZWQgZm9yIGl1Y3Zfc2V0X21hc2sKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JX191MTYgaXBwYXRoaWQ7Ci0JX191OCAgaXBmbGFnczE7Ci0JX191OCAgaXByY29kZTsKLQlfX3UxNiBpcG1zZ2xpbTsKLQlfX3UxNiByZXMxOwotCV9fdTggIGlwdm1pZFs4XTsKLQlfX3U4ICBpcHVzZXJbMTZdOwotCV9fdTggIGlwdGFyZ2V0WzhdOwotfSBpcGFybWxfY29udHJvbDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCV9fdTE2IGlwcGF0aGlkOwotCV9fdTggIGlwZmxhZ3MxOwotCV9fdTggIGlwcmNvZGU7Ci0JX191MzIgaXBtc2dpZDsKLQlfX3UzMiBpcHRyZ2NsczsKLQlfX3U4ICBpcHJtbXNnWzhdOwotCV9fdTMyIGlwc3JjY2xzOwotCV9fdTMyIGlwbXNndGFnOwotCV9fdTMyIGlwYmZhZHIyOwotCV9fdTMyIGlwYmZsbjJmOwotCV9fdTMyIHJlczsKLX0gaXBhcm1sX2RwbDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCV9fdTE2IGlwcGF0aGlkOwotCV9fdTggIGlwZmxhZ3MxOwotCV9fdTggIGlwcmNvZGU7Ci0JX191MzIgaXBtc2dpZDsKLQlfX3UzMiBpcHRyZ2NsczsKLQlfX3UzMiBpcGJmYWRyMTsKLQlfX3UzMiBpcGJmbG4xZjsKLQlfX3UzMiBpcHNyY2NsczsKLQlfX3UzMiBpcG1zZ3RhZzsKLQlfX3UzMiBpcGJmYWRyMjsKLQlfX3UzMiBpcGJmbG4yZjsKLQlfX3UzMiByZXM7Ci19IGlwYXJtbF9kYjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCV9fdTE2IGlwcGF0aGlkOwotCV9fdTggIGlwZmxhZ3MxOwotCV9fdTggIGlwcmNvZGU7Ci0JX191MzIgaXBtc2dpZDsKLQlfX3U4ICBpcGF1ZGl0WzNdOwotCV9fdTggIHJlczFbNV07Ci0JX191MzIgcmVzMjsKLQlfX3UzMiBpcHNyY2NsczsKLQlfX3UzMiBpcG1zZ3RhZzsKLQlfX3UzMiByZXMzWzNdOwotfSBpcGFybWxfcHVyZ2U7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlfX3U4ICBpcG1hc2s7Ci0JX191OCAgcmVzMVsyXTsKLQlfX3U4ICBpcHJjb2RlOwotCV9fdTMyIHJlczJbOV07Ci19IGlwYXJtbF9zZXRfbWFzazsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuaW9uIHsKLQkJaXBhcm1sX2NvbnRyb2wgIHBfY3RybDsKLQkJaXBhcm1sX2RwbCAgICAgIHBfZHBsOwotCQlpcGFybWxfZGIgICAgICAgcF9kYjsKLQkJaXBhcm1sX3B1cmdlICAgIHBfcHVyZ2U7Ci0JCWlwYXJtbF9zZXRfbWFzayBwX3NldF9tYXNrOwotCX0gcGFyYW07Ci0JYXRvbWljX3QgaW5fdXNlOwotCV9fdTMyICAgIHJlczsKLX0gIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSkgaXVjdl9wYXJhbTsKLSNkZWZpbmUgUEFSQU1fUE9PTF9TSVpFIChQQUdFX1NJWkUgLyBzaXplb2YoaXVjdl9wYXJhbSkpCi0KLXN0YXRpYyBpdWN2X3BhcmFtICogaXVjdl9wYXJhbV9wb29sOwotCi1NT0RVTEVfQVVUSE9SKCIoQykgMjAwMSBJQk0gQ29ycC4gYnkgRnJpdHogRWxmZXJ0IChmZWxmZXJ0QG1pbGxlbnV4LmNvbSkiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTGludXggZm9yIFMvMzkwIElVQ1YgbG93bGV2ZWwgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLS8qCi0gKiBEZWJ1Z2dpbmcgc3R1ZmYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBERUJVRwotc3RhdGljIGludCBkZWJ1Z2xldmVsID0gMDsKLQotbW9kdWxlX3BhcmFtKGRlYnVnbGV2ZWwsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnbGV2ZWwsCi0gIlNwZWNpZmllcyB0aGUgZGVidWcgbGV2ZWwgKDA9b2ZmIC4uLiAzPWFsbCkiKTsKLQotc3RhdGljIHZvaWQKLWl1Y3ZfZHVtcGl0KGNoYXIgKnRpdGxlLCB2b2lkICpidWYsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0JX191OCAqcCA9IChfX3U4ICopYnVmOwotCi0JaWYgKGRlYnVnbGV2ZWwgPCAzKQotCQlyZXR1cm47Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHRpdGxlKTsKLQlwcmludGsoIiAgIik7Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmICghKGkgJSAxNikgJiYgaSAhPSAwKQotCQkJcHJpbnRrICgiXG4gICIpOwotCQllbHNlIGlmICghKGkgJSA0KSAmJiBpICE9IDApCi0JCQlwcmludGsoIiAiKTsKLQkJcHJpbnRrKCIlMDJYIiwgKnArKyk7Ci0JfQotCWlmIChsZW4gJSAxNikKLQkJcHJpbnRrICgiXG4iKTsKLQlyZXR1cm47Ci19Ci0jZGVmaW5lIGl1Y3ZfZGVidWcobHZsLCBmbXQsIGFyZ3MuLi4pIFwKLWRvIHsgXAotCWlmIChkZWJ1Z2xldmVsID49IGx2bCkgXAotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpOyBcCi19IHdoaWxlICgwKQotCi0jZWxzZQotCi0jZGVmaW5lIGl1Y3ZfZGVidWcobHZsLCBmbXQsIGFyZ3MuLi4pCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgaXVjdl9kdW1waXQodGl0bGUsIGJ1ZiwgbGVuKQlkbyB7IH0gd2hpbGUgKDApCi0KLSNlbmRpZgotCi0vKgotICogSW50ZXJuYWwgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBwcmludCBzdGFydCBiYW5uZXIKLSAqLwotc3RhdGljIHZvaWQKLWl1Y3ZfYmFubmVyKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiSVVDViBsb3dsZXZlbCBkcml2ZXIgaW5pdGlhbGl6ZWRcbiIpOwotfQotCi0vKioKLSAqIGl1Y3ZfaW5pdCAtIEluaXRpYWxpemF0aW9uCi0gKgotICogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcy4KLSAqLwotc3RhdGljIGludAotaXVjdl9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCWlmIChpdWN2X2V4dGVybmFsX2ludF9idWZmZXIpCi0JCXJldHVybiAwOwotCi0JaWYgKCFNQUNISU5FX0lTX1ZNKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSVVDVjogSVVDViBjb25uZWN0aW9uIG5lZWRzIFZNIGFzIGJhc2VcbiIpOwotCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKLQl9Ci0KLQlyZXQgPSBidXNfcmVnaXN0ZXIoJml1Y3ZfYnVzKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSVVDVjogZmFpbGVkIHRvIHJlZ2lzdGVyIGJ1cy5cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWl1Y3Zfcm9vdCA9IHMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoIml1Y3YiKTsKLQlpZiAoSVNfRVJSKGl1Y3Zfcm9vdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJVUNWOiBmYWlsZWQgdG8gcmVnaXN0ZXIgaXVjdiByb290LlxuIik7Ci0JCWJ1c191bnJlZ2lzdGVyKCZpdWN2X2J1cyk7Ci0JCXJldHVybiBQVFJfRVJSKGl1Y3Zfcm9vdCk7Ci0JfQotCi0JLyogTm90ZTogR0ZQX0RNQSB1c2VkIHVzZWQgdG8gZ2V0IG1lbW9yeSBiZWxvdyAyRyAqLwotCWl1Y3ZfZXh0ZXJuYWxfaW50X2J1ZmZlciA9IGt6YWxsb2Moc2l6ZW9mKGl1Y3ZfR2VuZXJhbEludGVycnVwdCksCi0JCQkJCSAgIEdGUF9LRVJORUx8R0ZQX0RNQSk7Ci0JaWYgKCFpdWN2X2V4dGVybmFsX2ludF9idWZmZXIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgZXh0ZXJuYWwgaW50ZXJydXB0IGJ1ZmZlclxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihpdWN2X3Jvb3QpOwotCQlidXNfdW5yZWdpc3RlcigmaXVjdl9idXMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHBhcmFtZXRlciBwb29sICovCi0JaXVjdl9wYXJhbV9wb29sID0ga3phbGxvYyhzaXplb2YoaXVjdl9wYXJhbSkgKiBQQVJBTV9QT09MX1NJWkUsCi0JCQkJICBHRlBfS0VSTkVMfEdGUF9ETUEpOwotCWlmICghaXVjdl9wYXJhbV9wb29sKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcGFyYW0gcG9vbFxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCWtmcmVlKGl1Y3ZfZXh0ZXJuYWxfaW50X2J1ZmZlcik7Ci0JCWl1Y3ZfZXh0ZXJuYWxfaW50X2J1ZmZlciA9IE5VTEw7Ci0JCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihpdWN2X3Jvb3QpOwotCQlidXNfdW5yZWdpc3RlcigmaXVjdl9idXMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIGlycSBxdWV1ZSAqLwotCUlOSVRfTElTVF9IRUFEKCZpdWN2X2lycV9xdWV1ZSk7Ci0KLQkvKiBJbml0aWFsaXplIGhhbmRsZXIgdGFibGUgKi8KLQlJTklUX0xJU1RfSEVBRCgmaXVjdl9oYW5kbGVyX3RhYmxlKTsKLQotCWl1Y3ZfYmFubmVyKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXVjdl9leGl0IC0gRGUtSW5pdGlhbGl6YXRpb24KLSAqCi0gKiBGcmVlcyBldmVyeXRoaW5nIGFsbG9jYXRlZCBmcm9tIGl1Y3ZfaW5pdC4KLSAqLwotc3RhdGljIGludCBpdWN2X3JldHJpZXZlX2J1ZmZlciAodm9pZCk7Ci0KLXN0YXRpYyB2b2lkCi1pdWN2X2V4aXQodm9pZCkKLXsKLQlpdWN2X3JldHJpZXZlX2J1ZmZlcigpOwotCWtmcmVlKGl1Y3ZfZXh0ZXJuYWxfaW50X2J1ZmZlcik7Ci0JaXVjdl9leHRlcm5hbF9pbnRfYnVmZmVyID0gTlVMTDsKLQlrZnJlZShpdWN2X3BhcmFtX3Bvb2wpOwotCWl1Y3ZfcGFyYW1fcG9vbCA9IE5VTEw7Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7Ci0JYnVzX3VucmVnaXN0ZXIoJml1Y3ZfYnVzKTsKLQlwcmludGsoS0VSTl9JTkZPICJJVUNWIGxvd2xldmVsIGRyaXZlciB1bmxvYWRlZFxuIik7Ci19Ci0KLS8qKgotICogZ3JhYl9wYXJhbTogLSBHZXQgYSBwYXJhbWV0ZXIgYnVmZmVyIGZyb20gdGhlIHByZS1hbGxvY2F0ZWQgcG9vbC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbiB1bnVzZWQgZWxlbWVudCBpbiB0aGUgcHJlLWFsbG9jYXRlZCBwb29sCi0gKiBvZiBwYXJhbWV0ZXIgYnVmZmVycy4gSWYgb25lIGlzIGZvdW5kLCBpdCBtYXJrcyBpdCAiaW4gdXNlIiBhbmQgcmV0dXJucwotICogYSBwb2ludGVyIHRvIGl0LiBUaGUgY2FsbGluZyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0Ci0gKiB3aGVuIGl0IGhhcyBmaW5pc2hlZCBpdHMgdXNhZ2UuCi0gKgotICogUmV0dXJuczogQSBwb2ludGVyIHRvIGl1Y3ZfcGFyYW0uCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIGl1Y3ZfcGFyYW0gKgotZ3JhYl9wYXJhbSh2b2lkKQotewotCWl1Y3ZfcGFyYW0gKnB0cjsKLSAgICAgICAgc3RhdGljIGludCBoaW50ID0gMDsKLQotCXB0ciA9IGl1Y3ZfcGFyYW1fcG9vbCArIGhpbnQ7Ci0JZG8gewotCQlwdHIrKzsKLQkJaWYgKHB0ciA+PSBpdWN2X3BhcmFtX3Bvb2wgKyBQQVJBTV9QT09MX1NJWkUpCi0JCQlwdHIgPSBpdWN2X3BhcmFtX3Bvb2w7Ci0JfSB3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnB0ci0+aW5fdXNlLCAwLCAxKSAhPSAwKTsKLQloaW50ID0gcHRyIC0gaXVjdl9wYXJhbV9wb29sOwotCi0JbWVtc2V0KCZwdHItPnBhcmFtLCAwLCBzaXplb2YocHRyLT5wYXJhbSkpOwotCXJldHVybiBwdHI7Ci19Ci0KLS8qKgotICogcmVsZWFzZV9wYXJhbSAtIFJlbGVhc2UgYSBwYXJhbWV0ZXIgYnVmZmVyLgotICogQHA6IEEgcG9pbnRlciB0byBhIHN0cnVjdCBpdWN2X3BhcmFtLCBwcmV2aW91c2x5IG9idGFpbmVkIGJ5IGNhbGxpbmcKLSAqICAgICBncmFiX3BhcmFtKCkuCi0gKgotICogVGhpcyBmdW5jdGlvbiBtYXJrcyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBidWZmZXIgInVudXNlZCIuCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLXJlbGVhc2VfcGFyYW0odm9pZCAqcCkKLXsKLQlhdG9taWNfc2V0KCYoKGl1Y3ZfcGFyYW0gKilwKS0+aW5fdXNlLCAwKTsKLX0KLQotLyoqCi0gKiBpdWN2X2FkZF9oYW5kbGVyOiAtIEFkZCBhIG5ldyBoYW5kbGVyCi0gKiBAbmV3X2hhbmRsZXI6IGhhbmRsZSB0aGF0IGlzIGJlaW5nIGVudGVyZWQgaW50byBjaGFpbi4KLSAqCi0gKiBQbGFjZXMgbmV3IGhhbmRsZSBvbiBpdWN2X2hhbmRsZXJfdGFibGUsIGlmIGlkZW50aWNhbCBoYW5kbGVyIGlzIG5vdAotICogZm91bmQuCi0gKgotICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAhMCBvbiBmYWlsdXJlIChoYW5kbGVyIGFscmVhZHkgaW4gY2hhaW4pLgotICovCi1zdGF0aWMgaW50Ci1pdWN2X2FkZF9oYW5kbGVyIChoYW5kbGVyICpuZXcpCi17Ci0JdWxvbmcgZmxhZ3M7Ci0KLQlpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotCWl1Y3ZfZHVtcGl0KCJoYW5kbGVyOiIsIG5ldywgc2l6ZW9mKGhhbmRsZXIpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZpdWN2X2hhbmRsZXJfdGFibGUpKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKmxoOwotCi0JCS8qKgotCQkgKiBTZWFyY2ggbGlzdCBmb3IgaGFuZGxlciB3aXRoIGlkZW50aWNhbCBpZC4gSWYgb25lCi0JCSAqIGlzIGZvdW5kLCB0aGUgbmV3IGhhbmRsZXIgaXMgX25vdF8gYWRkZWQuCi0JCSAqLwotCQlsaXN0X2Zvcl9lYWNoKGxoLCAmaXVjdl9oYW5kbGVyX3RhYmxlKSB7Ci0JCQloYW5kbGVyICpoID0gbGlzdF9lbnRyeShsaCwgaGFuZGxlciwgbGlzdCk7Ci0JCQlpZiAoIW1lbWNtcCgmbmV3LT5pZCwgJmgtPmlkLCBzaXplb2YoaC0+aWQpKSkgewotCQkJCWl1Y3ZfZGVidWcoMSwgInJldCAxIik7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIElmIHdlIGdldCBoZXJlLCBubyBoYW5kbGVyIHdhcyBmb3VuZC4KLQkgKi8KLQlJTklUX0xJU1RfSEVBRCgmbmV3LT5saXN0KTsKLQlsaXN0X2FkZCgmbmV3LT5saXN0LCAmaXVjdl9oYW5kbGVyX3RhYmxlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0KLQlpdWN2X2RlYnVnKDEsICJleGl0aW5nIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogYjJmMDoKLSAqIEBjb2RlOiBpZGVudGlmaWVyIG9mIElVQ1YgY2FsbCB0byBDUC4KLSAqIEBwYXJtOiBwb2ludGVyIHRvIDQwIGJ5dGUgaXBhcm1sIGFyZWEgcGFzc2VkIHRvIENQCi0gKgotICogQ2FsbHMgQ1AgdG8gZXhlY3V0ZSBJVUNWIGNvbW1hbmRzLgotICoKLSAqIFJldHVybnM6IHJldHVybiBjb2RlIGZyb20gQ1AncyBJVUNWIGNhbGwKLSAqLwotc3RhdGljIGlubGluZSB1bG9uZyBiMmYwKF9fdTMyIGNvZGUsIHZvaWQgKnBhcm0pCi17Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcwIGFzbSAoIjAiKTsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzEgYXNtICgiMSIpOwotCWl1Y3ZfZHVtcGl0KCJpcGFybWwgYmVmb3JlIGIyZjAgY2FsbDoiLCBwYXJtLCBzaXplb2YoaXVjdl9wYXJhbSkpOwotCi0JcmVnMCA9IGNvZGU7Ci0JcmVnMSA9IHZpcnRfdG9fcGh5cyhwYXJtKTsKLQlhc20gdm9sYXRpbGUoIi5sb25nIDB4YjJmMDEwMDAiIDogOiAiZCIgKHJlZzApLCAiYSIgKHJlZzEpKTsKLQotCWl1Y3ZfZHVtcGl0KCJpcGFybWwgYWZ0ZXIgYjJmMCBjYWxsOiIsIHBhcm0sIHNpemVvZihpdWN2X3BhcmFtKSk7Ci0KLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKigoX191OCAqKShwYXJtICsgMykpOwotfQotCi0vKgotICogTmFtZTogaXVjdl9hZGRfcGF0aGlkCi0gKiBQdXJwb3NlOiBBZGRzIGEgcGF0aCBpZCB0byB0aGUgc3lzdGVtLgotICogSW5wdXQ6IHBhdGhpZCAtICBwYXRoaWQgdGhhdCBpcyBnb2luZyB0byBiZSBlbnRlcmVkIGludG8gc3lzdGVtCi0gKiAgICAgICAgaGFuZGxlIC0gIGFkZHJlc3Mgb2YgaGFuZGxlciB0aGF0IHRoZSBwYXRoaWQgd2lsbCBiZSBhc3NvY2lhdGVkCi0gKgkJICAgd2l0aC4KLSAqICAgICAgICBwZ21fZGF0YSAtIHRva2VuIHBhc3NlZCBpbiBieSBhcHBsaWNhdGlvbi4KLSAqIE91dHB1dDogMDogc3VjY2Vzc2Z1bCBhZGRpdGlvbiBvZiBwYXRoaWQKLSAqCSAgIC0gRUlOVkFMIC0gcGF0aGlkIGVudHJ5IGlzIGJlaW5nIHVzZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbgotICoJICAgLSBFTk9NRU0gLSBzdG9yYWdlIGFsbG9jYXRpb24gZm9yIGEgbmV3IHBhdGhpZCB0YWJsZSBmYWlsZWQKLSovCi1zdGF0aWMgaW50Ci1fX2l1Y3ZfYWRkX3BhdGhpZChfX3UxNiBwYXRoaWQsIGhhbmRsZXIgKmhhbmRsZXIpCi17Ci0KLQlpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotCi0JaXVjdl9kZWJ1ZygxLCAiaGFuZGxlciBpcyBwb2ludGluZyB0byAlcCIsIGhhbmRsZXIpOwotCi0JaWYgKHBhdGhpZCA+IChtYXhfY29ubmVjdGlvbnMgLSAxKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoaXVjdl9wYXRoaWRfdGFibGVbcGF0aGlkXSkgewotCQlpdWN2X2RlYnVnKDEsICJwYXRoaWQgZW50cnkgaXMgJXAiLCBpdWN2X3BhdGhpZF90YWJsZVtwYXRoaWRdKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIiVzOiBQYXRoaWQgYmVpbmcgdXNlZCwgZXJyb3IuXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaXVjdl9wYXRoaWRfdGFibGVbcGF0aGlkXSA9IGhhbmRsZXI7Ci0KLQlpdWN2X2RlYnVnKDEsICJleGl0aW5nIik7Ci0JcmV0dXJuIDA7Ci19CQkJCS8qIGVuZCBvZiBhZGRfcGF0aGlkIGZ1bmN0aW9uICovCi0KLXN0YXRpYyBpbnQKLWl1Y3ZfYWRkX3BhdGhpZChfX3UxNiBwYXRoaWQsIGhhbmRsZXIgKmhhbmRsZXIpCi17Ci0JdWxvbmcgZmxhZ3M7Ci0JaW50IHJjOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQlyYyA9IF9faXVjdl9hZGRfcGF0aGlkKHBhdGhpZCwgaGFuZGxlcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQKLWl1Y3ZfcmVtb3ZlX3BhdGhpZChfX3UxNiBwYXRoaWQpCi17Ci0JdWxvbmcgZmxhZ3M7Ci0KLQlpZiAocGF0aGlkID4gKG1heF9jb25uZWN0aW9ucyAtIDEpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCWl1Y3ZfcGF0aGlkX3RhYmxlW3BhdGhpZF0gPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLX0KLQotLyoqCi0gKiBpdWN2X2RlY2xhcmVfYnVmZmVyX2NwdWlkCi0gKiBSZWdpc3RlciBhdCBWTSBmb3Igc3Vic2VxdWVudCBJVUNWIG9wZXJhdGlvbnMuIFRoaXMgaXMgZXhlY3V0ZWQKLSAqIG9uIHRoZSByZXNlcnZlZCBDUFUgaXVjdl9jcHVpZC4gQ2FsbGVkIGZyb20gaXVjdl9kZWNsYXJlX2J1ZmZlcigpLgotICovCi1zdGF0aWMgdm9pZAotaXVjdl9kZWNsYXJlX2J1ZmZlcl9jcHVpZCAodm9pZCAqcmVzdWx0KQotewotCWlwYXJtbF9kYiAqcGFybTsKLQotCXBhcm0gPSAoaXBhcm1sX2RiICopZ3JhYl9wYXJhbSgpOwotCXBhcm0tPmlwYmZhZHIxID0gdmlydF90b19waHlzKGl1Y3ZfZXh0ZXJuYWxfaW50X2J1ZmZlcik7Ci0JaWYgKCgqKCh1bG9uZyAqKXJlc3VsdCkgPSBiMmYwKERFQ0xBUkVfQlVGRkVSLCBwYXJtKSkgPT0gMSkKLQkJKigodWxvbmcgKilyZXN1bHQpID0gcGFybS0+aXByY29kZTsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotfQotCi0vKioKLSAqIGl1Y3ZfcmV0cmlldmVfYnVmZmVyX2NwdWlkOgotICogVW5yZWdpc3RlciBJVUNWIHVzYWdlIGF0IFZNLiBUaGlzIGlzIGFsd2F5cyBleGVjdXRlZCBvbiB0aGUgc2FtZQotICogY3B1IHRoYXQgcmVnaXN0ZXJlZCB0aGUgYnVmZmVyIHRvIFZNLgotICogQ2FsbGVkIGZyb20gaXVjdl9yZXRyaWV2ZV9idWZmZXIoKS4KLSAqLwotc3RhdGljIHZvaWQKLWl1Y3ZfcmV0cmlldmVfYnVmZmVyX2NwdWlkICh2b2lkICpjcHUpCi17Ci0JaXBhcm1sX2NvbnRyb2wgKnBhcm07Ci0KLQlwYXJtID0gKGlwYXJtbF9jb250cm9sICopZ3JhYl9wYXJhbSgpOwotCWIyZjAoUkVUUklFVkVfQlVGRkVSLCBwYXJtKTsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotfQotCi0vKioKLSAqIE5hbWU6IGl1Y3ZfZGVjbGFyZV9idWZmZXIKLSAqIFB1cnBvc2U6IFNwZWNpZmllcyB0aGUgZ3Vlc3RzIHJlYWwgYWRkcmVzcyBvZiBhbiBleHRlcm5hbAotICogICAgICAgICAgaW50ZXJydXB0LgotICogSW5wdXQ6IHZvaWQKLSAqIE91dHB1dDogaXByY29kZSAtIHJldHVybiBjb2RlIGZyb20gYjJmMCBjYWxsCi0gKi8KLXN0YXRpYyBpbnQKLWl1Y3ZfZGVjbGFyZV9idWZmZXIgKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bG9uZyBiMmYwX3Jlc3VsdDsKLQotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0JYjJmMF9yZXN1bHQgPSAtRU5PREVWOwotCXNwaW5fbG9ja19pcnFzYXZlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JaWYgKGl1Y3ZfY3B1aWQgPT0gLTEpIHsKLQkJLyogUmVzZXJ2ZSBhbnkgY3B1IGZvciB1c2UgYnkgaXVjdi4gKi8KLQkJaXVjdl9jcHVpZCA9IHNtcF9nZXRfY3B1KENQVV9NQVNLX0FMTCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQkJc21wX2NhbGxfZnVuY3Rpb25fb24oaXVjdl9kZWNsYXJlX2J1ZmZlcl9jcHVpZCwKLQkJCSZiMmYwX3Jlc3VsdCwgMCwgMSwgaXVjdl9jcHVpZCk7Ci0JCWlmIChiMmYwX3Jlc3VsdCkgewotCQkJc21wX3B1dF9jcHUoaXVjdl9jcHVpZCk7Ci0JCQlpdWN2X2NwdWlkID0gLTE7Ci0JCX0KLQkJaXVjdl9kZWJ1ZygxLCAiQWRkcmVzcyBvZiBFSUIgPSAlcCIsIGl1Y3ZfZXh0ZXJuYWxfaW50X2J1ZmZlcik7Ci0JfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCQliMmYwX3Jlc3VsdCA9IDA7Ci0JfQotCWl1Y3ZfZGVidWcoMSwgImV4aXRpbmciKTsKLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qKgotICogaXVjdl9yZXRyaWV2ZV9idWZmZXI6Ci0gKgotICogVGVybWluYXRlcyBhbGwgdXNlIG9mIElVQ1YuCi0gKiBSZXR1cm5zOiByZXR1cm4gY29kZSBmcm9tIENQCi0gKi8KLXN0YXRpYyBpbnQKLWl1Y3ZfcmV0cmlldmVfYnVmZmVyICh2b2lkKQotewotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0JaWYgKGl1Y3ZfY3B1aWQgIT0gLTEpIHsKLQkJc21wX2NhbGxfZnVuY3Rpb25fb24oaXVjdl9yZXRyaWV2ZV9idWZmZXJfY3B1aWQsCi0JCQkJICAgICBOVUxMLCAwLCAxLCBpdWN2X2NwdWlkKTsKLQkJLyogUmVsZWFzZSB0aGUgY3B1IHJlc2VydmVkIGJ5IGl1Y3ZfZGVjbGFyZV9idWZmZXIuICovCi0JCXNtcF9wdXRfY3B1KGl1Y3ZfY3B1aWQpOwotCQlpdWN2X2NwdWlkID0gLTE7Ci0JfQotCWl1Y3ZfZGVidWcoMSwgImV4aXRpbmciKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpdWN2X3JlbW92ZV9oYW5kbGVyOgotICogQHVzZXJzX2hhbmRsZXI6IGhhbmRsZXIgdG8gYmUgcmVtb3ZlZAotICoKLSAqIFJlbW92ZSBoYW5kbGVyIHdoZW4gYXBwbGljYXRpb24gdW5yZWdpc3RlcnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1pdWN2X3JlbW92ZV9oYW5kbGVyKGhhbmRsZXIgKmhhbmRsZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgoIWl1Y3ZfcGF0aGlkX3RhYmxlKSB8fCAoIWhhbmRsZXIpKQotCQlyZXR1cm47Ci0KLQlpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2RlbCgmaGFuZGxlci0+bGlzdCk7Ci0JaWYgKGxpc3RfZW1wdHkoJml1Y3ZfaGFuZGxlcl90YWJsZSkpIHsKLQkJaWYgKHJlZ2lzdGVyX2ZsYWcpIHsKLQkJCXVucmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4NDAwMCwgaXVjdl9pcnFfaGFuZGxlcik7Ci0JCQlyZWdpc3Rlcl9mbGFnID0gMDsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0KLQlpdWN2X2RlYnVnKDEsICJleGl0aW5nIik7Ci0JcmV0dXJuOwotfQotCi0vKioKLSAqIGl1Y3ZfcmVnaXN0ZXJfcHJvZ3JhbToKLSAqIEBwZ21uYW1lOiAgdXNlciBpZGVudGlmaWNhdGlvbgotICogQHVzZXJpZDogICBtYWNoaW5lIGlkZW50aWZpY2F0aW9uCi0gKiBAcGdtbWFzazogIEluZGljYXRlcyB3aGljaCBiaXRzIGluIHRoZSBwZ21uYW1lIGFuZCB1c2VyaWQgY29tYmluZWQgd2lsbCBiZQotICogICAgICAgICAgICB1c2VkIHRvIGRldGVybWluZSB3aG8gaXMgZ2l2ZW4gY29udHJvbC4KLSAqIEBvcHM6ICAgICAgQWRkcmVzcyBvZiBpbnRlcnJ1cHQgaGFuZGxlciB0YWJsZS4KLSAqIEBwZ21fZGF0YTogQXBwbGljYXRpb24gZGF0YSB0byBiZSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzLgotICoKLSAqIFJlZ2lzdGVycyBhbiBhcHBsaWNhdGlvbiB3aXRoIElVQ1YuCi0gKiBSZXR1cm5zOgotICogICAgICAgICAgIFRoZSBhZGRyZXNzIG9mIGhhbmRsZXIsIG9yIE5VTEwgb24gZmFpbHVyZS4KLSAqIE5PVEUgb24gcGdtbWFzazoKLSAqICAgSWYgcGdtbmFtZSwgdXNlcmlkIGFuZCBwZ21tYXNrIGFyZSBwcm92aWRlZCwgcGdtbWFzayBpcyBlbnRlcmVkIGludG8gdGhlCi0gKiAgIGhhbmRsZXIgYXMgaXMuCi0gKiAgIElmIHBnbW1hc2sgaXMgTlVMTCwgdGhlIGludGVybmFsIG1hc2sgaXMgc2V0IHRvIGFsbCAweGZmJ3MKLSAqICAgV2hlbiB1c2VyaWQgaXMgTlVMTCwgdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIGludGVybmFsIG1hc2sgYXJlIGZvcmNlZAotICogICB0byAweDAwLgotICogICBJZiBwZ21tYXNrIGFuZCB1c2VyaWQgYXJlIE5VTEwsIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBpbnRlcm5hbCBtYXNrCi0gKiAgIGFyZSBmb3JjZWQgdG8gMHgwMCBhbmQgdGhlIGxhc3QgMTYgYnl0ZXMgdG8gMHhmZi4KLSAqLwotCi1pdWN2X2hhbmRsZV90Ci1pdWN2X3JlZ2lzdGVyX3Byb2dyYW0gKF9fdTggcGdtbmFtZVsxNl0sCi0JCSAgICAgICBfX3U4IHVzZXJpZFs4XSwKLQkJICAgICAgIF9fdTggcGdtbWFza1syNF0sCi0JCSAgICAgICBpdWN2X2ludGVycnVwdF9vcHNfdCAqIG9wcywgdm9pZCAqcGdtX2RhdGEpCi17Ci0JdWxvbmcgcmMgPSAwOwkJLyogcmV0dXJuIGNvZGUgZnJvbSBmdW5jdGlvbiBjYWxscyAqLwotCWhhbmRsZXIgKm5ld19oYW5kbGVyOwotCi0JaXVjdl9kZWJ1ZygxLCAiZW50ZXJpbmciKTsKLQotCWlmIChvcHMgPT0gTlVMTCkgewotCQkvKiBpbnRlcnJ1cHQgdGFibGUgaXMgbm90IGRlZmluZWQgKi8KLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludGVycnVwdCB0YWJsZSBpcyBub3QgZGVmaW5lZCwgIgotCQkgICAgICAgImV4aXRpbmdcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIXBnbW5hbWUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHBnbW5hbWUgbm90IHByb3ZpZGVkXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBoYW5kbGVyIGVudHJ5ICovCi0JbmV3X2hhbmRsZXIgPSBrbWFsbG9jKHNpemVvZihoYW5kbGVyKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKG5ld19oYW5kbGVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHN0b3JhZ2UgYWxsb2NhdGlvbiBmb3IgbmV3IGhhbmRsZXIgIgotCQkgICAgICAgImZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmICghaXVjdl9wYXRoaWRfdGFibGUpIHsKLQkJaWYgKGl1Y3ZfaW5pdCgpKSB7Ci0JCQlrZnJlZShuZXdfaGFuZGxlcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCW1heF9jb25uZWN0aW9ucyA9IGl1Y3ZfcXVlcnlfbWF4Y29ubigpOwotCQlpdWN2X3BhdGhpZF90YWJsZSA9IGtjYWxsb2MobWF4X2Nvbm5lY3Rpb25zLCBzaXplb2YoaGFuZGxlciAqKSwKLQkJCQkJR0ZQX0FUT01JQyk7Ci0JCWlmIChpdWN2X3BhdGhpZF90YWJsZSA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaXVjdl9wYXRoaWRfdGFibGUgc3RvcmFnZSAiCi0JCQkgICAgICAgImFsbG9jYXRpb24gZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJa2ZyZWUobmV3X2hhbmRsZXIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JbWVtc2V0KG5ld19oYW5kbGVyLCAwLCBzaXplb2YgKGhhbmRsZXIpKTsKLQltZW1jcHkobmV3X2hhbmRsZXItPmlkLnVzZXJfZGF0YSwgcGdtbmFtZSwKLQkJc2l6ZW9mIChuZXdfaGFuZGxlci0+aWQudXNlcl9kYXRhKSk7Ci0JaWYgKHVzZXJpZCkgewotCQltZW1jcHkgKG5ld19oYW5kbGVyLT5pZC51c2VyaWQsIHVzZXJpZCwKLQkJCXNpemVvZiAobmV3X2hhbmRsZXItPmlkLnVzZXJpZCkpOwotCQlBU0NFQkMgKG5ld19oYW5kbGVyLT5pZC51c2VyaWQsCi0JCQlzaXplb2YgKG5ld19oYW5kbGVyLT5pZC51c2VyaWQpKTsKLQkJRUJDX1RPVVBQRVIgKG5ld19oYW5kbGVyLT5pZC51c2VyaWQsCi0JCQkgICAgIHNpemVvZiAobmV3X2hhbmRsZXItPmlkLnVzZXJpZCkpOwotCi0JCWlmIChwZ21tYXNrKSB7Ci0JCQltZW1jcHkgKG5ld19oYW5kbGVyLT5pZC5tYXNrLCBwZ21tYXNrLAotCQkJCXNpemVvZiAobmV3X2hhbmRsZXItPmlkLm1hc2spKTsKLQkJfSBlbHNlIHsKLQkJCW1lbXNldCAobmV3X2hhbmRsZXItPmlkLm1hc2ssIDB4RkYsCi0JCQkJc2l6ZW9mIChuZXdfaGFuZGxlci0+aWQubWFzaykpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBnbW1hc2spIHsKLQkJCW1lbWNweSAobmV3X2hhbmRsZXItPmlkLm1hc2ssIHBnbW1hc2ssCi0JCQkJc2l6ZW9mIChuZXdfaGFuZGxlci0+aWQubWFzaykpOwotCQl9IGVsc2UgewotCQkJbWVtc2V0IChuZXdfaGFuZGxlci0+aWQubWFzaywgMHhGRiwKLQkJCQlzaXplb2YgKG5ld19oYW5kbGVyLT5pZC5tYXNrKSk7Ci0JCX0KLQkJbWVtc2V0IChuZXdfaGFuZGxlci0+aWQudXNlcmlkLCAweDAwLAotCQkJc2l6ZW9mIChuZXdfaGFuZGxlci0+aWQudXNlcmlkKSk7Ci0JfQotCS8qIGZpbGwgaW4gdGhlIHJlc3Qgb2YgaGFuZGxlciAqLwotCW5ld19oYW5kbGVyLT5wZ21fZGF0YSA9IHBnbV9kYXRhOwotCW5ld19oYW5kbGVyLT5pbnRlcnJ1cHRfdGFibGUgPSBvcHM7Ci0KLQkvKgotCSAqIENoZWNrIGlmIHNvbWVvbmUgZWxzZSBpcyByZWdpc3RlcmVkIHdpdGggc2FtZSBwZ21uYW1lLCB1c2VyaWQKLQkgKiBhbmQgbWFzay4gSWYgc29tZW9uZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBzYW1lIHBnbW5hbWUsCi0JICogdXNlcmlkIGFuZCBtYXNrLCByZWdpc3RyYXRpb24gd2lsbCBmYWlsIGFuZCBOVUxMIHdpbGwgYmUgcmV0dXJuZWQKLQkgKiB0byB0aGUgYXBwbGljYXRpb24uCi0JICogSWYgaWRlbnRpY2FsIGhhbmRsZXIgbm90IGZvdW5kLCB0aGVuIGhhbmRsZXIgaXMgYWRkZWQgdG8gbGlzdC4KLQkgKi8KLQlyYyA9IGl1Y3ZfYWRkX2hhbmRsZXIobmV3X2hhbmRsZXIpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU29tZW9uZSBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBzYW1lICIKLQkJICAgICAgICJwZ21uYW1lLCB1c2VyaWQsIHBnbW1hc2tcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWtmcmVlIChuZXdfaGFuZGxlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJjID0gaXVjdl9kZWNsYXJlX2J1ZmZlcigpOwotCWlmIChyYykgewotCQljaGFyICplcnIgPSAiVW5rbm93biI7Ci0JCWl1Y3ZfcmVtb3ZlX2hhbmRsZXIobmV3X2hhbmRsZXIpOwotCQlrZnJlZShuZXdfaGFuZGxlcik7Ci0JCXN3aXRjaChyYykgewotCQljYXNlIDB4MDM6Ci0JCQllcnIgPSAiRGlyZWN0b3J5IGVycm9yIjsKLQkJCWJyZWFrOwotCQljYXNlIDB4MGE6Ci0JCQllcnIgPSAiSW52YWxpZCBsZW5ndGgiOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgxMzoKLQkJCWVyciA9ICJCdWZmZXIgYWxyZWFkeSBleGlzdHMiOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgzZToKLQkJCWVyciA9ICJCdWZmZXIgb3ZlcmxhcCI7Ci0JCQlicmVhazsKLQkJY2FzZSAweDVjOgotCQkJZXJyID0gIlBhZ2luZyBvciBzdG9yYWdlIGVycm9yIjsKLQkJCWJyZWFrOwotCQl9Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpdWN2X2RlY2xhcmVfYnVmZmVyICIKLQkJICAgICAgICJyZXR1cm5lZCBlcnJvciAweCUwMmx4ICglcylcbiIsIF9fRlVOQ1RJT05fXywgcmMsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIXJlZ2lzdGVyX2ZsYWcpIHsKLQkJLyogcmVxdWVzdCB0aGUgMHg0MDAwIGV4dGVybmFsIGludGVycnVwdCAqLwotCQlyYyA9IHJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCAoMHg0MDAwLCBpdWN2X2lycV9oYW5kbGVyKTsKLQkJaWYgKHJjKSB7Ci0JCQlpdWN2X3JlbW92ZV9oYW5kbGVyKG5ld19oYW5kbGVyKTsKLQkJCWtmcmVlIChuZXdfaGFuZGxlcik7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogIgotCQkJICAgICAgICJyZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQgcmV0dXJuZWQgJWxkXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgcmMpOwotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJfQotCQlyZWdpc3Rlcl9mbGFnID0gMTsKLQl9Ci0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCXJldHVybiBuZXdfaGFuZGxlcjsKLX0JCQkJLyogZW5kIG9mIHJlZ2lzdGVyIGZ1bmN0aW9uICovCi0KLS8qKgotICogaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW06Ci0gKiBAaGFuZGxlOiBhZGRyZXNzIG9mIGhhbmRsZXIKLSAqCi0gKiBVbnJlZ2lzdGVyIGFwcGxpY2F0aW9uIHdpdGggSVVDVi4KLSAqIFJldHVybnM6Ci0gKiAgIDAgb24gc3VjY2VzcywgLUVJTlZBTCwgaWYgc3BlY2lmaWVkIGhhbmRsZSBpcyBpbnZhbGlkLgotICovCi0KLWludAotaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0gKGl1Y3ZfaGFuZGxlX3QgaGFuZGxlKQotewotCWhhbmRsZXIgKmggPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxoOwotCWludCBpOwotCXVsb25nIGZsYWdzOwotCi0JaXVjdl9kZWJ1ZygxLCAiZW50ZXJpbmciKTsKLQlpdWN2X2RlYnVnKDEsICJhZGRyZXNzIG9mIGhhbmRsZXIgaXMgJXAiLCBoKTsKLQotCS8qIENoZWNraW5nIGlmIGhhbmRsZSBpcyB2YWxpZCAgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2gobGgsICZpdWN2X2hhbmRsZXJfdGFibGUpIHsKLQkJaWYgKChoYW5kbGVyICopaGFuZGxlID09IGxpc3RfZW50cnkobGgsIGhhbmRsZXIsIGxpc3QpKSB7Ci0JCQloID0gKGhhbmRsZXIgKiloYW5kbGU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIWgpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCQlpZiAoaGFuZGxlKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogSGFuZGxlciBub3QgZm91bmQgaW4gaXVjdl9oYW5kbGVyX3RhYmxlLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIiVzOiBOVUxMIGhhbmRsZSBwYXNzZWQgYnkgYXBwbGljYXRpb24uXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qKgotCSAqIEZpcnN0LCB3YWxrIHRocnUgaXVjdl9wYXRoaWRfdGFibGUgYW5kIHNldmVyIGFueSBwYXRoaWQgd2hpY2ggaXMKLQkgKiBzdGlsbCBwb2ludGluZyB0byB0aGUgaGFuZGxlciB0byBiZSByZW1vdmVkLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBtYXhfY29ubmVjdGlvbnM7IGkrKykKLQkJaWYgKGl1Y3ZfcGF0aGlkX3RhYmxlW2ldID09IGgpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQkJCWl1Y3Zfc2V2ZXIoaSwgaC0+aWQudXNlcl9kYXRhKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQkJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQotCWl1Y3ZfcmVtb3ZlX2hhbmRsZXIoaCk7Ci0Ja2ZyZWUoaCk7Ci0KLQlpdWN2X2RlYnVnKDEsICJleGl0aW5nIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXVjdl9hY2NlcHQ6Ci0gKiBAcGF0aGlkOiAgICAgICAgICAgICBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlcgotICogQG1zZ2xpbV9yZXFzdGQ6ICAgICAgVGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBtZXNzYWdlcyByZXF1ZXN0ZWQuCi0gKiBAdXNlcl9kYXRhOiAgICAgICAgICBEYXRhIHNwZWNpZmllZCBieSB0aGUgaXVjdl9jb25uZWN0IGZ1bmN0aW9uLgotICogQGZsYWdzMTogICAgICAgICAgICAgQ29udGFpbnMgb3B0aW9ucyBmb3IgdGhpcyBwYXRoLgotICogICAgIC0gSVBQUlRZICgweDIwKSAgIFNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgLSBJUFJNREFUQSAoMHg4MCkgU3BlY2lmaWVzIHdoZXRoZXIgeW91ciBwcm9ncmFtIGNhbiBoYW5kbGUgYSBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHBhcmFtZXRlciBsaXN0LgotICogICAgIC0gSVBRVVNDRSAoMHg0MCkgIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvIHF1aWVzY2UgdGhlIHBhdGggYmVpbmcKLSAqCQkgICAgICAgICBlc3RhYmxpc2hlZC4KLSAqIEBoYW5kbGU6ICAgICAgICAgICAgIEFkZHJlc3Mgb2YgaGFuZGxlci4KLSAqIEBwZ21fZGF0YTogICAgICAgICAgIEFwcGxpY2F0aW9uIGRhdGEgcGFzc2VkIHRvIGludGVycnVwdCBoYW5kbGVycy4KLSAqIEBmbGFnczFfb3V0OiAgICAgICAgIFBvaW50ZXIgdG8gYW4gaW50LiBJZiBub3QgTlVMTCwgb24gcmV0dXJuIHRoZSBvcHRpb25zIGZvcgotICogICAgICAgICAgICAgICAgICAgICAgdGhlIHBhdGggYXJlIHN0b3JlZCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb246Ci0gKiAgICAgLSBJUFBSVFkgKDB4MjApICBJbmRpY2F0ZXMgeW91IG1heSBzZW5kIGEgcHJpb3JpdHkgbWVzc2FnZS4KLSAqIEBtc2dsaW06ICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gX191MTYuIElmIG5vdCBOVUxMLCBvbiByZXR1cm4gdGhlIG1heGltdW0KLSAqICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBvdXRzdGFuZGluZyBtZXNzYWdlcyBpcyBzdG9yZWQgYXQgdGhlIGdpdmVuCi0gKiAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGlzc3VlZCBhZnRlciB0aGUgdXNlciByZWNlaXZlcyBhIENvbm5lY3Rpb24gUGVuZGluZyBleHRlcm5hbAotICogaW50ZXJydXB0IGFuZCBub3cgd2lzaGVzIHRvIGNvbXBsZXRlIHRoZSBJVUNWIGNvbW11bmljYXRpb24gcGF0aC4KLSAqIFJldHVybnM6Ci0gKiAgIHJldHVybiBjb2RlIGZyb20gQ1AKLSAqLwotaW50Ci1pdWN2X2FjY2VwdChfX3UxNiBwYXRoaWQsIF9fdTE2IG1zZ2xpbV9yZXFzdGQsCi0JICAgICBfX3U4IHVzZXJfZGF0YVsxNl0sIGludCBmbGFnczEsCi0JICAgICBpdWN2X2hhbmRsZV90IGhhbmRsZSwgdm9pZCAqcGdtX2RhdGEsCi0JICAgICBpbnQgKmZsYWdzMV9vdXQsIF9fdTE2ICogbXNnbGltKQotewotCXVsb25nIGIyZjBfcmVzdWx0ID0gMDsKLQl1bG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKLQloYW5kbGVyICpoID0gTlVMTDsKLQlpcGFybWxfY29udHJvbCAqcGFybTsKLQotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0JaXVjdl9kZWJ1ZygxLCAicGF0aGlkID0gJWQiLCBwYXRoaWQpOwotCi0JLyogQ2hlY2tpbmcgaWYgaGFuZGxlIGlzIHZhbGlkICAqLwotCXNwaW5fbG9ja19pcnFzYXZlICgmaXVjdl9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaChsaCwgJml1Y3ZfaGFuZGxlcl90YWJsZSkgewotCQlpZiAoKGhhbmRsZXIgKiloYW5kbGUgPT0gbGlzdF9lbnRyeShsaCwgaGFuZGxlciwgbGlzdCkpIHsKLQkJCWggPSAoaGFuZGxlciAqKWhhbmRsZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQotCWlmICghaCkgewotCQlpZiAoaGFuZGxlKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogSGFuZGxlciBub3QgZm91bmQgaW4gaXVjdl9oYW5kbGVyX3RhYmxlLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIiVzOiBOVUxMIGhhbmRsZSBwYXNzZWQgYnkgYXBwbGljYXRpb24uXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXBhcm0gPSAoaXBhcm1sX2NvbnRyb2wgKilncmFiX3BhcmFtKCk7Ci0KLQlwYXJtLT5pcHBhdGhpZCA9IHBhdGhpZDsKLQlwYXJtLT5pcG1zZ2xpbSA9IG1zZ2xpbV9yZXFzdGQ7Ci0JaWYgKHVzZXJfZGF0YSkKLQkJbWVtY3B5KHBhcm0tPmlwdXNlciwgdXNlcl9kYXRhLCBzaXplb2YocGFybS0+aXB1c2VyKSk7Ci0KLQlwYXJtLT5pcGZsYWdzMSA9IChfX3U4KWZsYWdzMTsKLQliMmYwX3Jlc3VsdCA9IGIyZjAoQUNDRVBULCBwYXJtKTsKLQotCWlmICghYjJmMF9yZXN1bHQpIHsKLQkJaWYgKG1zZ2xpbSkKLQkJCSptc2dsaW0gPSBwYXJtLT5pcG1zZ2xpbTsKLQkJaWYgKHBnbV9kYXRhKQotCQkJaC0+cGdtX2RhdGEgPSBwZ21fZGF0YTsKLQkJaWYgKGZsYWdzMV9vdXQpCi0JCQkqZmxhZ3MxX291dCA9IChwYXJtLT5pcGZsYWdzMSAmIElQUFJUWSkgPyBJUFBSVFkgOiAwOwotCX0KLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoqCi0gKiBpdWN2X2Nvbm5lY3Q6Ci0gKiBAcGF0aGlkOiAgICAgICAgUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqIEBtc2dsaW1fcmVxc3RkOiBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgbWVzc2FnZXMgcmVxdWVzdGVkCi0gKiBAdXNlcl9kYXRhOiAgICAgMTYtYnl0ZSB1c2VyIGRhdGEKLSAqIEB1c2VyaWQ6ICAgICAgICA4LWJ5dGUgb2YgdXNlciBpZGVudGlmaWNhdGlvbgotICogQHN5c3RlbV9uYW1lOiAgIDgtYnl0ZSBpZGVudGlmeWluZyB0aGUgc3lzdGVtIG5hbWUKLSAqIEBmbGFnczE6ICAgICAgICBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgdGhpcyBwYXRoOgotICogICAgIC0gSVBQUlRZICgweDIwKSAgIFNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgLSBJUFJNREFUQSAoMHg4MCkgU3BlY2lmaWVzIHdoZXRoZXIgeW91ciBwcm9ncmFtIGNhbiBoYW5kbGUgYSBtZXNzYWdlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgaW4gIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLSAqICAgICAtIElQUVVTQ0UgKDB4NDApICBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0byBxdWllc2NlIHRoZSBwYXRoIGJlaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgZXN0YWJsaXNoZWQuCi0gKiAgICAgLSBJUExPQ0FMICgweDAxKSAgQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGZvcmNlIHRoZSBwYXJ0bmVyIHRvIGJlIG9uIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgIGxvY2FsIHN5c3RlbS4gSWYgbG9jYWwgaXMgc3BlY2lmaWVkIHRoZW4gdGFyZ2V0IGNsYXNzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgY2Fubm90IGJlIHNwZWNpZmllZC4KLSAqIEBmbGFnczFfb3V0OiAgICBQb2ludGVyIHRvIGFuIGludC4gSWYgbm90IE5VTEwsIG9uIHJldHVybiB0aGUgb3B0aW9ucyBmb3IKLSAqICAgICAgICAgICAgICAgICB0aGUgcGF0aCBhcmUgc3RvcmVkIGF0IHRoZSBnaXZlbiBsb2NhdGlvbjoKLSAqICAgICAtIElQUFJUWSAoMHgyMCkgICBJbmRpY2F0ZXMgeW91IG1heSBzZW5kIGEgcHJpb3JpdHkgbWVzc2FnZS4KLSAqIEBtc2dsaW06ICAgICAgICBQb2ludGVyIHRvIGFuIF9fdTE2LiBJZiBub3QgTlVMTCwgb24gcmV0dXJuIHRoZSBtYXhpbXVtCi0gKiAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIG91dHN0YW5kaW5nIG1lc3NhZ2VzIGlzIHN0b3JlZCBhdCB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICBsb2NhdGlvbi4KLSAqIEBoYW5kbGU6ICAgICAgICBBZGRyZXNzIG9mIGhhbmRsZXIuCi0gKiBAcGdtX2RhdGE6ICAgICAgQXBwbGljYXRpb24gZGF0YSB0byBiZSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZXN0YWJsaXNoZXMgYW4gSVVDViBwYXRoLiBBbHRob3VnaCB0aGUgY29ubmVjdCBtYXkgY29tcGxldGUKLSAqIHN1Y2Nlc3NmdWxseSwgeW91IGFyZSBub3QgYWJsZSB0byB1c2UgdGhlIHBhdGggdW50aWwgeW91IHJlY2VpdmUgYW4gSVVDVgotICogQ29ubmVjdGlvbiBDb21wbGV0ZSBleHRlcm5hbCBpbnRlcnJ1cHQuCi0gKiBSZXR1cm5zOiByZXR1cm4gY29kZSBmcm9tIENQLCBvciBvbmUgb2YgdGhlIGZvbGxvd2luZwotICogICAgIC0gRU5PTUVNCi0gKiAgICAgLSByZXR1cm4gY29kZSBmcm9tIGl1Y3ZfZGVjbGFyZV9idWZmZXIKLSAqICAgICAtIEVJTlZBTCAtIGludmFsaWQgaGFuZGxlIHBhc3NlZCBieSBhcHBsaWNhdGlvbgotICogICAgIC0gRUlOVkFMIC0gcGF0aGlkIGFkZHJlc3MgaXMgTlVMTAotICogICAgIC0gRU5PTUVNIC0gcGF0aGlkIHRhYmxlIHN0b3JhZ2UgYWxsb2NhdGlvbiBmYWlsZWQKLSAqICAgICAtIHJldHVybiBjb2RlIGZyb20gaW50ZXJuYWwgZnVuY3Rpb24gYWRkX3BhdGhpZAotICovCi1pbnQKLWl1Y3ZfY29ubmVjdCAoX191MTYgKnBhdGhpZCwgX191MTYgbXNnbGltX3JlcXN0ZCwKLQkgICAgICBfX3U4IHVzZXJfZGF0YVsxNl0sIF9fdTggdXNlcmlkWzhdLAotCSAgICAgIF9fdTggc3lzdGVtX25hbWVbOF0sIGludCBmbGFnczEsCi0JICAgICAgaW50ICpmbGFnczFfb3V0LCBfX3UxNiAqIG1zZ2xpbSwKLQkgICAgICBpdWN2X2hhbmRsZV90IGhhbmRsZSwgdm9pZCAqcGdtX2RhdGEpCi17Ci0JaXBhcm1sX2NvbnRyb2wgKnBhcm07Ci0JaXBhcm1sX2NvbnRyb2wgbG9jYWxfcGFybTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKLQl1bG9uZyBiMmYwX3Jlc3VsdCA9IDA7Ci0JdWxvbmcgZmxhZ3M7Ci0JaW50IGFkZF9wYXRoaWRfcmVzdWx0ID0gMDsKLQloYW5kbGVyICpoID0gTlVMTDsKLQlfX3U4IG5vX21lbW9yeVsxNl0gPSAiTk8gTUVNT1JZIjsKLQotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0KLQkvKiBDaGVja2luZyBpZiBoYW5kbGUgaXMgdmFsaWQgICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoKGxoLCAmaXVjdl9oYW5kbGVyX3RhYmxlKSB7Ci0JCWlmICgoaGFuZGxlciAqKWhhbmRsZSA9PSBsaXN0X2VudHJ5KGxoLCBoYW5kbGVyLCBsaXN0KSkgewotCQkJaCA9IChoYW5kbGVyICopaGFuZGxlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFoKSB7Ci0JCWlmIChoYW5kbGUpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIiVzOiBIYW5kbGVyIG5vdCBmb3VuZCBpbiBpdWN2X2hhbmRsZXJfdGFibGUuXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCWVsc2UKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiJXM6IE5VTEwgaGFuZGxlIHBhc3NlZCBieSBhcHBsaWNhdGlvbi5cbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHBhdGhpZCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOVUxMIHBhdGhpZCBwb2ludGVyXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGFybSA9IChpcGFybWxfY29udHJvbCAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwbXNnbGltID0gbXNnbGltX3JlcXN0ZDsKLQotCWlmICh1c2VyX2RhdGEpCi0JCW1lbWNweShwYXJtLT5pcHVzZXIsIHVzZXJfZGF0YSwgc2l6ZW9mKHBhcm0tPmlwdXNlcikpOwotCi0JaWYgKHVzZXJpZCkgewotCQltZW1jcHkocGFybS0+aXB2bWlkLCB1c2VyaWQsIHNpemVvZihwYXJtLT5pcHZtaWQpKTsKLQkJQVNDRUJDKHBhcm0tPmlwdm1pZCwgc2l6ZW9mKHBhcm0tPmlwdm1pZCkpOwotCQlFQkNfVE9VUFBFUihwYXJtLT5pcHZtaWQsIHNpemVvZihwYXJtLT5pcHZtaWQpKTsKLQl9Ci0KLQlpZiAoc3lzdGVtX25hbWUpIHsKLQkJbWVtY3B5KHBhcm0tPmlwdGFyZ2V0LCBzeXN0ZW1fbmFtZSwgc2l6ZW9mKHBhcm0tPmlwdGFyZ2V0KSk7Ci0JCUFTQ0VCQyhwYXJtLT5pcHRhcmdldCwgc2l6ZW9mKHBhcm0tPmlwdGFyZ2V0KSk7Ci0JCUVCQ19UT1VQUEVSKHBhcm0tPmlwdGFyZ2V0LCBzaXplb2YocGFybS0+aXB0YXJnZXQpKTsKLQl9Ci0KLQkvKiBJbiBvcmRlciB0byBlc3RhYmxpc2ggYW4gSVVDViBjb25uZWN0aW9uLCB0aGUgcHJvY2VkdXJlIGlzOgotICAgICAgICAgKgotICAgICAgICAgKiBiMmYwKENPTk5FQ1QpCi0gICAgICAgICAqIHRha2UgdGhlIGlwcGF0aGlkIGZyb20gdGhlIGIyZjAgY2FsbAotICAgICAgICAgKiByZWdpc3RlciB0aGUgaGFuZGxlciB0byB0aGUgaXBwYXRoaWQKLSAgICAgICAgICoKLSAgICAgICAgICogVW5mb3J0dW5hdGVseSwgdGhlIENvbm5lY3Rpb25Fc3RhYmxpc2hlZCBtZXNzYWdlIGdldHMgc2VudCBhZnRlciB0aGUKLSAgICAgICAgICogYjJmMChDT05ORUNUKSBjYWxsIGJ1dCBiZWZvcmUgdGhlIHJlZ2lzdGVyIGlzIGhhbmRsZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEluIG9yZGVyIGZvciB0aGlzIHJhY2UgY29uZGl0aW9uIHRvIGJlIGVsaW1pbmF0ZWQsIHRoZSBJVUNWIENvbnRyb2wKLSAgICAgICAgICogSW50ZXJydXB0cyBtdXN0IGJlIGRpc2FibGVkIGZvciB0aGUgYWJvdmUgcHJvY2VkdXJlLgotICAgICAgICAgKgotICAgICAgICAgKiBEYXZpZCBLZW5uZWR5IDxka2VubmVkeUBsaW51eGNhcmUuY29tPgotICAgICAgICAgKi8KLQotCS8qIEVuYWJsZSBldmVyeXRoaW5nIGJ1dCBJVUNWIENvbnRyb2wgbWVzc2FnZXMgKi8KLQlpdWN2X3NldG1hc2sofihBbGxJbnRlcnJ1cHRzKSk7Ci0JbWVzc2FnZXNEaXNhYmxlZCA9IDE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCXBhcm0tPmlwZmxhZ3MxID0gKF9fdTgpZmxhZ3MxOwotCWIyZjBfcmVzdWx0ID0gYjJmMChDT05ORUNULCBwYXJtKTsKLQltZW1jcHkoJmxvY2FsX3Bhcm0sIHBhcm0sIHNpemVvZihsb2NhbF9wYXJtKSk7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQlwYXJtID0gJmxvY2FsX3Bhcm07Ci0JaWYgKCFiMmYwX3Jlc3VsdCkKLQkJYWRkX3BhdGhpZF9yZXN1bHQgPSBfX2l1Y3ZfYWRkX3BhdGhpZChwYXJtLT5pcHBhdGhpZCwgaCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJml1Y3ZfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGIyZjBfcmVzdWx0KSB7Ci0JCWl1Y3Zfc2V0bWFzayh+MCk7Ci0JCW1lc3NhZ2VzRGlzYWJsZWQgPSAwOwotCQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci0JfQotCi0JKnBhdGhpZCA9IHBhcm0tPmlwcGF0aGlkOwotCi0JLyogRW5hYmxlIGV2ZXJ5dGhpbmcgYWdhaW4gKi8KLQlpdWN2X3NldG1hc2soSVVDVkNvbnRyb2xJbnRlcnJ1cHRzRmxhZyk7Ci0KLQlpZiAobXNnbGltKQotCQkqbXNnbGltID0gcGFybS0+aXBtc2dsaW07Ci0JaWYgKGZsYWdzMV9vdXQpCi0JCSpmbGFnczFfb3V0ID0gKHBhcm0tPmlwZmxhZ3MxICYgSVBQUlRZKSA/IElQUFJUWSA6IDA7Ci0KLQlpZiAoYWRkX3BhdGhpZF9yZXN1bHQpIHsKLQkJaXVjdl9zZXZlcigqcGF0aGlkLCBub19tZW1vcnkpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYWRkX3BhdGhpZCBmYWlsZWQgd2l0aCByYyA9IgotCQkJIiAlZFxuIiwgX19GVU5DVElPTl9fLCBhZGRfcGF0aGlkX3Jlc3VsdCk7Ci0JCXJldHVybihhZGRfcGF0aGlkX3Jlc3VsdCk7Ci0JfQotCi0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoqCi0gKiBpdWN2X3B1cmdlOgotICogQHBhdGhpZDogUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqIEBtc2dpZDogIE1lc3NhZ2UgSUQgb2YgbWVzc2FnZSB0byBwdXJnZS4KLSAqIEBzcmNjbHM6IE1lc3NhZ2UgY2xhc3Mgb2YgdGhlIG1lc3NhZ2UgdG8gcHVyZ2UuCi0gKiBAYXVkaXQ6ICBQb2ludGVyIHRvIGFuIF9fdTMyLiBJZiBub3QgTlVMTCwgb24gcmV0dXJuLCBpbmZvcm1hdGlvbiBhYm91dAotICogICAgICAgICAgYXN5bmNocm9ub3VzIGVycm9ycyB0aGF0IG1heSBoYXZlIGFmZmVjdGVkIHRoZSBub3JtYWwgY29tcGxldGlvbgotICogICAgICAgICAgb2YgdGhpcyBtZXNzYWdlIGlzdCBzdG9yZWQgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLgotICoKLSAqIENhbmNlbHMgYSBtZXNzYWdlIHlvdSBoYXZlIHNlbnQuCi0gKiBSZXR1cm5zOiByZXR1cm4gY29kZSBmcm9tIENQCi0gKi8KLWludAotaXVjdl9wdXJnZSAoX191MTYgcGF0aGlkLCBfX3UzMiBtc2dpZCwgX191MzIgc3JjY2xzLCBfX3UzMiAqYXVkaXQpCi17Ci0JaXBhcm1sX3B1cmdlICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0ID0gMDsKLQotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0JaXVjdl9kZWJ1ZygxLCAicGF0aGlkID0gJWQiLCBwYXRoaWQpOwotCi0JcGFybSA9IChpcGFybWxfcHVyZ2UgKilncmFiX3BhcmFtKCk7Ci0KLQlwYXJtLT5pcG1zZ2lkID0gbXNnaWQ7Ci0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXBzcmNjbHMgPSBzcmNjbHM7Ci0JcGFybS0+aXBmbGFnczEgfD0gKElQU1JDQ0xTIHwgSVBGR01JRCB8IElQRkdQSUQpOwotCWIyZjBfcmVzdWx0ID0gYjJmMChQVVJHRSwgcGFybSk7Ci0KLQlpZiAoIWIyZjBfcmVzdWx0ICYmIGF1ZGl0KSB7Ci0JCW1lbWNweShhdWRpdCwgcGFybS0+aXBhdWRpdCwgc2l6ZW9mKHBhcm0tPmlwYXVkaXQpKTsKLQkJLyogcGFybS0+aXBhdWRpdCBoYXMgb25seSAzIGJ5dGVzICovCi0JCSphdWRpdCA+Pj0gODsKLQl9Ci0KLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygxLCAiYjJmMF9yZXN1bHQgPSAlbGQiLCBiMmYwX3Jlc3VsdCk7Ci0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoqCi0gKiBpdWN2X3F1ZXJ5X2dlbmVyaWM6Ci0gKiBAd2FudF9tYXhjb25uOiBGbGFnLCBkZXNjcmliaW5nIHdoaWNoIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLgotICoKLSAqIEhlbHBlciBmdW5jdGlvbiBmb3IgaXVjdl9xdWVyeV9tYXhjb25uKCkgYW5kIGl1Y3ZfcXVlcnlfYnVmc2l6ZSgpLgotICoKLSAqIFJldHVybnM6IFRoZSBidWZmZXJzaXplLCBpZiB3YW50X21heGNvbm4gaXMgMDsgdGhlIG1heGltdW0gbnVtYmVyIG9mCi0gKiAgICAgICAgICAgY29ubmVjdGlvbnMsIGlmIHdhbnRfbWF4Y29ubiBpcyAxIG9yIGFuIGVycm9yLWNvZGUgPCAwIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQKLWl1Y3ZfcXVlcnlfZ2VuZXJpYyhpbnQgd2FudF9tYXhjb25uKQotewotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20gKCIwIik7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcxIGFzbSAoIjEiKTsKLQlpcGFybWxfcHVyZ2UgKnBhcm0gPSAoaXBhcm1sX3B1cmdlICopZ3JhYl9wYXJhbSgpOwotCWludCBidWZzaXplLCBtYXhjb25uOwotCWludCBjY29kZTsKLQotCS8qKgotCSAqIENhbGwgYjJmMCBhbmQgc3RvcmUgUjAgKG1heCBidWZmZXIgc2l6ZSksCi0JICogUjEgKG1heCBjb25uZWN0aW9ucykgYW5kIENDLgotCSAqLwotCXJlZzAgPSBRVUVSWTsKLQlyZWcxID0gdmlydF90b19waHlzKHBhcm0pOwotCWFzbSB2b2xhdGlsZSgKLQkJIgkubG9uZwkweGIyZjAxMDAwXG4iCi0JCSIJaXBtCSUwXG4iCi0JCSIJc3JsCSUwLDI4XG4iCi0JCTogIj1kIiAoY2NvZGUpLCAiK2QiIChyZWcwKSwgIitkIiAocmVnMSkgOiA6ICJjYyIpOwotCWJ1ZnNpemUgPSByZWcwOwotCW1heGNvbm4gPSByZWcxOwotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpZiAoY2NvZGUpCi0JCXJldHVybiAtRVBFUk07Ci0JaWYgKHdhbnRfbWF4Y29ubikKLQkJcmV0dXJuIG1heGNvbm47Ci0JcmV0dXJuIGJ1ZnNpemU7Ci19Ci0KLS8qKgotICogaXVjdl9xdWVyeV9tYXhjb25uOgotICoKLSAqIERldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXkgbWF5IGJlIGVzdGFibGlzaGVkLgotICoKLSAqIFJldHVybnM6IE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgY2FuIGJlLgotICovCi11bG9uZwotaXVjdl9xdWVyeV9tYXhjb25uKHZvaWQpCi17Ci0JcmV0dXJuIGl1Y3ZfcXVlcnlfZ2VuZXJpYygxKTsKLX0KLQotLyoqCi0gKiBpdWN2X3F1ZXJ5X2J1ZnNpemU6Ci0gKgotICogRGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0IGJ1ZmZlci4KLSAqCi0gKiBSZXR1cm5zOiBTaXplIG9mIGV4dGVybmFsIGludGVycnVwdCBidWZmZXIuCi0gKi8KLXVsb25nCi1pdWN2X3F1ZXJ5X2J1ZnNpemUgKHZvaWQpCi17Ci0JcmV0dXJuIGl1Y3ZfcXVlcnlfZ2VuZXJpYygwKTsKLX0KLQotLyoqCi0gKiBpdWN2X3F1aWVzY2U6Ci0gKiBAcGF0aGlkOiAgICBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlcgotICogQHVzZXJfZGF0YTogMTYtYnl0ZSB1c2VyIGRhdGEKLSAqCi0gKiBUZW1wb3JhcmlseSBzdXNwZW5kcyBpbmNvbWluZyBtZXNzYWdlcyBvbiBhbiBJVUNWIHBhdGguCi0gKiBZb3UgY2FuIGxhdGVyIHJlYWN0aXZhdGUgdGhlIHBhdGggYnkgaW52b2tpbmcgdGhlIGl1Y3ZfcmVzdW1lIGZ1bmN0aW9uLgotICogUmV0dXJuczogcmV0dXJuIGNvZGUgZnJvbSBDUAotICovCi1pbnQKLWl1Y3ZfcXVpZXNjZSAoX191MTYgcGF0aGlkLCBfX3U4IHVzZXJfZGF0YVsxNl0pCi17Ci0JaXBhcm1sX2NvbnRyb2wgKnBhcm07Ci0JdWxvbmcgYjJmMF9yZXN1bHQgPSAwOwotCi0JaXVjdl9kZWJ1ZygxLCAiZW50ZXJpbmciKTsKLQlpdWN2X2RlYnVnKDEsICJwYXRoaWQgPSAlZCIsIHBhdGhpZCk7Ci0KLQlwYXJtID0gKGlwYXJtbF9jb250cm9sICopZ3JhYl9wYXJhbSgpOwotCi0JbWVtY3B5KHBhcm0tPmlwdXNlciwgdXNlcl9kYXRhLCBzaXplb2YocGFybS0+aXB1c2VyKSk7Ci0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0KLQliMmYwX3Jlc3VsdCA9IGIyZjAoUVVJRVNDRSwgcGFybSk7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMSwgImIyZjBfcmVzdWx0ID0gJWxkIiwgYjJmMF9yZXN1bHQpOwotCWl1Y3ZfZGVidWcoMSwgImV4aXRpbmciKTsKLQotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoqCi0gKiBpdWN2X3JlY2VpdmU6Ci0gKiBAcGF0aGlkOiBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqIEBidWZmZXI6IEFkZHJlc3Mgb2YgYnVmZmVyIHRvIHJlY2VpdmUuIE11c3QgYmUgYmVsb3cgMkcuCi0gKiBAYnVmbGVuOiBMZW5ndGggb2YgYnVmZmVyIHRvIHJlY2VpdmUuCi0gKiBAbXNnaWQ6ICBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBAdHJnY2xzOiBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogQGZsYWdzMV9vdXQ6IFJlY2VpdmVzIG9wdGlvbnMgZm9yIHBhdGggb24gcmV0dXJuLgotICogICAgLSBJUE5PUlBZICgweDEwKSAgU3BlY2lmaWVzIHdoZXRoZXIgYSByZXBseSBpcyByZXF1aXJlZAotICogICAgLSBJUFBSVFkgKDB4MjApICAgU3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgLSBJUFJNREFUQSAoMHg4MCkgU3BlY2lmaWVzIHRoZSBkYXRhIGlzIGNvbnRhaW5lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QKLSAqIEByZXNpZHVhbF9idWZmZXI6IFJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIGJ1ZmZlciB1cGRhdGVkIGJ5IHRoZSBudW1iZXIKLSAqICAgICAgICAgICAgICAgICAgIG9mIGJ5dGVzIHlvdSBoYXZlIHJlY2VpdmVkIG9uIHJldHVybi4KLSAqIEByZXNpZHVhbF9sZW5ndGg6IE9uIHJldHVybiwgcmVjZWl2ZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgLSAwICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgcmVjZWl2ZSBidWZmZXIgaXMgdGhlIHNhbWUgbGVuZ3RoIGFzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZXNzYWdlLgotICogICAgLSBSZW1haW5pbmcgYnl0ZXMgaW4gYnVmZmVyICBJZiB0aGUgcmVjZWl2ZSBidWZmZXIgaXMgbG9uZ2VyIHRoYW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuCi0gKiAgICAtIFJlbWFpbmluZyBieXRlcyBpbiBtZXNzYWdlIElmIHRoZSByZWNlaXZlIGJ1ZmZlciBpcyBzaG9ydGVyIHRoYW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuCi0gKgotICogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBtZXNzYWdlcyB0aGF0IGFyZSBiZWluZyBzZW50IHRvIHlvdSBvdmVyIGVzdGFibGlzaGVkCi0gKiBwYXRocy4KLSAqIFJldHVybnM6IHJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsOyBJZiB0aGUgcmVjZWl2ZSBidWZmZXIgaXMgc2hvcnRlcgotICogICB0aGFuIHRoZSBtZXNzYWdlLCBhbHdheXMgNQotICogICAtRUlOVkFMIC0gYnVmZmVyIGFkZHJlc3MgaXMgcG9pbnRpbmcgdG8gTlVMTAotICovCi1pbnQKLWl1Y3ZfcmVjZWl2ZSAoX191MTYgcGF0aGlkLCBfX3UzMiBtc2dpZCwgX191MzIgdHJnY2xzLAotCSAgICAgIHZvaWQgKmJ1ZmZlciwgdWxvbmcgYnVmbGVuLAotCSAgICAgIGludCAqZmxhZ3MxX291dCwgdWxvbmcgKiByZXNpZHVhbF9idWZmZXIsIHVsb25nICogcmVzaWR1YWxfbGVuZ3RoKQotewotCWlwYXJtbF9kYiAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdDsKLQlpbnQgbW92ZWQgPSAwOwkvKiBudW1iZXIgb2YgYnl0ZXMgbW92ZWQgZnJvbSBwYXJtbGlzdCB0byBidWZmZXIgKi8KLQotCWl1Y3ZfZGVidWcoMiwgImVudGVyaW5nIik7Ci0KLQlpZiAoIWJ1ZmZlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJtID0gKGlwYXJtbF9kYiAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwYmZhZHIxID0gKF9fdTMyKSAoYWRkcl90KSBidWZmZXI7Ci0JcGFybS0+aXBiZmxuMWYgPSAoX191MzIpICgodWxvbmcpIGJ1Zmxlbik7Ci0JcGFybS0+aXBtc2dpZCA9IG1zZ2lkOwotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwZmxhZ3MxID0gKElQRkdQSUQgfCBJUEZHTUlEIHwgSVBGR01DTCk7Ci0KLQliMmYwX3Jlc3VsdCA9IGIyZjAoUkVDRUlWRSwgcGFybSk7Ci0KLQlpZiAoIWIyZjBfcmVzdWx0IHx8IGIyZjBfcmVzdWx0ID09IDUpIHsKLQkJaWYgKGZsYWdzMV9vdXQpIHsKLQkJCWl1Y3ZfZGVidWcoMiwgIipmbGFnczFfb3V0ID0gJWQiLCAqZmxhZ3MxX291dCk7Ci0JCQkqZmxhZ3MxX291dCA9IChwYXJtLT5pcGZsYWdzMSAmICh+MHgwNykpOwotCQkJaXVjdl9kZWJ1ZygyLCAiKmZsYWdzMV9vdXQgPSAlZCIsICpmbGFnczFfb3V0KTsKLQkJfQotCi0JCWlmICghKHBhcm0tPmlwZmxhZ3MxICYgSVBSTURBVEEpKSB7CS8qbXNnIG5vdCBpbiBwYXJtbGlzdCAqLwotCQkJaWYgKHJlc2lkdWFsX2xlbmd0aCkKLQkJCQkqcmVzaWR1YWxfbGVuZ3RoID0gcGFybS0+aXBiZmxuMWY7Ci0KLQkJCWlmIChyZXNpZHVhbF9idWZmZXIpCi0JCQkJKnJlc2lkdWFsX2J1ZmZlciA9IHBhcm0tPmlwYmZhZHIxOwotCQl9IGVsc2UgewotCQkJbW92ZWQgPSBtaW5fdCAodW5zaWduZWQgbG9uZywgYnVmbGVuLCA4KTsKLQotCQkJbWVtY3B5ICgoY2hhciAqKSBidWZmZXIsCi0JCQkJKGNoYXIgKikgJnBhcm0tPmlwYmZhZHIxLCBtb3ZlZCk7Ci0KLQkJCWlmIChidWZsZW4gPCA4KQotCQkJCWIyZjBfcmVzdWx0ID0gNTsKLQotCQkJaWYgKHJlc2lkdWFsX2xlbmd0aCkKLQkJCQkqcmVzaWR1YWxfbGVuZ3RoID0gYWJzIChidWZsZW4gLSA4KTsKLQotCQkJaWYgKHJlc2lkdWFsX2J1ZmZlcikKLQkJCQkqcmVzaWR1YWxfYnVmZmVyID0gKHVsb25nKSAoYnVmZmVyICsgbW92ZWQpOwotCQl9Ci0JfQotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpdWN2X2RlYnVnKDIsICJleGl0aW5nIik7Ci0JcmV0dXJuIGIyZjBfcmVzdWx0OwotfQotCi0vKgotICogTmFtZTogaXVjdl9yZWNlaXZlX2FycmF5Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHJlY2VpdmVzIG1lc3NhZ2VzIHRoYXQgYXJlIGJlaW5nIHNlbnQgdG8geW91Ci0gKiAgICAgICAgICBvdmVyIGVzdGFibGlzaGVkIHBhdGhzLgotICogSW5wdXQ6IHBhdGhpZCAtIHBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgYnVmZmVyIC0gYWRkcmVzcyBvZiBhcnJheSBvZiBidWZmZXJzCi0gKiAgICAgICAgYnVmbGVuIC0gdG90YWwgbGVuZ3RoIG9mIGJ1ZmZlcnMKLSAqICAgICAgICBtc2dpZCAtIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqICAgICAgICB0cmdjbHMgLSBzcGVjaWZpZXMgdGFyZ2V0IGNsYXNzCi0gKiBPdXRwdXQ6Ci0gKiAgICAgICAgZmxhZ3MxX291dDogT3B0aW9ucyBmb3IgcGF0aC4KLSAqICAgICAgICAgIElQTk9SUFkgLSAweDEwIHNwZWNpZmllcyB3aGV0aGVyIGEgcmVwbHkgaXMgcmVxdWlyZWQKLSAqICAgICAgICAgIElQUFJUWSAtIDB4MjAgc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgICAgICBJUFJNREFUQSAtIDB4ODAgc3BlY2lmaWVzIHRoZSBkYXRhIGlzIGNvbnRhaW5lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QKLSAqICAgICAgIHJlc2lkdWFsX2J1ZmZlciAtIGFkZHJlc3MgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGxpc3QgZW50cnkgSVVDVgotICogICAgICAgICAgICAgICAgICAgICAgICAgaXMgd29ya2luZyBvbi4KLSAqICAgICAgIHJlc2lkdWFsX2xlbmd0aCAtCi0gKiAgICAgICAgICAgICAgQ29udGFpbnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLCBpZiB0aGUgcmVjZWl2ZSBidWZmZXIgaXM6Ci0gKiAgICAgICAgICAgICAgIFRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgbWVzc2FnZSwgdGhpcyBmaWVsZCBpcyB6ZXJvLgotICogICAgICAgICAgICAgICBMb25nZXIgdGhhbiB0aGUgbWVzc2FnZSwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgbnVtYmVyIG9mCi0gKiAgICAgICAgICAgICAgICBieXRlcyByZW1haW5pbmcgaW4gdGhlIGJ1ZmZlci4KLSAqICAgICAgICAgICAgICAgU2hvcnRlciB0aGFuIHRoZSBtZXNzYWdlLCB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSByZXNpZHVhbAotICogICAgICAgICAgICAgICAgY291bnQgKHRoYXQgaXMsIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZQotICogICAgICAgICAgICAgICAgbWVzc2FnZSB0aGF0IGRvZXMgbm90IGZpdCBpbnRvIHRoZSBidWZmZXIuIEluIHRoaXMgY2FzZQotICoJCSAgYjJmMF9yZXN1bHQgPSA1LgotICogUmV0dXJuOiBiMmYwX3Jlc3VsdCAtIHJldHVybiBjb2RlIGZyb20gQ1AKLSAqICAgICAgICAgKC1FSU5WQUwpIC0gYnVmZmVyIGFkZHJlc3MgaXMgTlVMTAotICovCi1pbnQKLWl1Y3ZfcmVjZWl2ZV9hcnJheSAoX191MTYgcGF0aGlkLAotCQkgICAgX191MzIgbXNnaWQsIF9fdTMyIHRyZ2NscywKLQkJICAgIGl1Y3ZfYXJyYXlfdCAqIGJ1ZmZlciwgdWxvbmcgYnVmbGVuLAotCQkgICAgaW50ICpmbGFnczFfb3V0LAotCQkgICAgdWxvbmcgKiByZXNpZHVhbF9idWZmZXIsIHVsb25nICogcmVzaWR1YWxfbGVuZ3RoKQotewotCWlwYXJtbF9kYiAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdDsKLQlpbnQgaSA9IDAsIG1vdmVkID0gMCwgbmVlZF90b19tb3ZlID0gOCwgZHluX2xlbjsKLQotCWl1Y3ZfZGVidWcoMiwgImVudGVyaW5nIik7Ci0KLQlpZiAoIWJ1ZmZlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJtID0gKGlwYXJtbF9kYiAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwYmZhZHIxID0gKF9fdTMyKSAoKHVsb25nKSBidWZmZXIpOwotCXBhcm0tPmlwYmZsbjFmID0gKF9fdTMyKSBidWZsZW47Ci0JcGFybS0+aXBtc2dpZCA9IG1zZ2lkOwotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwZmxhZ3MxID0gKElQQlVGTFNUIHwgSVBGR1BJRCB8IElQRkdNSUQgfCBJUEZHTUNMKTsKLQotCWIyZjBfcmVzdWx0ID0gYjJmMChSRUNFSVZFLCBwYXJtKTsKLQotCWlmICghYjJmMF9yZXN1bHQgfHwgYjJmMF9yZXN1bHQgPT0gNSkgewotCi0JCWlmIChmbGFnczFfb3V0KSB7Ci0JCQlpdWN2X2RlYnVnKDIsICIqZmxhZ3MxX291dCA9ICVkIiwgKmZsYWdzMV9vdXQpOwotCQkJKmZsYWdzMV9vdXQgPSAocGFybS0+aXBmbGFnczEgJiAofjB4MDcpKTsKLQkJCWl1Y3ZfZGVidWcoMiwgIipmbGFnczFfb3V0ID0gJWQiLCAqZmxhZ3MxX291dCk7Ci0JCX0KLQotCQlpZiAoIShwYXJtLT5pcGZsYWdzMSAmIElQUk1EQVRBKSkgewkvKm1zZyBub3QgaW4gcGFybWxpc3QgKi8KLQotCQkJaWYgKHJlc2lkdWFsX2xlbmd0aCkKLQkJCQkqcmVzaWR1YWxfbGVuZ3RoID0gcGFybS0+aXBiZmxuMWY7Ci0KLQkJCWlmIChyZXNpZHVhbF9idWZmZXIpCi0JCQkJKnJlc2lkdWFsX2J1ZmZlciA9IHBhcm0tPmlwYmZhZHIxOwotCi0JCX0gZWxzZSB7Ci0JCQkvKiBjb3B5IG1zZyBmcm9tIHBhcm1saXN0IHRvIHVzZXJzIGFycmF5LiAqLwotCi0JCQl3aGlsZSAoKG1vdmVkIDwgOCkgJiYgKG1vdmVkIDwgYnVmbGVuKSkgewotCQkJCWR5bl9sZW4gPQotCQkJCSAgICBtaW5fdCAodW5zaWduZWQgaW50LAotCQkJCQkgKGJ1ZmZlciArIGkpLT5sZW5ndGgsIG5lZWRfdG9fbW92ZSk7Ci0KLQkJCQltZW1jcHkgKChjaGFyICopKCh1bG9uZykoKGJ1ZmZlciArIGkpLT5hZGRyZXNzKSksCi0JCQkJCSgoY2hhciAqKSAmcGFybS0+aXBiZmFkcjEpICsgbW92ZWQsCi0JCQkJCWR5bl9sZW4pOwotCi0JCQkJbW92ZWQgKz0gZHluX2xlbjsKLQkJCQluZWVkX3RvX21vdmUgLT0gZHluX2xlbjsKLQotCQkJCShidWZmZXIgKyBpKS0+YWRkcmVzcyA9Ci0JCQkJICAgIAkoX191MzIpCi0JCQkJKCh1bG9uZykoX191OCAqKSAoKHVsb25nKShidWZmZXIgKyBpKS0+YWRkcmVzcykKLQkJCQkJCSsgZHluX2xlbik7Ci0KLQkJCQkoYnVmZmVyICsgaSktPmxlbmd0aCAtPSBkeW5fbGVuOwotCQkJCWkrKzsKLQkJCX0KLQotCQkJaWYgKG5lZWRfdG9fbW92ZSkJLyogYnVmbGVuIDwgOCBieXRlcyAqLwotCQkJCWIyZjBfcmVzdWx0ID0gNTsKLQotCQkJaWYgKHJlc2lkdWFsX2xlbmd0aCkKLQkJCQkqcmVzaWR1YWxfbGVuZ3RoID0gYWJzIChidWZsZW4gLSA4KTsKLQotCQkJaWYgKHJlc2lkdWFsX2J1ZmZlcikgewotCQkJCWlmICghbW92ZWQpCi0JCQkJCSpyZXNpZHVhbF9idWZmZXIgPSAodWxvbmcpIGJ1ZmZlcjsKLQkJCQllbHNlCi0JCQkJCSpyZXNpZHVhbF9idWZmZXIgPQotCQkJCQkgICAgKHVsb25nKSAoYnVmZmVyICsgKGkgLSAxKSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygyLCAiZXhpdGluZyIpOwotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoqCi0gKiBpdWN2X3JlamVjdDoKLSAqIEBwYXRoaWQ6IFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICogQG1zZ2lkOiAgTWVzc2FnZSBJRCBvZiB0aGUgbWVzc2FnZSB0byByZWplY3QuCi0gKiBAdHJnY2xzOiBUYXJnZXQgY2xhc3Mgb2YgdGhlIG1lc3NhZ2UgdG8gcmVqZWN0LgotICogUmV0dXJuczogcmV0dXJuIGNvZGUgZnJvbSBDUAotICoKLSAqIFJlZnVzZXMgYSBzcGVjaWZpZWQgbWVzc2FnZS4gQmV0d2VlbiB0aGUgdGltZSB5b3UgYXJlIG5vdGlmaWVkIG9mIGEKLSAqIG1lc3NhZ2UgYW5kIHRoZSB0aW1lIHRoYXQgeW91IGNvbXBsZXRlIHRoZSBtZXNzYWdlLCB0aGUgbWVzc2FnZSBtYXkKLSAqIGJlIHJlamVjdGVkLgotICovCi1pbnQKLWl1Y3ZfcmVqZWN0IChfX3UxNiBwYXRoaWQsIF9fdTMyIG1zZ2lkLCBfX3UzMiB0cmdjbHMpCi17Ci0JaXBhcm1sX2RiICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0ID0gMDsKLQotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0JaXVjdl9kZWJ1ZygxLCAicGF0aGlkID0gJWQiLCBwYXRoaWQpOwotCi0JcGFybSA9IChpcGFybWxfZGIgKilncmFiX3BhcmFtKCk7Ci0KLQlwYXJtLT5pcHBhdGhpZCA9IHBhdGhpZDsKLQlwYXJtLT5pcG1zZ2lkID0gbXNnaWQ7Ci0JcGFybS0+aXB0cmdjbHMgPSB0cmdjbHM7Ci0JcGFybS0+aXBmbGFnczEgPSAoSVBGR01DTCB8IElQRkdNSUQgfCBJUEZHUElEKTsKLQotCWIyZjBfcmVzdWx0ID0gYjJmMChSRUpFQ1QsIHBhcm0pOwotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpdWN2X2RlYnVnKDEsICJiMmYwX3Jlc3VsdCA9ICVsZCIsIGIyZjBfcmVzdWx0KTsKLQlpdWN2X2RlYnVnKDEsICJleGl0aW5nIik7Ci0KLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3JlcGx5Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHJlc3BvbmRzIHRvIHRoZSB0d28td2F5IG1lc3NhZ2VzIHRoYXQgeW91Ci0gKiAgICAgICAgICByZWNlaXZlLiBZb3UgbXVzdCBpZGVudGlmeSBjb21wbGV0ZWx5IHRoZSBtZXNzYWdlIHRvCi0gKiAgICAgICAgICB3aGljaCB5b3Ugd2lzaCB0byByZXBseS4gaWUsIHBhdGhpZCwgbXNnaWQsIGFuZCB0cmdjbHMuCi0gKiBJbnB1dDogcGF0aGlkIC0gcGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICBtc2dpZCAtIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqICAgICAgICB0cmdjbHMgLSBzcGVjaWZpZXMgdGFyZ2V0IGNsYXNzCi0gKiAgICAgICAgZmxhZ3MxIC0gb3B0aW9uIGZvciBwYXRoCi0gKiAgICAgICAgICAgICAgICAgSVBQUlRZLSAweDIwIC0gc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgICAgIGJ1ZmZlciAtIGFkZHJlc3Mgb2YgcmVwbHkgYnVmZmVyCi0gKiAgICAgICAgYnVmbGVuIC0gbGVuZ3RoIG9mIHJlcGx5IGJ1ZmZlcgotICogT3V0cHV0OiBpcGJmYWRyMiAtIEFkZHJlc3Mgb2YgYnVmZmVyIHVwZGF0ZWQgYnkgdGhlIG51bWJlcgotICogICAgICAgICAgICAgICAgICAgIG9mIGJ5dGVzIHlvdSBoYXZlIG1vdmVkLgotICogICAgICAgICBpcGJmbG4yZiAtIENvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICBJZiB0aGUgYW5zd2VyIGJ1ZmZlciBpcyB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHJlcGx5LCB0aGlzIGZpZWxkCi0gKiAgICAgICAgICAgICAgIGNvbnRhaW5zIHplcm8uCi0gKiAgICAgICAgICAgICAgSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgbG9uZ2VyIHRoYW4gdGhlIHJlcGx5LCB0aGlzIGZpZWxkIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBidWZmZXIuCi0gKiAgICAgICAgICAgICAgSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgc2hvcnRlciB0aGFuIHRoZSByZXBseSwgdGhpcyBmaWVsZCBjb250YWlucwotICogICAgICAgICAgICAgICBhIHJlc2lkdWFsIGNvdW50ICh0aGF0IGlzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWlhbmluZyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgcmVwbHkgdGhhdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgYnVmZmVyLiBJbiB0aGlzCi0gKiAgICAgICAgICAgICAgICBjYXNlIGIyZjBfcmVzdWx0ID0gNS4KLSAqIFJldHVybjogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIENQCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIGJ1ZmZlciBhZGRyZXNzIGlzIE5VTEwKLSAqLwotaW50Ci1pdWN2X3JlcGx5IChfX3UxNiBwYXRoaWQsCi0JICAgIF9fdTMyIG1zZ2lkLCBfX3UzMiB0cmdjbHMsCi0JICAgIGludCBmbGFnczEsCi0JICAgIHZvaWQgKmJ1ZmZlciwgdWxvbmcgYnVmbGVuLCB1bG9uZyAqIGlwYmZhZHIyLCB1bG9uZyAqIGlwYmZsbjJmKQotewotCWlwYXJtbF9kYiAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdDsKLQotCWl1Y3ZfZGVidWcoMiwgImVudGVyaW5nIik7Ci0KLQlpZiAoIWJ1ZmZlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJtID0gKGlwYXJtbF9kYiAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwYmZhZHIyID0gKF9fdTMyKSAoKHVsb25nKSBidWZmZXIpOwotCXBhcm0tPmlwYmZsbjJmID0gKF9fdTMyKSBidWZsZW47CS8qIGxlbmd0aCBvZiBtZXNzYWdlICovCi0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXBtc2dpZCA9IG1zZ2lkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwZmxhZ3MxID0gKF9fdTgpIGZsYWdzMTsJLyogcHJpb3JpdHkgbWVzc2FnZSAqLwotCi0JYjJmMF9yZXN1bHQgPSBiMmYwKFJFUExZLCBwYXJtKTsKLQotCWlmICgoIWIyZjBfcmVzdWx0KSB8fCAoYjJmMF9yZXN1bHQgPT0gNSkpIHsKLQkJaWYgKGlwYmZhZHIyKQotCQkJKmlwYmZhZHIyID0gcGFybS0+aXBiZmFkcjI7Ci0JCWlmIChpcGJmbG4yZikKLQkJCSppcGJmbG4yZiA9IHBhcm0tPmlwYmZsbjJmOwotCX0KLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygyLCAiZXhpdGluZyIpOwotCi0JcmV0dXJuIGIyZjBfcmVzdWx0OwotfQotCi0vKgotICogTmFtZTogaXVjdl9yZXBseV9hcnJheQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiByZXNwb25kcyB0byB0aGUgdHdvLXdheSBtZXNzYWdlcyB0aGF0IHlvdQotICogICAgICAgICAgcmVjZWl2ZS4gWW91IG11c3QgaWRlbnRpZnkgY29tcGxldGVseSB0aGUgbWVzc2FnZSB0bwotICogICAgICAgICAgd2hpY2ggeW91IHdpc2ggdG8gcmVwbHkuIGllLCBwYXRoaWQsIG1zZ2lkLCBhbmQgdHJnY2xzLgotICogICAgICAgICAgVGhlIGFycmF5IGlkZW50aWZpZXMgYSBsaXN0IG9mIGFkZHJlc3NlcyBhbmQgbGVuZ3RocyBvZgotICogICAgICAgICAgZGlzY29udGlndW91cyBidWZmZXJzIHRoYXQgY29udGFpbnMgdGhlIHJlcGx5IGRhdGEuCi0gKiBJbnB1dDogcGF0aGlkIC0gcGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICBtc2dpZCAtIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqICAgICAgICB0cmdjbHMgLSBzcGVjaWZpZXMgdGFyZ2V0IGNsYXNzCi0gKiAgICAgICAgZmxhZ3MxIC0gb3B0aW9uIGZvciBwYXRoCi0gKiAgICAgICAgICAgICAgICAgSVBQUlRZLSBzcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlCi0gKiAgICAgICAgYnVmZmVyIC0gYWRkcmVzcyBvZiBhcnJheSBvZiByZXBseSBidWZmZXJzCi0gKiAgICAgICAgYnVmbGVuIC0gdG90YWwgbGVuZ3RoIG9mIHJlcGx5IGJ1ZmZlcnMKLSAqIE91dHB1dDogaXBiZmFkcjIgLSBBZGRyZXNzIG9mIGJ1ZmZlciB3aGljaCBJVUNWIGlzIGN1cnJlbnRseSB3b3JraW5nIG9uLgotICogICAgICAgICBpcGJmbG4yZiAtIENvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICBJZiB0aGUgYW5zd2VyIGJ1ZmZlciBpcyB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHJlcGx5LCB0aGlzIGZpZWxkCi0gKiAgICAgICAgICAgICAgIGNvbnRhaW5zIHplcm8uCi0gKiAgICAgICAgICAgICAgSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgbG9uZ2VyIHRoYW4gdGhlIHJlcGx5LCB0aGlzIGZpZWxkIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBidWZmZXIuCi0gKiAgICAgICAgICAgICAgSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgc2hvcnRlciB0aGFuIHRoZSByZXBseSwgdGhpcyBmaWVsZCBjb250YWlucwotICogICAgICAgICAgICAgICBhIHJlc2lkdWFsIGNvdW50ICh0aGF0IGlzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWlhbmluZyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgcmVwbHkgdGhhdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgYnVmZmVyLiBJbiB0aGlzCi0gKiAgICAgICAgICAgICAgIGNhc2UgYjJmMF9yZXN1bHQgPSA1LgotICogUmV0dXJuOiBiMmYwX3Jlc3VsdCAtIHJldHVybiBjb2RlIGZyb20gQ1AKLSAqICAgICAgICAgICAgICgtRUlOVkFMKSAtIGJ1ZmZlciBhZGRyZXNzIGlzIE5VTEwKLSovCi1pbnQKLWl1Y3ZfcmVwbHlfYXJyYXkgKF9fdTE2IHBhdGhpZCwKLQkJICBfX3UzMiBtc2dpZCwgX191MzIgdHJnY2xzLAotCQkgIGludCBmbGFnczEsCi0JCSAgaXVjdl9hcnJheV90ICogYnVmZmVyLAotCQkgIHVsb25nIGJ1ZmxlbiwgdWxvbmcgKiBpcGJmYWRyMiwgdWxvbmcgKiBpcGJmbG4yZikKLXsKLQlpcGFybWxfZGIgKnBhcm07Ci0JdWxvbmcgYjJmMF9yZXN1bHQ7Ci0KLQlpdWN2X2RlYnVnKDIsICJlbnRlcmluZyIpOwotCi0JaWYgKCFidWZmZXIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGFybSA9IChpcGFybWxfZGIgKilncmFiX3BhcmFtKCk7Ci0KLQlwYXJtLT5pcGJmYWRyMiA9IChfX3UzMikgKCh1bG9uZykgYnVmZmVyKTsKLQlwYXJtLT5pcGJmbG4yZiA9IGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIG1lc3NhZ2UgKi8KLQlwYXJtLT5pcHBhdGhpZCA9IHBhdGhpZDsKLQlwYXJtLT5pcG1zZ2lkID0gbXNnaWQ7Ci0JcGFybS0+aXB0cmdjbHMgPSB0cmdjbHM7Ci0JcGFybS0+aXBmbGFnczEgPSAoSVBBTlNMU1QgfCBmbGFnczEpOwotCi0JYjJmMF9yZXN1bHQgPSBiMmYwKFJFUExZLCBwYXJtKTsKLQotCWlmICgoIWIyZjBfcmVzdWx0KSB8fCAoYjJmMF9yZXN1bHQgPT0gNSkpIHsKLQotCQlpZiAoaXBiZmFkcjIpCi0JCQkqaXBiZmFkcjIgPSBwYXJtLT5pcGJmYWRyMjsKLQkJaWYgKGlwYmZsbjJmKQotCQkJKmlwYmZsbjJmID0gcGFybS0+aXBiZmxuMmY7Ci0JfQotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpdWN2X2RlYnVnKDIsICJleGl0aW5nIik7Ci0KLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3JlcGx5X3BybW1zZwotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiByZXNwb25kcyB0byB0aGUgdHdvLXdheSBtZXNzYWdlcyB0aGF0IHlvdQotICogICAgICAgICAgcmVjZWl2ZS4gWW91IG11c3QgaWRlbnRpZnkgY29tcGxldGVseSB0aGUgbWVzc2FnZSB0bwotICogICAgICAgICAgd2hpY2ggeW91IHdpc2ggdG8gcmVwbHkuIGllLCBwYXRoaWQsIG1zZ2lkLCBhbmQgdHJnY2xzLgotICogICAgICAgICAgUHJtbXNnIHNpZ25pZmllcyB0aGUgZGF0YSBpcyBtb3ZlZCBpbnRvIHRoZQotICogICAgICAgICAgcGFyYW1ldGVyIGxpc3QuCi0gKiBJbnB1dDogcGF0aGlkIC0gcGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICBtc2dpZCAtIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqICAgICAgICB0cmdjbHMgLSBzcGVjaWZpZXMgdGFyZ2V0IGNsYXNzCi0gKiAgICAgICAgZmxhZ3MxIC0gb3B0aW9uIGZvciBwYXRoCi0gKiAgICAgICAgICAgICAgICAgSVBQUlRZLSBzcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlCi0gKiAgICAgICAgcHJtbXNnIC0gOC1ieXRlcyBvZiBkYXRhIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICBsaXN0LgotICogT3V0cHV0OiBOQQotICogUmV0dXJuOiBiMmYwX3Jlc3VsdCAtIHJldHVybiBjb2RlIGZyb20gQ1AKLSovCi1pbnQKLWl1Y3ZfcmVwbHlfcHJtbXNnIChfX3UxNiBwYXRoaWQsCi0JCSAgIF9fdTMyIG1zZ2lkLCBfX3UzMiB0cmdjbHMsIGludCBmbGFnczEsIF9fdTggcHJtbXNnWzhdKQotewotCWlwYXJtbF9kcGwgKnBhcm07Ci0JdWxvbmcgYjJmMF9yZXN1bHQ7Ci0KLQlpdWN2X2RlYnVnKDIsICJlbnRlcmluZyIpOwotCi0JcGFybSA9IChpcGFybWxfZHBsICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXBtc2dpZCA9IG1zZ2lkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCW1lbWNweShwYXJtLT5pcHJtbXNnLCBwcm1tc2csIHNpemVvZiAocGFybS0+aXBybW1zZykpOwotCXBhcm0tPmlwZmxhZ3MxID0gKElQUk1EQVRBIHwgZmxhZ3MxKTsKLQotCWIyZjBfcmVzdWx0ID0gYjJmMChSRVBMWSwgcGFybSk7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMiwgImV4aXRpbmciKTsKLQotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoqCi0gKiBpdWN2X3Jlc3VtZToKLSAqIEBwYXRoaWQ6ICAgIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiBAdXNlcl9kYXRhOiAxNi1ieXRlIG9mIHVzZXIgZGF0YQotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmVzdG9yZXMgY29tbXVuaWNhdGlvbiBvdmVyIGEgcXVpZXNjZWQgcGF0aC4KLSAqIFJldHVybnM6IHJldHVybiBjb2RlIGZyb20gQ1AKLSAqLwotaW50Ci1pdWN2X3Jlc3VtZSAoX191MTYgcGF0aGlkLCBfX3U4IHVzZXJfZGF0YVsxNl0pCi17Ci0JaXBhcm1sX2NvbnRyb2wgKnBhcm07Ci0JdWxvbmcgYjJmMF9yZXN1bHQgPSAwOwotCi0JaXVjdl9kZWJ1ZygxLCAiZW50ZXJpbmciKTsKLQlpdWN2X2RlYnVnKDEsICJwYXRoaWQgPSAlZCIsIHBhdGhpZCk7Ci0KLQlwYXJtID0gKGlwYXJtbF9jb250cm9sICopZ3JhYl9wYXJhbSgpOwotCi0JbWVtY3B5IChwYXJtLT5pcHVzZXIsIHVzZXJfZGF0YSwgc2l6ZW9mICgqdXNlcl9kYXRhKSk7Ci0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0KLQliMmYwX3Jlc3VsdCA9IGIyZjAoUkVTVU1FLCBwYXJtKTsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygxLCAiZXhpdGluZyIpOwotCi0JcmV0dXJuIGIyZjBfcmVzdWx0OwotfQotCi0vKgotICogTmFtZTogaXVjdl9zZW5kCi0gKiBQdXJwb3NlOiBzZW5kcyBtZXNzYWdlcwotICogSW5wdXQ6IHBhdGhpZCAtIHVzaG9ydCwgcGF0aGlkCi0gKiAgICAgICAgbXNnaWQgIC0gdWxvbmcgKiwgaWQgb2YgbWVzc2FnZSByZXR1cm5lZCB0byBjYWxsZXIKLSAqICAgICAgICB0cmdjbHMgLSB1bG9uZywgdGFyZ2V0IG1lc3NhZ2UgY2xhc3MKLSAqICAgICAgICBzcmNjbHMgLSB1bG9uZywgc291cmNlIG1lc3NhZ2UgY2xhc3MKLSAqICAgICAgICBtc2d0YWcgLSB1bG9uZywgbWVzc2FnZSB0YWcKLSAqCSAgZmxhZ3MxICAtIENvbnRhaW5zIG9wdGlvbnMgZm9yIHRoaXMgcGF0aC4KLSAqCQlJUFBSVFkgLSBPeDIwIC0gc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgYSBwcmlvcml0eSBtZXNzYWdlLgotICogICAgICAgIGJ1ZmZlciAtIHBvaW50ZXIgdG8gYnVmZmVyCi0gKiAgICAgICAgYnVmbGVuIC0gdWxvbmcsIGxlbmd0aCBvZiBidWZmZXIKLSAqIE91dHB1dDogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIGIyZjAgY2FsbAotICogICAgICAgICBtc2dpZCAtIHJldHVybnMgbWVzc2FnZSBpZAotICovCi1pbnQKLWl1Y3Zfc2VuZCAoX191MTYgcGF0aGlkLCBfX3UzMiAqIG1zZ2lkLAotCSAgIF9fdTMyIHRyZ2NscywgX191MzIgc3JjY2xzLAotCSAgIF9fdTMyIG1zZ3RhZywgaW50IGZsYWdzMSwgdm9pZCAqYnVmZmVyLCB1bG9uZyBidWZsZW4pCi17Ci0JaXBhcm1sX2RiICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0OwotCi0JaXVjdl9kZWJ1ZygyLCAiZW50ZXJpbmciKTsKLQotCWlmICghYnVmZmVyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcm0gPSAoaXBhcm1sX2RiICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBiZmFkcjEgPSAoX191MzIpICgodWxvbmcpIGJ1ZmZlcik7Ci0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXB0cmdjbHMgPSB0cmdjbHM7Ci0JcGFybS0+aXBiZmxuMWYgPSAoX191MzIpIGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIG1lc3NhZ2UgKi8KLQlwYXJtLT5pcHNyY2NscyA9IHNyY2NsczsKLQlwYXJtLT5pcG1zZ3RhZyA9IG1zZ3RhZzsKLQlwYXJtLT5pcGZsYWdzMSA9IChJUE5PUlBZIHwgZmxhZ3MxKTsJLyogb25lIHdheSBwcmlvcml0eSBtZXNzYWdlICovCi0KLQliMmYwX3Jlc3VsdCA9IGIyZjAoU0VORCwgcGFybSk7Ci0KLQlpZiAoKCFiMmYwX3Jlc3VsdCkgJiYgKG1zZ2lkKSkKLQkJKm1zZ2lkID0gcGFybS0+aXBtc2dpZDsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygyLCAiZXhpdGluZyIpOwotCi0JcmV0dXJuIGIyZjBfcmVzdWx0OwotfQotCi0vKgotICogTmFtZTogaXVjdl9zZW5kX2FycmF5Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uCi0gKiAgICAgICAgICBUaGUgY29udGVudHMgb2YgYnVmZmVyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheSBvZgotICogICAgICAgICAgYWRkcmVzc2VzIGFuZCBsZW5ndGhzIG9mIGRpc2NvbnRpZ3VvdXMgYnVmZmVycyB0aGF0IGhvbGQKLSAqICAgICAgICAgIHRoZSBtZXNzYWdlIHRleHQuIFRoaXMgaXMgYSBvbmUtd2F5IG1lc3NhZ2UgYW5kIHRoZQotICogICAgICAgICAgcmVjZWl2ZXIgd2lsbCBub3QgcmVwbHkgdG8gdGhlIG1lc3NhZ2UuCi0gKiBJbnB1dDogcGF0aGlkIC0gcGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICB0cmdjbHMgLSBzcGVjaWZpZXMgdGFyZ2V0IGNsYXNzCi0gKiAgICAgICAgc3JjY2xzIC0gc3BlY2lmaWVzIHRoZSBzb3VyY2UgbWVzc2FnZSBjbGFzcwotICogICAgICAgIG1zZ3RhZyAtIHNwZWNpZmllcyBhIHRhZyB0byBiZSBhc3NvY2lhdGVkIHdpdGh0IHRoZSBtZXNzYWdlCi0gKiAgICAgICAgZmxhZ3MxIC0gb3B0aW9uIGZvciBwYXRoCi0gKiAgICAgICAgICAgICAgICAgSVBQUlRZLSBzcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlCi0gKiAgICAgICAgYnVmZmVyIC0gYWRkcmVzcyBvZiBhcnJheSBvZiBzZW5kIGJ1ZmZlcnMKLSAqICAgICAgICBidWZsZW4gLSB0b3RhbCBsZW5ndGggb2Ygc2VuZCBidWZmZXJzCi0gKiBPdXRwdXQ6IG1zZ2lkIC0gc3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICogUmV0dXJuOiBiMmYwX3Jlc3VsdCAtIHJldHVybiBjb2RlIGZyb20gQ1AKLSAqICAgICAgICAgKC1FSU5WQUwpIC0gYnVmZmVyIGFkZHJlc3MgaXMgTlVMTAotICovCi1pbnQKLWl1Y3Zfc2VuZF9hcnJheSAoX191MTYgcGF0aGlkLAotCQkgX191MzIgKiBtc2dpZCwKLQkJIF9fdTMyIHRyZ2NscywKLQkJIF9fdTMyIHNyY2NscywKLQkJIF9fdTMyIG1zZ3RhZywgaW50IGZsYWdzMSwgaXVjdl9hcnJheV90ICogYnVmZmVyLCB1bG9uZyBidWZsZW4pCi17Ci0JaXBhcm1sX2RiICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0OwotCi0JaXVjdl9kZWJ1ZygyLCAiZW50ZXJpbmciKTsKLQotCWlmICghYnVmZmVyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcm0gPSAoaXBhcm1sX2RiICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXB0cmdjbHMgPSB0cmdjbHM7Ci0JcGFybS0+aXBiZmFkcjEgPSAoX191MzIpICgodWxvbmcpIGJ1ZmZlcik7Ci0JcGFybS0+aXBiZmxuMWYgPSAoX191MzIpIGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIG1lc3NhZ2UgKi8KLQlwYXJtLT5pcHNyY2NscyA9IHNyY2NsczsKLQlwYXJtLT5pcG1zZ3RhZyA9IG1zZ3RhZzsKLQlwYXJtLT5pcGZsYWdzMSA9IChJUE5PUlBZIHwgSVBCVUZMU1QgfCBmbGFnczEpOwotCWIyZjBfcmVzdWx0ID0gYjJmMChTRU5ELCBwYXJtKTsKLQotCWlmICgoIWIyZjBfcmVzdWx0KSAmJiAobXNnaWQpKQotCQkqbXNnaWQgPSBwYXJtLT5pcG1zZ2lkOwotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpdWN2X2RlYnVnKDIsICJleGl0aW5nIik7Ci0JcmV0dXJuIGIyZjBfcmVzdWx0OwotfQotCi0vKgotICogTmFtZTogaXVjdl9zZW5kX3BybW1zZwotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgUHJtbXNnIHNwZWNpZmllcyB0aGF0IHRoZSA4LWJ5dGVzIG9mIGRhdGEgYXJlIHRvIGJlIG1vdmVkCi0gKiAgICAgICAgICBpbnRvIHRoZSBwYXJhbWV0ZXIgbGlzdC4gVGhpcyBpcyBhIG9uZS13YXkgbWVzc2FnZSBhbmQgdGhlCi0gKiAgICAgICAgICByZWNlaXZlciB3aWxsIG5vdCByZXBseSB0byB0aGUgbWVzc2FnZS4KLSAqIElucHV0OiBwYXRoaWQgLSBwYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlcgotICogICAgICAgIHRyZ2NscyAtIHNwZWNpZmllcyB0YXJnZXQgY2xhc3MKLSAqICAgICAgICBzcmNjbHMgLSBzcGVjaWZpZXMgdGhlIHNvdXJjZSBtZXNzYWdlIGNsYXNzCi0gKiAgICAgICAgbXNndGFnIC0gc3BlY2lmaWVzIGEgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZQotICogICAgICAgIGZsYWdzMSAtIG9wdGlvbiBmb3IgcGF0aAotICogICAgICAgICAgICAgICAgIElQUFJUWS0gc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgICAgIHBybW1zZyAtIDgtYnl0ZXMgb2YgZGF0YSB0byBiZSBwbGFjZWQgaW50byBwYXJhbWV0ZXIgbGlzdAotICogT3V0cHV0OiBtc2dpZCAtIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqIFJldHVybjogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIENQCi0qLwotaW50Ci1pdWN2X3NlbmRfcHJtbXNnIChfX3UxNiBwYXRoaWQsCi0JCSAgX191MzIgKiBtc2dpZCwKLQkJICBfX3UzMiB0cmdjbHMsCi0JCSAgX191MzIgc3JjY2xzLCBfX3UzMiBtc2d0YWcsIGludCBmbGFnczEsIF9fdTggcHJtbXNnWzhdKQotewotCWlwYXJtbF9kcGwgKnBhcm07Ci0JdWxvbmcgYjJmMF9yZXN1bHQ7Ci0KLQlpdWN2X2RlYnVnKDIsICJlbnRlcmluZyIpOwotCi0JcGFybSA9IChpcGFybWxfZHBsICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXB0cmdjbHMgPSB0cmdjbHM7Ci0JcGFybS0+aXBzcmNjbHMgPSBzcmNjbHM7Ci0JcGFybS0+aXBtc2d0YWcgPSBtc2d0YWc7Ci0JcGFybS0+aXBmbGFnczEgPSAoSVBSTURBVEEgfCBJUE5PUlBZIHwgZmxhZ3MxKTsKLQltZW1jcHkocGFybS0+aXBybW1zZywgcHJtbXNnLCBzaXplb2YocGFybS0+aXBybW1zZykpOwotCi0JYjJmMF9yZXN1bHQgPSBiMmYwKFNFTkQsIHBhcm0pOwotCi0JaWYgKCghYjJmMF9yZXN1bHQpICYmIChtc2dpZCkpCi0JCSptc2dpZCA9IHBhcm0tPmlwbXNnaWQ7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMiwgImV4aXRpbmciKTsKLQotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2VuZDJ3YXkKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4KLSAqICAgICAgICAgIERhdGEgdG8gYmUgdHJhbnNtaXR0ZWQgaXMgaW4gYSBidWZmZXIuIFRoZSByZWNlaXZlcgotICogICAgICAgICAgb2YgdGhlIHNlbmQgaXMgZXhwZWN0ZWQgdG8gcmVwbHkgdG8gdGhlIG1lc3NhZ2UgYW5kCi0gKiAgICAgICAgICBhIGJ1ZmZlciBpcyBwcm92aWRlZCBpbnRvIHdoaWNoIElVQ1YgbW92ZXMgdGhlIHJlcGx5Ci0gKiAgICAgICAgICB0byB0aGlzIG1lc3NhZ2UuCi0gKiBJbnB1dDogcGF0aGlkIC0gcGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICB0cmdjbHMgLSBzcGVjaWZpZXMgdGFyZ2V0IGNsYXNzCi0gKiAgICAgICAgc3JjY2xzIC0gc3BlY2lmaWVzIHRoZSBzb3VyY2UgbWVzc2FnZSBjbGFzcwotICogICAgICAgIG1zZ3RhZyAtIHNwZWNpZmllcyBhIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UKLSAqICAgICAgICBmbGFnczEgLSBvcHRpb24gZm9yIHBhdGgKLSAqICAgICAgICAgICAgICAgICBJUFBSVFktIHNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UKLSAqICAgICAgICBidWZmZXIgLSBhZGRyZXNzIG9mIHNlbmQgYnVmZmVyCi0gKiAgICAgICAgYnVmbGVuIC0gbGVuZ3RoIG9mIHNlbmQgYnVmZmVyCi0gKiAgICAgICAgYW5zYnVmIC0gYWRkcmVzcyBvZiBidWZmZXIgdG8gcmVwbHkgd2l0aAotICogICAgICAgIGFuc2xlbiAtIGxlbmd0aCBvZiBidWZmZXIgdG8gcmVwbHkgd2l0aAotICogT3V0cHV0OiBtc2dpZCAtIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqIFJldHVybjogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIENQCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIGJ1ZmZlciBvciBhbnNidWYgYWRkcmVzcyBpcyBOVUxMCi0gKi8KLWludAotaXVjdl9zZW5kMndheSAoX191MTYgcGF0aGlkLAotCSAgICAgICBfX3UzMiAqIG1zZ2lkLAotCSAgICAgICBfX3UzMiB0cmdjbHMsCi0JICAgICAgIF9fdTMyIHNyY2NscywKLQkgICAgICAgX191MzIgbXNndGFnLAotCSAgICAgICBpbnQgZmxhZ3MxLAotCSAgICAgICB2b2lkICpidWZmZXIsIHVsb25nIGJ1Zmxlbiwgdm9pZCAqYW5zYnVmLCB1bG9uZyBhbnNsZW4pCi17Ci0JaXBhcm1sX2RiICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0OwotCi0JaXVjdl9kZWJ1ZygyLCAiZW50ZXJpbmciKTsKLQotCWlmICghYnVmZmVyIHx8ICFhbnNidWYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGFybSA9IChpcGFybWxfZGIgKilncmFiX3BhcmFtKCk7Ci0KLQlwYXJtLT5pcHBhdGhpZCA9IHBhdGhpZDsKLQlwYXJtLT5pcHRyZ2NscyA9IHRyZ2NsczsKLQlwYXJtLT5pcGJmYWRyMSA9IChfX3UzMikgKCh1bG9uZykgYnVmZmVyKTsKLQlwYXJtLT5pcGJmbG4xZiA9IChfX3UzMikgYnVmbGVuOwkvKiBsZW5ndGggb2YgbWVzc2FnZSAqLwotCXBhcm0tPmlwYmZhZHIyID0gKF9fdTMyKSAoKHVsb25nKSBhbnNidWYpOwotCXBhcm0tPmlwYmZsbjJmID0gKF9fdTMyKSBhbnNsZW47Ci0JcGFybS0+aXBzcmNjbHMgPSBzcmNjbHM7Ci0JcGFybS0+aXBtc2d0YWcgPSBtc2d0YWc7Ci0JcGFybS0+aXBmbGFnczEgPSBmbGFnczE7CS8qIHByaW9yaXR5IG1lc3NhZ2UgKi8KLQotCWIyZjBfcmVzdWx0ID0gYjJmMChTRU5ELCBwYXJtKTsKLQotCWlmICgoIWIyZjBfcmVzdWx0KSAmJiAobXNnaWQpKQotCQkqbXNnaWQgPSBwYXJtLT5pcG1zZ2lkOwotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpdWN2X2RlYnVnKDIsICJleGl0aW5nIik7Ci0KLQlyZXR1cm4gYjJmMF9yZXN1bHQ7Ci19Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NlbmQyd2F5X2FycmF5Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uCi0gKiAgICAgICAgICBUaGUgY29udGVudHMgb2YgYnVmZmVyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheSBvZgotICogICAgICAgICAgYWRkcmVzc2VzIGFuZCBsZW5ndGhzIG9mIGRpc2NvbnRpZ3VvdXMgYnVmZmVycyB0aGF0IGhvbGQKLSAqICAgICAgICAgIHRoZSBtZXNzYWdlIHRleHQuIFRoZSByZWNlaXZlciBvZiB0aGUgc2VuZCBpcyBleHBlY3RlZCB0bwotICogICAgICAgICAgcmVwbHkgdG8gdGhlIG1lc3NhZ2UgYW5kIGEgYnVmZmVyIGlzIHByb3ZpZGVkIGludG8gd2hpY2gKLSAqICAgICAgICAgIElVQ1YgbW92ZXMgdGhlIHJlcGx5IHRvIHRoaXMgbWVzc2FnZS4KLSAqIElucHV0OiBwYXRoaWQgLSBwYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlcgotICogICAgICAgIHRyZ2NscyAtIHNwZWNpZmllcyB0YXJnZXQgY2xhc3MKLSAqICAgICAgICBzcmNjbHMgLSBzcGVjaWZpZXMgdGhlIHNvdXJjZSBtZXNzYWdlIGNsYXNzCi0gKiAgICAgICAgbXNndGFnIC0gc3BjaWZpZXMgYSB0YWcgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlCi0gKiAgICAgICAgZmxhZ3MxIC0gb3B0aW9uIGZvciBwYXRoCi0gKiAgICAgICAgICAgICAgICAgSVBQUlRZLSBzcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlCi0gKiAgICAgICAgYnVmZmVyIC0gYWRkcmVzcyBvZiBhcnJheSBvZiBzZW5kIGJ1ZmZlcnMKLSAqICAgICAgICBidWZsZW4gLSB0b3RhbCBsZW5ndGggb2Ygc2VuZCBidWZmZXJzCi0gKiAgICAgICAgYW5zYnVmIC0gYWRkcmVzcyBvZiBidWZmZXIgdG8gcmVwbHkgd2l0aAotICogICAgICAgIGFuc2xlbiAtIGxlbmd0aCBvZiBidWZmZXIgdG8gcmVwbHkgd2l0aAotICogT3V0cHV0OiBtc2dpZCAtIHNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqIFJldHVybjogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIENQCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIGJ1ZmZlciBhZGRyZXNzIGlzIE5VTEwKLSAqLwotaW50Ci1pdWN2X3NlbmQyd2F5X2FycmF5IChfX3UxNiBwYXRoaWQsCi0JCSAgICAgX191MzIgKiBtc2dpZCwKLQkJICAgICBfX3UzMiB0cmdjbHMsCi0JCSAgICAgX191MzIgc3JjY2xzLAotCQkgICAgIF9fdTMyIG1zZ3RhZywKLQkJICAgICBpbnQgZmxhZ3MxLAotCQkgICAgIGl1Y3ZfYXJyYXlfdCAqIGJ1ZmZlciwKLQkJICAgICB1bG9uZyBidWZsZW4sIGl1Y3ZfYXJyYXlfdCAqIGFuc2J1ZiwgdWxvbmcgYW5zbGVuKQotewotCWlwYXJtbF9kYiAqcGFybTsKLQl1bG9uZyBiMmYwX3Jlc3VsdDsKLQotCWl1Y3ZfZGVidWcoMiwgImVudGVyaW5nIik7Ci0KLQlpZiAoIWJ1ZmZlciB8fCAhYW5zYnVmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcm0gPSAoaXBhcm1sX2RiICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXB0cmdjbHMgPSB0cmdjbHM7Ci0JcGFybS0+aXBiZmFkcjEgPSAoX191MzIpICgodWxvbmcpIGJ1ZmZlcik7Ci0JcGFybS0+aXBiZmxuMWYgPSAoX191MzIpIGJ1ZmxlbjsJLyogbGVuZ3RoIG9mIG1lc3NhZ2UgKi8KLQlwYXJtLT5pcGJmYWRyMiA9IChfX3UzMikgKCh1bG9uZykgYW5zYnVmKTsKLQlwYXJtLT5pcGJmbG4yZiA9IChfX3UzMikgYW5zbGVuOwotCXBhcm0tPmlwc3JjY2xzID0gc3JjY2xzOwotCXBhcm0tPmlwbXNndGFnID0gbXNndGFnOwotCXBhcm0tPmlwZmxhZ3MxID0gKElQQlVGTFNUIHwgSVBBTlNMU1QgfCBmbGFnczEpOwotCWIyZjBfcmVzdWx0ID0gYjJmMChTRU5ELCBwYXJtKTsKLQlpZiAoKCFiMmYwX3Jlc3VsdCkgJiYgKG1zZ2lkKSkKLQkJKm1zZ2lkID0gcGFybS0+aXBtc2dpZDsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygyLCAiZXhpdGluZyIpOwotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2VuZDJ3YXlfcHJtbXNnCi0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uCi0gKiAgICAgICAgICBQcm1tc2cgc3BlY2lmaWVzIHRoYXQgdGhlIDgtYnl0ZXMgb2YgZGF0YSBhcmUgdG8gYmUgbW92ZWQKLSAqICAgICAgICAgIGludG8gdGhlIHBhcmFtZXRlciBsaXN0LiBUaGlzIGlzIGEgdHdvLXdheSBtZXNzYWdlIGFuZCB0aGUKLSAqICAgICAgICAgIHJlY2VpdmVyIG9mIHRoZSBtZXNzYWdlIGlzIGV4cGVjdGVkIHRvIHJlcGx5LiBBIGJ1ZmZlcgotICogICAgICAgICAgaXMgcHJvdmlkZWQgaW50byB3aGljaCBJVUNWIG1vdmVzIHRoZSByZXBseSB0byB0aGlzCi0gKiAgICAgICAgICBtZXNzYWdlLgotICogSW5wdXQ6IHBhdGhpZCAtIHBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyCi0gKiAgICAgICAgdHJnY2xzIC0gc3BlY2lmaWVzIHRhcmdldCBjbGFzcwotICogICAgICAgIHNyY2NscyAtIHNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MKLSAqICAgICAgICBtc2d0YWcgLSBzcGVjaWZpZXMgYSB0YWcgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlCi0gKiAgICAgICAgZmxhZ3MxIC0gb3B0aW9uIGZvciBwYXRoCi0gKiAgICAgICAgICAgICAgICAgSVBQUlRZLSBzcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlCi0gKiAgICAgICAgcHJtbXNnIC0gOC1ieXRlcyBvZiBkYXRhIHRvIGJlIHBsYWNlZCBpbiBwYXJhbWV0ZXIgbGlzdAotICogICAgICAgIGFuc2J1ZiAtIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIHJlcGx5IHdpdGgKLSAqICAgICAgICBhbnNsZW4gLSBsZW5ndGggb2YgYnVmZmVyIHRvIHJlcGx5IHdpdGgKLSAqIE91dHB1dDogbXNnaWQgLSBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBSZXR1cm46IGIyZjBfcmVzdWx0IC0gcmV0dXJuIGNvZGUgZnJvbSBDUAotICogICAgICAgICAoLUVJTlZBTCkgLSBidWZmZXIgYWRkcmVzcyBpcyBOVUxMCi0qLwotaW50Ci1pdWN2X3NlbmQyd2F5X3BybW1zZyAoX191MTYgcGF0aGlkLAotCQkgICAgICBfX3UzMiAqIG1zZ2lkLAotCQkgICAgICBfX3UzMiB0cmdjbHMsCi0JCSAgICAgIF9fdTMyIHNyY2NscywKLQkJICAgICAgX191MzIgbXNndGFnLAotCQkgICAgICB1bG9uZyBmbGFnczEsIF9fdTggcHJtbXNnWzhdLCB2b2lkICphbnNidWYsIHVsb25nIGFuc2xlbikKLXsKLQlpcGFybWxfZHBsICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0OwotCi0JaXVjdl9kZWJ1ZygyLCAiZW50ZXJpbmciKTsKLQotCWlmICghYW5zYnVmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcm0gPSAoaXBhcm1sX2RwbCAqKWdyYWJfcGFyYW0oKTsKLQotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCXBhcm0tPmlwdHJnY2xzID0gdHJnY2xzOwotCXBhcm0tPmlwc3JjY2xzID0gc3JjY2xzOwotCXBhcm0tPmlwbXNndGFnID0gbXNndGFnOwotCXBhcm0tPmlwYmZhZHIyID0gKF9fdTMyKSAoKHVsb25nKSBhbnNidWYpOwotCXBhcm0tPmlwYmZsbjJmID0gKF9fdTMyKSBhbnNsZW47Ci0JcGFybS0+aXBmbGFnczEgPSAoSVBSTURBVEEgfCBmbGFnczEpOwkvKiBtZXNzYWdlIGluIHBybWxpc3QgKi8KLQltZW1jcHkocGFybS0+aXBybW1zZywgcHJtbXNnLCBzaXplb2YocGFybS0+aXBybW1zZykpOwotCi0JYjJmMF9yZXN1bHQgPSBiMmYwKFNFTkQsIHBhcm0pOwotCi0JaWYgKCghYjJmMF9yZXN1bHQpICYmIChtc2dpZCkpCi0JCSptc2dpZCA9IHBhcm0tPmlwbXNnaWQ7Ci0JcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotCWl1Y3ZfZGVidWcoMiwgImV4aXRpbmciKTsKLQotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2VuZDJ3YXlfcHJtbXNnX2FycmF5Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uCi0gKiAgICAgICAgICBQcm1tc2cgc3BlY2lmaWVzIHRoYXQgdGhlIDgtYnl0ZXMgb2YgZGF0YSBhcmUgdG8gYmUgbW92ZWQKLSAqICAgICAgICAgIGludG8gdGhlIHBhcmFtZXRlciBsaXN0LiBUaGlzIGlzIGEgdHdvLXdheSBtZXNzYWdlIGFuZCB0aGUKLSAqICAgICAgICAgIHJlY2VpdmVyIG9mIHRoZSBtZXNzYWdlIGlzIGV4cGVjdGVkIHRvIHJlcGx5LiBBIGJ1ZmZlcgotICogICAgICAgICAgaXMgcHJvdmlkZWQgaW50byB3aGljaCBJVUNWIG1vdmVzIHRoZSByZXBseSB0byB0aGlzCi0gKiAgICAgICAgICBtZXNzYWdlLiBUaGUgY29udGVudHMgb2YgYW5zYnVmIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICogICAgICAgICAgYXJyYXkgb2YgYWRkcmVzc2VzIGFuZCBsZW5ndGhzIG9mIGRpc2NvbnRpZ3VvdXMgYnVmZmVycwotICogICAgICAgICAgdGhhdCBjb250YWluIHRoZSByZXBseS4KLSAqIElucHV0OiBwYXRoaWQgLSBwYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlcgotICogICAgICAgIHRyZ2NscyAtIHNwZWNpZmllcyB0YXJnZXQgY2xhc3MKLSAqICAgICAgICBzcmNjbHMgLSBzcGVjaWZpZXMgdGhlIHNvdXJjZSBtZXNzYWdlIGNsYXNzCi0gKiAgICAgICAgbXNndGFnIC0gc3BlY2lmaWVzIGEgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZQotICogICAgICAgIGZsYWdzMSAtIG9wdGlvbiBmb3IgcGF0aAotICogICAgICAgICAgICAgICAgIElQUFJUWS0gc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZQotICogICAgICAgIHBybW1zZyAtIDgtYnl0ZXMgb2YgZGF0YSB0byBiZSBwbGFjZWQgaW50byB0aGUgcGFyYW1ldGVyIGxpc3QKLSAqICAgICAgICBhbnNidWYgLSBhZGRyZXNzIG9mIGJ1ZmZlciB0byByZXBseSB3aXRoCi0gKiAgICAgICAgYW5zbGVuIC0gbGVuZ3RoIG9mIGJ1ZmZlciB0byByZXBseSB3aXRoCi0gKiBPdXRwdXQ6IG1zZ2lkIC0gc3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICogUmV0dXJuOiBiMmYwX3Jlc3VsdCAtIHJldHVybiBjb2RlIGZyb20gQ1AKLSAqICAgICAgICAgKC1FSU5WQUwpIC0gYW5zYnVmIGFkZHJlc3MgaXMgTlVMTAotICovCi1pbnQKLWl1Y3Zfc2VuZDJ3YXlfcHJtbXNnX2FycmF5IChfX3UxNiBwYXRoaWQsCi0JCQkgICAgX191MzIgKiBtc2dpZCwKLQkJCSAgICBfX3UzMiB0cmdjbHMsCi0JCQkgICAgX191MzIgc3JjY2xzLAotCQkJICAgIF9fdTMyIG1zZ3RhZywKLQkJCSAgICBpbnQgZmxhZ3MxLAotCQkJICAgIF9fdTggcHJtbXNnWzhdLAotCQkJICAgIGl1Y3ZfYXJyYXlfdCAqIGFuc2J1ZiwgdWxvbmcgYW5zbGVuKQotewotCWlwYXJtbF9kcGwgKnBhcm07Ci0JdWxvbmcgYjJmMF9yZXN1bHQ7Ci0KLQlpdWN2X2RlYnVnKDIsICJlbnRlcmluZyIpOwotCi0JaWYgKCFhbnNidWYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGFybSA9IChpcGFybWxfZHBsICopZ3JhYl9wYXJhbSgpOwotCi0JcGFybS0+aXBwYXRoaWQgPSBwYXRoaWQ7Ci0JcGFybS0+aXB0cmdjbHMgPSB0cmdjbHM7Ci0JcGFybS0+aXBzcmNjbHMgPSBzcmNjbHM7Ci0JcGFybS0+aXBtc2d0YWcgPSBtc2d0YWc7Ci0JcGFybS0+aXBiZmFkcjIgPSAoX191MzIpICgodWxvbmcpIGFuc2J1Zik7Ci0JcGFybS0+aXBiZmxuMmYgPSAoX191MzIpIGFuc2xlbjsKLQlwYXJtLT5pcGZsYWdzMSA9IChJUFJNREFUQSB8IElQQU5TTFNUIHwgZmxhZ3MxKTsKLQltZW1jcHkocGFybS0+aXBybW1zZywgcHJtbXNnLCBzaXplb2YocGFybS0+aXBybW1zZykpOwotCWIyZjBfcmVzdWx0ID0gYjJmMChTRU5ELCBwYXJtKTsKLQlpZiAoKCFiMmYwX3Jlc3VsdCkgJiYgKG1zZ2lkKSkKLQkJKm1zZ2lkID0gcGFybS0+aXBtc2dpZDsKLQlyZWxlYXNlX3BhcmFtKHBhcm0pOwotCi0JaXVjdl9kZWJ1ZygyLCAiZXhpdGluZyIpOwotCXJldHVybiBiMmYwX3Jlc3VsdDsKLX0KLQotdm9pZAotaXVjdl9zZXRtYXNrX2NwdWlkICh2b2lkICpyZXN1bHQpCi17Ci0gICAgICAgIGlwYXJtbF9zZXRfbWFzayAqcGFybTsKLQotICAgICAgICBpdWN2X2RlYnVnKDEsICJlbnRlcmluZyIpOwotICAgICAgICBwYXJtID0gKGlwYXJtbF9zZXRfbWFzayAqKWdyYWJfcGFyYW0oKTsKLSAgICAgICAgcGFybS0+aXBtYXNrID0gKigoX191OCopcmVzdWx0KTsKLSAgICAgICAgKigodWxvbmcgKilyZXN1bHQpID0gYjJmMChTRVRNQVNLLCBwYXJtKTsKLSAgICAgICAgcmVsZWFzZV9wYXJhbShwYXJtKTsKLQotICAgICAgICBpdWN2X2RlYnVnKDEsICJiMmYwX3Jlc3VsdCA9ICVsZCIsICooKHVsb25nICopcmVzdWx0KSk7Ci0gICAgICAgIGl1Y3ZfZGVidWcoMSwgImV4aXRpbmciKTsKLX0KLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2V0bWFzawotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiBlbmFibGVzIG9yIGRpc2FibGVzIHRoZSBmb2xsb3dpbmcgSVVDVgotICogICAgICAgICAgZXh0ZXJuYWwgaW50ZXJydXB0aW9uczogTm9ucHJpb3JpdHkgYW5kIHByaW9yaXR5IG1lc3NhZ2UKLSAqICAgICAgICAgIGludGVycnVwdHMsIG5vbnByaW9yaXR5IGFuZCBwcmlvcml0eSByZXBseSBpbnRlcnJ1cHRzLgotICogSW5wdXQ6IFNldE1hc2tGbGFnIC0gb3B0aW9ucyBmb3IgaW50ZXJydXB0cwotICogICAgICAgICAgIDB4ODAgLSBOb25wcmlvcml0eV9NZXNzYWdlUGVuZGluZ0ludGVycnVwdHNGbGFnCi0gKiAgICAgICAgICAgMHg0MCAtIFByaW9yaXR5X01lc3NhZ2VQZW5kaW5nSW50ZXJydXB0c0ZsYWcKLSAqICAgICAgICAgICAweDIwIC0gTm9ucHJpb3JpdHlfTWVzc2FnZUNvbXBsZXRpb25JbnRlcnJ1cHRzRmxhZwotICogICAgICAgICAgIDB4MTAgLSBQcmlvcml0eV9NZXNzYWdlQ29tcGxldGlvbkludGVycnVwdHNGbGFnCi0gKiAgICAgICAgICAgMHgwOCAtIElVQ1ZDb250cm9sSW50ZXJydXB0c0ZsYWcKLSAqIE91dHB1dDogTkEKLSAqIFJldHVybjogYjJmMF9yZXN1bHQgLSByZXR1cm4gY29kZSBmcm9tIENQCi0qLwotaW50Ci1pdWN2X3NldG1hc2sgKGludCBTZXRNYXNrRmxhZykKLXsKLQl1bmlvbiB7Ci0JCXVsb25nIHJlc3VsdDsKLQkJX191OCAgcGFyYW07Ci0JfSB1OwotCWludCBjcHU7Ci0KLQl1LnBhcmFtID0gU2V0TWFza0ZsYWc7Ci0JY3B1ID0gZ2V0X2NwdSgpOwotCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3Zfc2V0bWFza19jcHVpZCwgJnUsIDAsIDEsIGl1Y3ZfY3B1aWQpOwotCXB1dF9jcHUoKTsKLQotCXJldHVybiB1LnJlc3VsdDsKLX0KLQotLyoqCi0gKiBpdWN2X3NldmVyOgotICogQHBhdGhpZDogICAgUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqIEB1c2VyX2RhdGE6IDE2LWJ5dGUgb2YgdXNlciBkYXRhCi0gKgotICogVGhpcyBmdW5jdGlvbiB0ZXJtaW5hdGVzIGFuIGl1Y3YgcGF0aC4KLSAqIFJldHVybnM6IHJldHVybiBjb2RlIGZyb20gQ1AKLSAqLwotaW50Ci1pdWN2X3NldmVyKF9fdTE2IHBhdGhpZCwgX191OCB1c2VyX2RhdGFbMTZdKQotewotCWlwYXJtbF9jb250cm9sICpwYXJtOwotCXVsb25nIGIyZjBfcmVzdWx0ID0gMDsKLQotCWl1Y3ZfZGVidWcoMSwgImVudGVyaW5nIik7Ci0JcGFybSA9IChpcGFybWxfY29udHJvbCAqKWdyYWJfcGFyYW0oKTsKLQotCW1lbWNweShwYXJtLT5pcHVzZXIsIHVzZXJfZGF0YSwgc2l6ZW9mKHBhcm0tPmlwdXNlcikpOwotCXBhcm0tPmlwcGF0aGlkID0gcGF0aGlkOwotCi0JYjJmMF9yZXN1bHQgPSBiMmYwKFNFVkVSLCBwYXJtKTsKLQotCWlmICghYjJmMF9yZXN1bHQpCi0JCWl1Y3ZfcmVtb3ZlX3BhdGhpZChwYXRoaWQpOwotCXJlbGVhc2VfcGFyYW0ocGFybSk7Ci0KLQlpdWN2X2RlYnVnKDEsICJleGl0aW5nIik7Ci0JcmV0dXJuIGIyZjBfcmVzdWx0OwotfQotCi0vKgotICogSW50ZXJydXB0IEhhbmRsZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBpdWN2X2lycV9oYW5kbGVyOgotICogQHJlZ3M6IEN1cnJlbnQgcmVnaXN0ZXJzCi0gKiBAY29kZTogaXJxIGNvZGUKLSAqCi0gKiBIYW5kbGVzIGV4dGVybmFsIGludGVycnVwdHMgY29taW5nIGluIGZyb20gQ1AuCi0gKiBQbGFjZXMgdGhlIGludGVycnVwdCBidWZmZXIgb24gYSBxdWV1ZSBhbmQgc2NoZWR1bGVzIGl1Y3ZfdGFza2xldF9oYW5kbGVyKCkuCi0gKi8KLXN0YXRpYyB2b2lkCi1pdWN2X2lycV9oYW5kbGVyKF9fdTE2IGNvZGUpCi17Ci0JaXVjdl9pcnFkYXRhICppcnFkYXRhOwotCi0JaXJxZGF0YSA9IGttYWxsb2Moc2l6ZW9mKGl1Y3ZfaXJxZGF0YSksIEdGUF9BVE9NSUMpOwotCWlmICghaXJxZGF0YSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuOwotCX0KLQotCW1lbWNweSgmaXJxZGF0YS0+ZGF0YSwgaXVjdl9leHRlcm5hbF9pbnRfYnVmZmVyLAotCSAgICAgICBzaXplb2YoaXVjdl9HZW5lcmFsSW50ZXJydXB0KSk7Ci0KLQlzcGluX2xvY2soJml1Y3ZfaXJxX3F1ZXVlX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJmlycWRhdGEtPnF1ZXVlLCAmaXVjdl9pcnFfcXVldWUpOwotCXNwaW5fdW5sb2NrKCZpdWN2X2lycV9xdWV1ZV9sb2NrKTsKLQotCXRhc2tsZXRfc2NoZWR1bGUoJml1Y3ZfdGFza2xldCk7Ci19Ci0KLS8qKgotICogaXVjdl9kb19pbnQ6Ci0gKiBAaW50X2J1ZjogUG9pbnRlciB0byBjb3B5IG9mIGV4dGVybmFsIGludGVycnVwdCBidWZmZXIKLSAqCi0gKiBUaGUgd29ya2hvcnNlIGZvciBoYW5kbGluZyBpbnRlcnJ1cHRzIHF1ZXVlZCBieSBpdWN2X2lycV9oYW5kbGVyKCkuCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBib3R0b20gaGFsZiBpdWN2X3Rhc2tsZXRfaGFuZGxlcigpLgotICovCi1zdGF0aWMgdm9pZAotaXVjdl9kb19pbnQoaXVjdl9HZW5lcmFsSW50ZXJydXB0ICogaW50X2J1ZikKLXsKLQloYW5kbGVyICpoID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKLQl1bG9uZyBmbGFnczsKLQlpdWN2X2ludGVycnVwdF9vcHNfdCAqaW50ZXJydXB0ID0gTlVMTDsJLyogaW50ZXJydXB0IGFkZHJlc3NlcyAqLwotCV9fdTggdGVtcF9idWZmMVsyNF0sIHRlbXBfYnVmZjJbMjRdOwkvKiBtYXNrZWQgaGFuZGxlciBpZC4gKi8KLQlpbnQgcmMgPSAwLCBqID0gMDsKLQlfX3U4IG5vX2xpc3RlbmVyWzE2XSA9ICJOTyBMSVNURU5FUiI7Ci0KLQlpdWN2X2RlYnVnKDIsICJlbnRlcmluZywgcGF0aGlkICVkLCB0eXBlICUwMlgiLAotCQkgaW50X2J1Zi0+aXBwYXRoaWQsIGludF9idWYtPmlwdHlwZSk7Ci0JaXVjdl9kdW1waXQoIkV4dGVybmFsIEludGVycnVwdCBCdWZmZXI6IiwKLQkJICAgIGludF9idWYsIHNpemVvZihpdWN2X0dlbmVyYWxJbnRlcnJ1cHQpKTsKLQotCUFTQ0VCQyAobm9fbGlzdGVuZXIsIDE2KTsKLQotCWlmIChpbnRfYnVmLT5pcHR5cGUgIT0gMDEpIHsKLQkJaWYgKChpbnRfYnVmLT5pcHBhdGhpZCkgPiAobWF4X2Nvbm5lY3Rpb25zIC0gMSkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBHb3QgaW50ZXJydXB0IHdpdGggcGF0aGlkICVkIgotCQkJICAgICAgICIgPiBtYXhfY29ubmVjdGlvbnMgKCVsZClcbiIsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgICBpbnRfYnVmLT5pcHBhdGhpZCwgbWF4X2Nvbm5lY3Rpb25zIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQloID0gaXVjdl9wYXRoaWRfdGFibGVbaW50X2J1Zi0+aXBwYXRoaWRdOwotCQkJaW50ZXJydXB0ID0gaC0+aW50ZXJydXB0X3RhYmxlOwotCQkJaXVjdl9kdW1waXQoIkhhbmRsZXI6IiwgaCwgc2l6ZW9mKGhhbmRsZXIpKTsKLQkJfQotCX0KLQotCS8qIGVuZCBvZiBpZiBzdGF0ZW1lbnQgKi8KLQlzd2l0Y2ggKGludF9idWYtPmlwdHlwZSkgewotCQljYXNlIDB4MDE6CQkvKiBjb25uZWN0aW9uIHBlbmRpbmcgKi8KLQkJCWlmIChtZXNzYWdlc0Rpc2FibGVkKSB7Ci0JCQkgICAgaXVjdl9zZXRtYXNrKH4wKTsKLQkJCSAgICBtZXNzYWdlc0Rpc2FibGVkID0gMDsKLQkJCX0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQkJCWxpc3RfZm9yX2VhY2gobGgsICZpdWN2X2hhbmRsZXJfdGFibGUpIHsKLQkJCQloID0gbGlzdF9lbnRyeShsaCwgaGFuZGxlciwgbGlzdCk7Ci0JCQkJbWVtY3B5KHRlbXBfYnVmZjEsICYoaW50X2J1Zi0+aXB2bWlkKSwgMjQpOwotCQkJCW1lbWNweSh0ZW1wX2J1ZmYyLCAmKGgtPmlkLnVzZXJpZCksIDI0KTsKLQkJCQlmb3IgKGogPSAwOyBqIDwgMjQ7IGorKykgewotCQkJCQl0ZW1wX2J1ZmYxW2pdICY9IChoLT5pZC5tYXNrKVtqXTsKLQkJCQkJdGVtcF9idWZmMltqXSAmPSAoaC0+aWQubWFzaylbal07Ci0JCQkJfQotCi0JCQkJaXVjdl9kdW1waXQoInRlbXBfYnVmZjE6IiwKLQkJCQkJICAgIHRlbXBfYnVmZjEsIHNpemVvZih0ZW1wX2J1ZmYxKSk7Ci0JCQkJaXVjdl9kdW1waXQoInRlbXBfYnVmZjIiLAotCQkJCQkgICAgdGVtcF9idWZmMiwgc2l6ZW9mKHRlbXBfYnVmZjIpKTsKLQotCQkJCWlmICghbWVtY21wICh0ZW1wX2J1ZmYxLCB0ZW1wX2J1ZmYyLCAyNCkpIHsKLQotCQkJCQlpdWN2X2RlYnVnKDIsCi0JCQkJCQkgICAiZm91bmQgYSBtYXRjaGluZyBoYW5kbGVyIik7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZQotCQkJCQloID0gTlVMTDsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZpdWN2X2xvY2ssIGZsYWdzKTsKLQkJCWlmIChoKSB7Ci0JCQkJLyogQUREIFBBVEggVE8gUEFUSElEIFRBQkxFICovCi0JCQkJcmMgPSBpdWN2X2FkZF9wYXRoaWQoaW50X2J1Zi0+aXBwYXRoaWQsIGgpOwotCQkJCWlmIChyYykgewotCQkJCQlpdWN2X3NldmVyIChpbnRfYnVmLT5pcHBhdGhpZCwKLQkJCQkJCSAgICBub19saXN0ZW5lcik7Ci0JCQkJCWl1Y3ZfZGVidWcoMSwKLQkJCQkJCSAgICJhZGRfcGF0aGlkIGZhaWxlZCwgcmMgPSAlZCIsCi0JCQkJCQkgICByYyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW50ZXJydXB0ID0gaC0+aW50ZXJydXB0X3RhYmxlOwotCQkJCQlpZiAoaW50ZXJydXB0LT5Db25uZWN0aW9uUGVuZGluZykgewotCQkJCQkJRUJDQVNDIChpbnRfYnVmLT5pcHZtaWQsIDgpOwotCQkJCQkJaW50ZXJydXB0LT5Db25uZWN0aW9uUGVuZGluZygKLQkJCQkJCQkoaXVjdl9Db25uZWN0aW9uUGVuZGluZyAqKWludF9idWYsCi0JCQkJCQkJaC0+cGdtX2RhdGEpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWl1Y3Zfc2V2ZXIoaW50X2J1Zi0+aXBwYXRoaWQsCi0JCQkJCQkJICAgbm9fbGlzdGVuZXIpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWl1Y3Zfc2V2ZXIoaW50X2J1Zi0+aXBwYXRoaWQsIG5vX2xpc3RlbmVyKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMHgwMjoJCS8qY29ubmVjdGlvbiBjb21wbGV0ZSAqLwotCQkJaWYgKG1lc3NhZ2VzRGlzYWJsZWQpIHsKLQkJCSAgICBpdWN2X3NldG1hc2sofjApOwotCQkJICAgIG1lc3NhZ2VzRGlzYWJsZWQgPSAwOwotCQkJfQotCQkJaWYgKGgpIHsKLQkJCQlpZiAoaW50ZXJydXB0LT5Db25uZWN0aW9uQ29tcGxldGUpCi0JCQkJewotCQkJCQlpbnRlcnJ1cHQtPkNvbm5lY3Rpb25Db21wbGV0ZSgKLQkJCQkJCShpdWN2X0Nvbm5lY3Rpb25Db21wbGV0ZSAqKWludF9idWYsCi0JCQkJCQloLT5wZ21fZGF0YSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJaXVjdl9kZWJ1ZygxLAotCQkJCQkJICAgIkNvbm5lY3Rpb25Db21wbGV0ZSBub3QgY2FsbGVkIik7Ci0JCQl9IGVsc2UKLQkJCQlpdWN2X3NldmVyKGludF9idWYtPmlwcGF0aGlkLCBub19saXN0ZW5lcik7Ci0JCQlicmVhazsKLQotCQljYXNlIDB4MDM6CQkvKiBjb25uZWN0aW9uIHNldmVyZWQgKi8KLQkJCWlmIChtZXNzYWdlc0Rpc2FibGVkKSB7Ci0JCQkgICAgaXVjdl9zZXRtYXNrKH4wKTsKLQkJCSAgICBtZXNzYWdlc0Rpc2FibGVkID0gMDsKLQkJCX0KLQkJCWlmIChoKSB7Ci0JCQkJaWYgKGludGVycnVwdC0+Q29ubmVjdGlvblNldmVyZWQpCi0JCQkJCWludGVycnVwdC0+Q29ubmVjdGlvblNldmVyZWQoCi0JCQkJCQkoaXVjdl9Db25uZWN0aW9uU2V2ZXJlZCAqKWludF9idWYsCi0JCQkJCQloLT5wZ21fZGF0YSk7Ci0KLQkJCQllbHNlCi0JCQkJCWl1Y3Zfc2V2ZXIgKGludF9idWYtPmlwcGF0aGlkLCBub19saXN0ZW5lcik7Ci0JCQl9IGVsc2UKLQkJCQlpdWN2X3NldmVyKGludF9idWYtPmlwcGF0aGlkLCBub19saXN0ZW5lcik7Ci0JCQlicmVhazsKLQotCQljYXNlIDB4MDQ6CQkvKiBjb25uZWN0aW9uIHF1aWVzY2VkICovCi0JCQlpZiAobWVzc2FnZXNEaXNhYmxlZCkgewotCQkJICAgIGl1Y3Zfc2V0bWFzayh+MCk7Ci0JCQkgICAgbWVzc2FnZXNEaXNhYmxlZCA9IDA7Ci0JCQl9Ci0JCQlpZiAoaCkgewotCQkJCWlmIChpbnRlcnJ1cHQtPkNvbm5lY3Rpb25RdWllc2NlZCkKLQkJCQkJaW50ZXJydXB0LT5Db25uZWN0aW9uUXVpZXNjZWQoCi0JCQkJCQkoaXVjdl9Db25uZWN0aW9uUXVpZXNjZWQgKilpbnRfYnVmLAotCQkJCQkJaC0+cGdtX2RhdGEpOwotCQkJCWVsc2UKLQkJCQkJaXVjdl9kZWJ1ZygxLAotCQkJCQkJICAgIkNvbm5lY3Rpb25RdWllc2NlZCBub3QgY2FsbGVkIik7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIDB4MDU6CQkvKiBjb25uZWN0aW9uIHJlc3VtZWQgKi8KLQkJCWlmIChtZXNzYWdlc0Rpc2FibGVkKSB7Ci0JCQkgICAgaXVjdl9zZXRtYXNrKH4wKTsKLQkJCSAgICBtZXNzYWdlc0Rpc2FibGVkID0gMDsKLQkJCX0KLQkJCWlmIChoKSB7Ci0JCQkJaWYgKGludGVycnVwdC0+Q29ubmVjdGlvblJlc3VtZWQpCi0JCQkJCWludGVycnVwdC0+Q29ubmVjdGlvblJlc3VtZWQoCi0JCQkJCQkoaXVjdl9Db25uZWN0aW9uUmVzdW1lZCAqKWludF9idWYsCi0JCQkJCQloLT5wZ21fZGF0YSk7Ci0JCQkJZWxzZQotCQkJCQlpdWN2X2RlYnVnKDEsCi0JCQkJCQkgICAiQ29ubmVjdGlvblJlc3VtZWQgbm90IGNhbGxlZCIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAweDA2OgkJLyogcHJpb3JpdHkgbWVzc2FnZSBjb21wbGV0ZSAqLwotCQljYXNlIDB4MDc6CQkvKiBub25wcmlvcml0eSBtZXNzYWdlIGNvbXBsZXRlICovCi0JCQlpZiAoaCkgewotCQkJCWlmIChpbnRlcnJ1cHQtPk1lc3NhZ2VDb21wbGV0ZSkKLQkJCQkJaW50ZXJydXB0LT5NZXNzYWdlQ29tcGxldGUoCi0JCQkJCQkoaXVjdl9NZXNzYWdlQ29tcGxldGUgKilpbnRfYnVmLAotCQkJCQkJaC0+cGdtX2RhdGEpOwotCQkJCWVsc2UKLQkJCQkJaXVjdl9kZWJ1ZygyLAotCQkJCQkJICAgIk1lc3NhZ2VDb21wbGV0ZSBub3QgY2FsbGVkIik7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIDB4MDg6CQkvKiBwcmlvcml0eSBtZXNzYWdlIHBlbmRpbmcgICovCi0JCWNhc2UgMHgwOToJCS8qIG5vbnByaW9yaXR5IG1lc3NhZ2UgcGVuZGluZyAgKi8KLQkJCWlmIChoKSB7Ci0JCQkJaWYgKGludGVycnVwdC0+TWVzc2FnZVBlbmRpbmcpCi0JCQkJCWludGVycnVwdC0+TWVzc2FnZVBlbmRpbmcoCi0JCQkJCQkoaXVjdl9NZXNzYWdlUGVuZGluZyAqKSBpbnRfYnVmLAotCQkJCQkJaC0+cGdtX2RhdGEpOwotCQkJCWVsc2UKLQkJCQkJaXVjdl9kZWJ1ZygyLAotCQkJCQkJICAgIk1lc3NhZ2VQZW5kaW5nIG5vdCBjYWxsZWQiKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgkJLyogdW5rbm93biBpdWN2IHR5cGUgKi8KLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmtub3duIGl1Y3YgaW50ZXJydXB0XG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCQlicmVhazsKLQl9CQkJLyogZW5kIHN3aXRjaCAqLwotCi0JaXVjdl9kZWJ1ZygyLCAiZXhpdGluZyBwYXRoaWQgJWQsIHR5cGUgJTAyWCIsCi0JCSBpbnRfYnVmLT5pcHBhdGhpZCwgaW50X2J1Zi0+aXB0eXBlKTsKLQotCXJldHVybjsKLX0KLQotLyoqCi0gKiBpdWN2X3Rhc2tsZXRfaGFuZGxlcjoKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGxvb3BzIG92ZXIgdGhlIHF1ZXVlIG9mIGlycSBidWZmZXJzIGFuZCBydW5zIGl1Y3ZfZG9faW50KCkKLSAqIG9uIGV2ZXJ5IHF1ZXVlIGVsZW1lbnQuCi0gKi8KLXN0YXRpYyB2b2lkCi1pdWN2X3Rhc2tsZXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGlnbm9yZWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCBoZWFkOwotCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7Ci0JdWxvbmcgIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJml1Y3ZfaXJxX3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZCgmaGVhZCwgJml1Y3ZfaXJxX3F1ZXVlKTsKLQlsaXN0X2RlbF9pbml0KCZpdWN2X2lycV9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJml1Y3ZfaXJxX3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCW5leHQgPSBoZWFkLm5leHQ7Ci0Jd2hpbGUgKG5leHQgIT0gJmhlYWQpIHsKLQkJaXVjdl9pcnFkYXRhICpwID0gbGlzdF9lbnRyeShuZXh0LCBpdWN2X2lycWRhdGEsIHF1ZXVlKTsKLQotCQluZXh0ID0gbmV4dC0+bmV4dDsKLQkJaXVjdl9kb19pbnQoJnAtPmRhdGEpOwotCQlrZnJlZShwKTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLXN1YnN5c19pbml0Y2FsbChpdWN2X2luaXQpOwotbW9kdWxlX2V4aXQoaXVjdl9leGl0KTsKLQotLyoqCi0gKiBFeHBvcnQgYWxsIHB1YmxpYyBzdHVmZgotICovCi1FWFBPUlRfU1lNQk9MIChpdWN2X2J1cyk7Ci1FWFBPUlRfU1lNQk9MIChpdWN2X3Jvb3QpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9hY2NlcHQpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9jb25uZWN0KTsKLSNpZiAwCi1FWFBPUlRfU1lNQk9MIChpdWN2X3B1cmdlKTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3ZfcXVlcnlfbWF4Y29ubik7Ci1FWFBPUlRfU1lNQk9MIChpdWN2X3F1ZXJ5X2J1ZnNpemUpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9xdWllc2NlKTsKLSNlbmRpZgotRVhQT1JUX1NZTUJPTCAoaXVjdl9yZWNlaXZlKTsKLSNpZiAwCi1FWFBPUlRfU1lNQk9MIChpdWN2X3JlY2VpdmVfYXJyYXkpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MIChpdWN2X3JlamVjdCk7Ci0jaWYgMAotRVhQT1JUX1NZTUJPTCAoaXVjdl9yZXBseSk7Ci1FWFBPUlRfU1lNQk9MIChpdWN2X3JlcGx5X2FycmF5KTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3ZfcmVzdW1lKTsKLSNlbmRpZgotRVhQT1JUX1NZTUJPTCAoaXVjdl9yZXBseV9wcm1tc2cpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9zZW5kKTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3Zfc2VuZDJ3YXkpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9zZW5kMndheV9hcnJheSk7Ci1FWFBPUlRfU1lNQk9MIChpdWN2X3NlbmQyd2F5X3BybW1zZyk7Ci1FWFBPUlRfU1lNQk9MIChpdWN2X3NlbmQyd2F5X3BybW1zZ19hcnJheSk7Ci0jaWYgMAotRVhQT1JUX1NZTUJPTCAoaXVjdl9zZW5kX2FycmF5KTsKLUVYUE9SVF9TWU1CT0wgKGl1Y3Zfc2VuZF9wcm1tc2cpOwotRVhQT1JUX1NZTUJPTCAoaXVjdl9zZXRtYXNrKTsKLSNlbmRpZgotRVhQT1JUX1NZTUJPTCAoaXVjdl9zZXZlcik7Ci1FWFBPUlRfU1lNQk9MIChpdWN2X3JlZ2lzdGVyX3Byb2dyYW0pOwotRVhQT1JUX1NZTUJPTCAoaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9pdWN2LmggYi9kcml2ZXJzL3MzOTAvbmV0L2l1Y3YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YjFiNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2l1Y3YuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0OSArMCwwIEBACi0vKgotICogIGRyaXZlcnMvczM5MC9uZXQvaXVjdi5oCi0gKiAgICBJVUNWIGJhc2Ugc3VwcG9ydC4KLSAqCi0gKiAgUzM5MCB2ZXJzaW9uCi0gKiAgICBDb3B5cmlnaHQgKEMpIDIwMDAgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6QWxhbiBBbHRtYXJrIChBbGFuX0FsdG1hcmtAdXMuaWJtLmNvbSkKLSAqCQlYZW5pYSBUa2F0c2Nob3cgKHhlbmlhQHVzLmlibS5jb20pCi0gKgotICoKLSAqIEZ1bmN0aW9uYWxpdHk6Ci0gKiBUbyBleHBsb3JlIGFueSBvZiB0aGUgSVVDViBmdW5jdGlvbnMsIG9uZSBtdXN0IGZpcnN0IHJlZ2lzdGVyCi0gKiB0aGVpciBwcm9ncmFtIHVzaW5nIGl1Y3ZfcmVnaXN0ZXJfcHJvZ3JhbSgpLiBPbmNlIHlvdXIgcHJvZ3JhbSBoYXMKLSAqIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYSByZWdpc3RlciwgaXQgY2FuIGV4cGxvaXQgdGhlIG90aGVyIGZ1bmN0aW9ucy4KLSAqIEZvciBmdXJ0aHVyIHJlZmVyZW5jZSBvbiBhbGwgSVVDViBmdW5jdGlvbmFsaXR5LCByZWZlciB0byB0aGUKLSAqIENQIFByb2dyYW1taW5nIFNlcnZpY2VzIGJvb2ssIGFsc28gYXZhaWxhYmxlIG9uIHRoZSB3ZWIKLSAqIHRocnUgd3d3LmlibS5jb20vczM5MC92bS9wdWJzLCBtYW51YWwgIyBTQzI0LTU3NjAKLSAqCi0gKiAgICAgIERlZmluaXRpb24gb2YgUmV0dXJuIENvZGVzCi0gKiAgICAgIC1BbGwgcG9zaXRpdmUgcmV0dXJuIGNvZGVzIGluY2x1ZGluZyB6ZXJvIGFyZSByZWZsZWN0ZWQgYmFjawotICogICAgICAgZnJvbSBDUCBleGNlcHQgZm9yIGl1Y3ZfcmVnaXN0ZXJfcHJvZ3JhbS4gVGhlIGRlZmluaXRpb24gb2YgZWFjaAotICogICAgICAgcmV0dXJuIGNvZGUgY2FuIGJlIGZvdW5kIGluIENQIFByb2dyYW1taW5nIFNlcnZpY2VzIGJvb2suCi0gKiAgICAgICBBbHNvIGF2YWlsYWJsZSBvbiB0aGUgd2ViIHRocnUgd3d3LmlibS5jb20vczM5MC92bS9wdWJzLCBtYW51YWwgIyBTQzI0LTU3NjAKLSAqICAgICAgLSBSZXR1cm4gQ29kZSBvZjoKLSAqICAgICAgICAgICAgICgtRUlOVkFMKSBJbnZhbGlkIHZhbHVlCi0gKiAgICAgICAgICAgICAoLUVOT01FTSkgc3RvcmFnZSBhbGxvY2F0aW9uIGZhaWxlZAotICoJcGdtYXNrIGRlZmluZWQgaW4gaXVjdl9yZWdpc3Rlcl9wcm9ncmFtIHdpbGwgYmUgc2V0IGRlcGVuZGluZyBvbiBpbnB1dAotICoJcGFyYW10ZXJzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vZGVidWcuaD4KLQotLyoqCi0gKiBEZWJ1ZyBGYWNpbGl0eSBzdHVmZgotICovCi0jZGVmaW5lIElVQ1ZfREJGX1NFVFVQX05BTUUgIml1Y3Zfc2V0dXAiCi0jZGVmaW5lIElVQ1ZfREJGX1NFVFVQX0xFTiAzMgotI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9QQUdFUyAyCi0jZGVmaW5lIElVQ1ZfREJGX1NFVFVQX05SX0FSRUFTIDEKLSNkZWZpbmUgSVVDVl9EQkZfU0VUVVBfTEVWRUwgMwotCi0jZGVmaW5lIElVQ1ZfREJGX0RBVEFfTkFNRSAiaXVjdl9kYXRhIgotI2RlZmluZSBJVUNWX0RCRl9EQVRBX0xFTiAxMjgKLSNkZWZpbmUgSVVDVl9EQkZfREFUQV9QQUdFUyAyCi0jZGVmaW5lIElVQ1ZfREJGX0RBVEFfTlJfQVJFQVMgMQotI2RlZmluZSBJVUNWX0RCRl9EQVRBX0xFVkVMIDIKLQotI2RlZmluZSBJVUNWX0RCRl9UUkFDRV9OQU1FICJpdWN2X3RyYWNlIgotI2RlZmluZSBJVUNWX0RCRl9UUkFDRV9MRU4gMTYKLSNkZWZpbmUgSVVDVl9EQkZfVFJBQ0VfUEFHRVMgNAotI2RlZmluZSBJVUNWX0RCRl9UUkFDRV9OUl9BUkVBUyAxCi0jZGVmaW5lIElVQ1ZfREJGX1RSQUNFX0xFVkVMIDMKLQotI2RlZmluZSBJVUNWX0RCRl9URVhUKG5hbWUsbGV2ZWwsdGV4dCkgXAotCWRvIHsgXAotCQlkZWJ1Z190ZXh0X2V2ZW50KGl1Y3ZfZGJmXyMjbmFtZSxsZXZlbCx0ZXh0KTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgSVVDVl9EQkZfSEVYKG5hbWUsbGV2ZWwsYWRkcixsZW4pIFwKLQlkbyB7IFwKLQkJZGVidWdfZXZlbnQoaXVjdl9kYmZfIyNuYW1lLGxldmVsLCh2b2lkKikoYWRkciksbGVuKTsgXAotCX0gd2hpbGUgKDApCi0KLURFQ0xBUkVfUEVSX0NQVShjaGFyWzI1Nl0sIGl1Y3ZfZGJmX3R4dF9idWYpOwotCi0jZGVmaW5lIElVQ1ZfREJGX1RFWFRfKG5hbWUsbGV2ZWwsdGV4dC4uLikJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJY2hhciogaXVjdl9kYmZfdHh0X2J1ZiA9IGdldF9jcHVfdmFyKGl1Y3ZfZGJmX3R4dF9idWYpOwlcCi0JCXNwcmludGYoaXVjdl9kYmZfdHh0X2J1ZiwgdGV4dCk7CQkgIAlcCi0JCWRlYnVnX3RleHRfZXZlbnQoaXVjdl9kYmZfIyNuYW1lLGxldmVsLGl1Y3ZfZGJmX3R4dF9idWYpOyBcCi0JCXB1dF9jcHVfdmFyKGl1Y3ZfZGJmX3R4dF9idWYpOwkJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBJVUNWX0RCRl9TUFJJTlRGKG5hbWUsbGV2ZWwsdGV4dC4uLikgXAotCWRvIHsgXAotCQlkZWJ1Z19zcHJpbnRmX2V2ZW50KGl1Y3ZfZGJmX3RyYWNlLCBsZXZlbCwgIyN0ZXh0ICk7IFwKLQkJZGVidWdfc3ByaW50Zl9ldmVudChpdWN2X2RiZl90cmFjZSwgbGV2ZWwsIHRleHQgKTsgXAotCX0gd2hpbGUgKDApCi0KLS8qKgotICogc29tZSBtb3JlIGRlYnVnIHN0dWZmCi0gKi8KLSNkZWZpbmUgSVVDVl9IRVhEVU1QMTYoaW1wb3J0YW5jZSxoZWFkZXIscHRyKSBcCi1QUklOVF8jI2ltcG9ydGFuY2UoaGVhZGVyICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAiIFwKLQkJICAgIiUwMnggJTAyeCAlMDJ4ICUwMnggICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIFwKLQkJICAgKigoKGNoYXIqKXB0cikpLCooKChjaGFyKilwdHIpKzEpLCooKChjaGFyKilwdHIpKzIpLCBcCi0JCSAgICooKChjaGFyKilwdHIpKzMpLCooKChjaGFyKilwdHIpKzQpLCooKChjaGFyKilwdHIpKzUpLCBcCi0JCSAgICooKChjaGFyKilwdHIpKzYpLCooKChjaGFyKilwdHIpKzcpLCooKChjaGFyKilwdHIpKzgpLCBcCi0JCSAgICooKChjaGFyKilwdHIpKzkpLCooKChjaGFyKilwdHIpKzEwKSwqKCgoY2hhciopcHRyKSsxMSksIFwKLQkJICAgKigoKGNoYXIqKXB0cikrMTIpLCooKChjaGFyKilwdHIpKzEzKSwgXAotCQkgICAqKCgoY2hhciopcHRyKSsxNCksKigoKGNoYXIqKXB0cikrMTUpKTsgXAotUFJJTlRfIyNpbXBvcnRhbmNlKGhlYWRlciAiJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgIiBcCi0JCSAgICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBcCi0JCSAgICooKChjaGFyKilwdHIpKzE2KSwqKCgoY2hhciopcHRyKSsxNyksIFwKLQkJICAgKigoKGNoYXIqKXB0cikrMTgpLCooKChjaGFyKilwdHIpKzE5KSwgXAotCQkgICAqKCgoY2hhciopcHRyKSsyMCksKigoKGNoYXIqKXB0cikrMjEpLCBcCi0JCSAgICooKChjaGFyKilwdHIpKzIyKSwqKCgoY2hhciopcHRyKSsyMyksIFwKLQkJICAgKigoKGNoYXIqKXB0cikrMjQpLCooKChjaGFyKilwdHIpKzI1KSwgXAotCQkgICAqKCgoY2hhciopcHRyKSsyNiksKigoKGNoYXIqKXB0cikrMjcpLCBcCi0JCSAgICooKChjaGFyKilwdHIpKzI4KSwqKCgoY2hhciopcHRyKSsyOSksIFwKLQkJICAgKigoKGNoYXIqKXB0cikrMzApLCooKChjaGFyKilwdHIpKzMxKSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaXVjdl9oZXhfZHVtcCh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc2l6ZV90IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKGkgJiYgIShpICUgMTYpKQotCQkJcHJpbnRrKCJcbiIpOwotCQlwcmludGsoIiUwMnggIiwgKihidWYgKyBpKSk7Ci0JfQotCXByaW50aygiXG4iKTsKLX0KLS8qKgotICogZW5kIG9mIGRlYnVnIHN0dWZmCi0gKi8KLQotI2RlZmluZSB1Y2hhciAgdW5zaWduZWQgY2hhcgotI2RlZmluZSB1c2hvcnQgdW5zaWduZWQgc2hvcnQKLSNkZWZpbmUgdWxvbmcgIHVuc2lnbmVkIGxvbmcKLSNkZWZpbmUgaXVjdl9oYW5kbGVfdCB2b2lkICoKLQotLyogZmxhZ3MxOgotICogQWxsIGZsYWdzIGFyZSBkZWZpbmVkIGluIHRoZSBmaWVsZCBJUEZMQUdTMSBvZiBlYWNoIGZ1bmN0aW9uCi0gKiBhbmQgY2FuIGJlIGZvdW5kIGluIENQIFByb2dyYW1taW5nIFNlcnZpY2VzLgotICogSVBMT0NBTCAgLSBJbmRpY2F0ZXMgdGhlIGNvbm5lY3QgY2FuIG9ubHkgYmUgc2F0aXNmaWVkIG9uIHRoZQotICogICAgICAgICAgICBsb2NhbCBzeXN0ZW0KLSAqIElQUFJUWSAgIC0gSW5kaWNhdGVzIGEgcHJpb3JpdHkgbWVzc2FnZQotICogSVBRVVNDRSAgLSBJbmRpY2F0ZXMgeW91IGRvIG5vdCB3YW50IHRvIHJlY2VpdmUgbWVzc2FnZXMgb24gYQotICogICAgICAgICAgICBwYXRoIHVudGlsIGFuIGl1Y3ZfcmVzdW1lIGlzIGlzc3VlZAotICogSVBSTURBVEEgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbiB0aGUgcGFyYW1ldGVyIGxpc3QKLSAqLwotI2RlZmluZSBJUExPQ0FMICAgCTB4MDEKLSNkZWZpbmUgSVBQUlRZICAgICAgICAgCTB4MjAKLSNkZWZpbmUgSVBRVVNDRSAgICAgICAgCTB4NDAKLSNkZWZpbmUgSVBSTURBVEEgICAgICAgCTB4ODAKLQotLyogZmxhZ3MxX291dDoKLSAqIEFsbCBmbGFncyBhcmUgZGVmaW5lZCBpbiB0aGUgb3V0cHV0IGZpZWxkIG9mIElQRkxBR1MxIGZvciBlYWNoIGZ1bmN0aW9uCi0gKiBhbmQgY2FuIGJlIGZvdW5kIGluIENQIFByb2dyYW1taW5nIFNlcnZpY2VzLgotICogSVBOT1JQWSAtIFNwZWNpZmllcyB0aGlzIGlzIGEgb25lLXdheSBtZXNzYWdlIGFuZCBubyByZXBseSBpcyBleHBlY3RlZC4KLSAqIElQUFJUWSAgIC0gSW5kaWNhdGVzIGEgcHJpb3JpdHkgbWVzc2FnZSBpcyBwZXJtaXR0ZWQuIERlZmluZWQgaW4gZmxhZ3MxLgotICovCi0jZGVmaW5lIElQTk9SUFkgICAgICAgICAweDEwCi0KLSNkZWZpbmUgTm9ucHJpb3JpdHlfTWVzc2FnZVBlbmRpbmdJbnRlcnJ1cHRzRmxhZyAgICAgICAgIDB4ODAKLSNkZWZpbmUgUHJpb3JpdHlfTWVzc2FnZVBlbmRpbmdJbnRlcnJ1cHRzRmxhZyAgICAgICAgICAgIDB4NDAKLSNkZWZpbmUgTm9ucHJpb3JpdHlfTWVzc2FnZUNvbXBsZXRpb25JbnRlcnJ1cHRzRmxhZyAgICAgIDB4MjAKLSNkZWZpbmUgUHJpb3JpdHlfTWVzc2FnZUNvbXBsZXRpb25JbnRlcnJ1cHRzRmxhZyAgICAgICAgIDB4MTAKLSNkZWZpbmUgSVVDVkNvbnRyb2xJbnRlcnJ1cHRzRmxhZyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgQWxsSW50ZXJydXB0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjgKLS8qCi0gKiBNYXBwaW5nIG9mIGV4dGVybmFsIGludGVycnVwdCBidWZmZXJzIHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKLSAqIGludGVycnVwdCB0eXBlcy4KLSAqIE5hbWVzOiBpdWN2X0Nvbm5lY3Rpb25QZW5kaW5nICAgIC0+ICBjb25uZWN0aW9uIHBlbmRpbmcKLSAqICAgICAgICBpdWN2X0Nvbm5lY3Rpb25Db21wbGV0ZSAgIC0+ICBjb25uZWN0aW9uIGNvbXBsZXRlCi0gKiAgICAgICAgaXVjdl9Db25uZWN0aW9uU2V2ZXJlZCAgICAtPiAgY29ubmVjdGlvbiBzZXZlcmVkCi0gKiAgICAgICAgaXVjdl9Db25uZWN0aW9uUXVpZXNjZWQgICAtPiAgY29ubmVjdGlvbiBxdWllc2NlZAotICogICAgICAgIGl1Y3ZfQ29ubmVjdGlvblJlc3VtZWQgICAgLT4gIGNvbm5lY3Rpb24gcmVzdW1lZAotICogICAgICAgIGl1Y3ZfTWVzc2FnZVBlbmRpbmcgICAgICAgLT4gIG1lc3NhZ2UgcGVuZGluZwotICogICAgICAgIGl1Y3ZfTWVzc2FnZUNvbXBsZXRlICAgICAgLT4gIG1lc3NhZ2UgY29tcGxldGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXUxNiBpcHBhdGhpZDsKLQl1Y2hhciBpcGZsYWdzMTsKLQl1Y2hhciBpcHR5cGU7Ci0JdTE2IGlwbXNnbGltOwotCXUxNiByZXMxOwotCXVjaGFyIGlwdm1pZFs4XTsKLQl1Y2hhciBpcHVzZXJbMTZdOwotCXUzMiByZXMzOwotCXVjaGFyIGlwcG9sbGZnOwotCXVjaGFyIHJlczRbM107Ci19IGl1Y3ZfQ29ubmVjdGlvblBlbmRpbmc7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1MTYgaXBwYXRoaWQ7Ci0JdWNoYXIgaXBmbGFnczE7Ci0JdWNoYXIgaXB0eXBlOwotCXUxNiBpcG1zZ2xpbTsKLQl1MTYgcmVzMTsKLQl1Y2hhciByZXMyWzhdOwotCXVjaGFyIGlwdXNlclsxNl07Ci0JdTMyIHJlczM7Ci0JdWNoYXIgaXBwb2xsZmc7Ci0JdWNoYXIgcmVzNFszXTsKLX0gaXVjdl9Db25uZWN0aW9uQ29tcGxldGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1MTYgaXBwYXRoaWQ7Ci0JdWNoYXIgcmVzMTsKLQl1Y2hhciBpcHR5cGU7Ci0JdTMyIHJlczI7Ci0JdWNoYXIgcmVzM1s4XTsKLQl1Y2hhciBpcHVzZXJbMTZdOwotCXUzMiByZXM0OwotCXVjaGFyIGlwcG9sbGZnOwotCXVjaGFyIHJlczVbM107Ci19IGl1Y3ZfQ29ubmVjdGlvblNldmVyZWQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1MTYgaXBwYXRoaWQ7Ci0JdWNoYXIgcmVzMTsKLQl1Y2hhciBpcHR5cGU7Ci0JdTMyIHJlczI7Ci0JdWNoYXIgcmVzM1s4XTsKLQl1Y2hhciBpcHVzZXJbMTZdOwotCXUzMiByZXM0OwotCXVjaGFyIGlwcG9sbGZnOwotCXVjaGFyIHJlczVbM107Ci19IGl1Y3ZfQ29ubmVjdGlvblF1aWVzY2VkOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTE2IGlwcGF0aGlkOwotCXVjaGFyIHJlczE7Ci0JdWNoYXIgaXB0eXBlOwotCXUzMiByZXMyOwotCXVjaGFyIHJlczNbOF07Ci0JdWNoYXIgaXB1c2VyWzE2XTsKLQl1MzIgcmVzNDsKLQl1Y2hhciBpcHBvbGxmZzsKLQl1Y2hhciByZXM1WzNdOwotfSBpdWN2X0Nvbm5lY3Rpb25SZXN1bWVkOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTE2IGlwcGF0aGlkOwotCXVjaGFyIGlwZmxhZ3MxOwotCXVjaGFyIGlwdHlwZTsKLQl1MzIgaXBtc2dpZDsKLQl1MzIgaXB0cmdjbHM7Ci0JdW5pb24gdTIgewotCQl1MzIgaXBybW1zZzFfdTMyOwotCQl1Y2hhciBpcHJtbXNnMVs0XTsKLQl9IGxuMW1zZzE7Ci0JdW5pb24gdTEgewotCQl1MzIgaXBiZmxuMWY7Ci0JCXVjaGFyIGlwcm1tc2cyWzRdOwotCX0gbG4xbXNnMjsKLQl1MzIgcmVzMVszXTsKLQl1MzIgaXBiZmxuMmY7Ci0JdWNoYXIgaXBwb2xsZmc7Ci0JdWNoYXIgcmVzMlszXTsKLX0gaXVjdl9NZXNzYWdlUGVuZGluZzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXUxNiBpcHBhdGhpZDsKLQl1Y2hhciBpcGZsYWdzMTsKLQl1Y2hhciBpcHR5cGU7Ci0JdTMyIGlwbXNnaWQ7Ci0JdTMyIGlwYXVkaXQ7Ci0JdWNoYXIgaXBybW1zZ1s4XTsKLQl1MzIgaXBzcmNjbHM7Ci0JdTMyIGlwbXNndGFnOwotCXUzMiByZXM7Ci0JdTMyIGlwYmZsbjJmOwotCXVjaGFyIGlwcG9sbGZnOwotCXVjaGFyIHJlczJbM107Ci19IGl1Y3ZfTWVzc2FnZUNvbXBsZXRlOwotCi0vKgotICogaXVjdl9pbnRlcnJ1cHRfb3BzX3Q6IElzIGEgdmVjdG9yIG9mIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZQotICogSVVDViBpbnRlcnJ1cHRzLgotICogUGFyYW1ldGVyIGxpc3Q6Ci0gKiAgICAgICAgIGVpYiAtIGlzIGEgcG9pbnRlciB0byBhIDQwLWJ5dGUgYXJlYSBkZXNjcmliZWQKLSAqICAgICAgICAgICAgICAgd2l0aCBvbmUgb2YgdGhlIHN0cnVjdHVyZXMgYWJvdmUuCi0gKiAgICAgICAgIHBnbV9kYXRhIC0gdGhpcyBkYXRhIGlzIHN0cmljdGx5IGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgaGFuZGxlciB0aGF0IGlzIHBhc3NlZCBieQotICogICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBtYXkgYmUgYW4gYWRkcmVzcwotICogICAgICAgICAgICAgICAgICAgIG9yIHRva2VuLgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2lkICgqQ29ubmVjdGlvblBlbmRpbmcpIChpdWN2X0Nvbm5lY3Rpb25QZW5kaW5nICogZWliLAotCQkJCSAgIHZvaWQgKnBnbV9kYXRhKTsKLQl2b2lkICgqQ29ubmVjdGlvbkNvbXBsZXRlKSAoaXVjdl9Db25uZWN0aW9uQ29tcGxldGUgKiBlaWIsCi0JCQkJICAgIHZvaWQgKnBnbV9kYXRhKTsKLQl2b2lkICgqQ29ubmVjdGlvblNldmVyZWQpIChpdWN2X0Nvbm5lY3Rpb25TZXZlcmVkICogZWliLAotCQkJCSAgIHZvaWQgKnBnbV9kYXRhKTsKLQl2b2lkICgqQ29ubmVjdGlvblF1aWVzY2VkKSAoaXVjdl9Db25uZWN0aW9uUXVpZXNjZWQgKiBlaWIsCi0JCQkJICAgIHZvaWQgKnBnbV9kYXRhKTsKLQl2b2lkICgqQ29ubmVjdGlvblJlc3VtZWQpIChpdWN2X0Nvbm5lY3Rpb25SZXN1bWVkICogZWliLAotCQkJCSAgIHZvaWQgKnBnbV9kYXRhKTsKLQl2b2lkICgqTWVzc2FnZVBlbmRpbmcpIChpdWN2X01lc3NhZ2VQZW5kaW5nICogZWliLCB2b2lkICpwZ21fZGF0YSk7Ci0Jdm9pZCAoKk1lc3NhZ2VDb21wbGV0ZSkgKGl1Y3ZfTWVzc2FnZUNvbXBsZXRlICogZWliLCB2b2lkICpwZ21fZGF0YSk7Ci19IGl1Y3ZfaW50ZXJydXB0X29wc190OwotCi0vKgotICppdWN2X2FycmF5X3QgOiBEZWZpbmVzIGJ1ZmZlciBhcnJheS4KLSAqIEluc2lkZSB0aGUgYXJyYXkgbWF5IGJlIDMxLSBiaXQgYWRkcmVzc2VzIGFuZCAzMS1iaXQgbGVuZ3Rocy4KLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTMyIGFkZHJlc3M7Ci0JdTMyIGxlbmd0aDsKLX0gaXVjdl9hcnJheV90IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg4KSkpOwotCi1leHRlcm4gc3RydWN0IGJ1c190eXBlIGl1Y3ZfYnVzOwotZXh0ZXJuIHN0cnVjdCBkZXZpY2UgKml1Y3Zfcm9vdDsKLQotLyogICAtcHJvdG90eXBlcy0gICAgKi8KLS8qCi0gKiBOYW1lOiBpdWN2X3JlZ2lzdGVyX3Byb2dyYW0KLSAqIFB1cnBvc2U6IFJlZ2lzdGVycyBhbiBhcHBsaWNhdGlvbiB3aXRoIElVQ1YKLSAqIElucHV0OiBwcm1uYW1lIC0gdXNlciBpZGVudGlmaWNhdGlvbgotICogICAgICAgIHVzZXJpZCAgLSBtYWNoaW5lIGlkZW50aWZpY2F0aW9uCi0gKiAgICAgICAgcGdtbWFzayAtIGluZGljYXRlcyB3aGljaCBiaXRzIGluIHRoZSBwcm1uYW1lIGFuZCB1c2VyaWQgY29tYmluZWQgd2lsbCBiZQotICogIAkJICAgIHVzZWQgdG8gZGV0ZXJtaW5lIHdobyBpcyBnaXZlbiBjb250cm9sCi0gKiAgICAgICAgb3BzICAgICAtIGFkZHJlc3Mgb2YgdmVjdG9yIG9mIGludGVycnVwdCBoYW5kbGVycwotICogICAgICAgIHBnbV9kYXRhLSBhcHBsaWNhdGlvbiBkYXRhIHBhc3NlZCB0byBpbnRlcnJ1cHQgaGFuZGxlcnMKLSAqIE91dHB1dDogTkEKLSAqIFJldHVybjogYWRkcmVzcyBvZiBoYW5kbGVyCi0gKiAgICAgICAgICgwKSAtIEVycm9yIG9jY3VycmVkLCByZWdpc3RyYXRpb24gbm90IGNvbXBsZXRlZC4KLSAqIE5PVEU6IEV4YWN0IGNhdXNlIG9mIGZhaWx1cmUgd2lsbCBiZSByZWNvcmRlZCBpbiBzeXNsb2cuCi0qLwotaXVjdl9oYW5kbGVfdCBpdWN2X3JlZ2lzdGVyX3Byb2dyYW0gKHVjaGFyIHBnbW5hbWVbMTZdLAotCQkJCSAgICAgdWNoYXIgdXNlcmlkWzhdLAotCQkJCSAgICAgdWNoYXIgcGdtbWFza1syNF0sCi0JCQkJICAgICBpdWN2X2ludGVycnVwdF9vcHNfdCAqIG9wcywKLQkJCQkgICAgIHZvaWQgKnBnbV9kYXRhKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtCi0gKiBQdXJwb3NlOiBVbnJlZ2lzdGVyIGFwcGxpY2F0aW9uIHdpdGggSVVDVgotICogSW5wdXQ6IGFkZHJlc3Mgb2YgaGFuZGxlcgotICogT3V0cHV0OiBOQQotICogUmV0dXJuOiAoMCkgLSBOb3JtYWwgcmV0dXJuCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIEludGVybmFsIGVycm9yLCB3aWxkIHBvaW50ZXIKLSovCi1pbnQgaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0gKGl1Y3ZfaGFuZGxlX3QgaGFuZGxlKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3ZfYWNjZXB0Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIGlzIGlzc3VlZCBhZnRlciB0aGUgdXNlciByZWNlaXZlcyBhIENvbm5lY3Rpb24gUGVuZGluZyBleHRlcm5hbAotICogICAgICAgICAgaW50ZXJydXB0IGFuZCBub3cgd2lzaGVzIHRvIGNvbXBsZXRlIHRoZSBJVUNWIGNvbW11bmljYXRpb24gcGF0aC4KLSAqIElucHV0OiAgcGF0aGlkIC0gdTE2ICwgUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICAgbXNnbGltX3JlcXN0ZCAtIHUxNiwgVGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBtZXNzYWdlcyByZXF1ZXN0ZWQuCi0gKiAgICAgICAgIHVzZXJfZGF0YSAtIHVjaGFyWzE2XSwgRGF0YSBzcGVjaWZpZWQgYnkgdGhlIGl1Y3ZfY29ubmVjdCBmdW5jdGlvbi4KLSAqCSAgIGZsYWdzMSAtIGludCwgQ29udGFpbnMgb3B0aW9ucyBmb3IgdGhpcyBwYXRoLgotICogICAgICAgICAgIC1JUFBSVFkgICAtIDB4MjAtIFNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgICAgICAgLUlQUk1EQVRBIC0gMHg4MCwgU3BlY2lmaWVzIHdoZXRoZXIgeW91ciBwcm9ncmFtIGNhbiBoYW5kbGUgYSBtZXNzYWdlCi0gKiAgICAgICAgICAgIAlpbiAgdGhlIHBhcmFtZXRlciBsaXN0LgotICogICAgICAgICAgIC1JUFFVU0NFICAtIDB4NDAsIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvIHF1aWVzY2UgdGhlIHBhdGggYmVpbmcKLSAqCQllc3RhYmxpc2hlZC4KLSAqICAgICAgICAgaGFuZGxlIC0gaXVjdl9oYW5kbGVfdCwgQWRkcmVzcyBvZiBoYW5kbGVyLgotICogICAgICAgICBwZ21fZGF0YSAtIHZvaWQgKiwgQXBwbGljYXRpb24gZGF0YSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzLgotICogICAgICAgICBmbGFnczFfb3V0IC0gaW50ICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhdGgKLSAqICAgICAgICAgICAtIElQUFJUWSAtIDB4MjAsIEluZGljYXRlcyB5b3UgbWF5IHNlbmQgcHJpb3JpdHkgbWVzc2FnZXMuCi0gKiAgICAgICAgIG1zZ2xpbSAtICp1MTYsIE51bWJlciBvZiBvdXRzdGFuZGluZyBtZXNzYWdlcy4KLSAqIE91dHB1dDogcmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0qLwotCi1pbnQgaXVjdl9hY2NlcHQgKHUxNiBwYXRoaWQsCi0JCSB1MTYgbXNnbGltX3JlcXN0ZCwKLQkJIHVjaGFyIHVzZXJfZGF0YVsxNl0sCi0JCSBpbnQgZmxhZ3MxLAotCQkgaXVjdl9oYW5kbGVfdCBoYW5kbGUsCi0JCSB2b2lkICpwZ21fZGF0YSwgaW50ICpmbGFnczFfb3V0LCB1MTYgKiBtc2dsaW0pOwotCi0vKgotICogTmFtZTogaXVjdl9jb25uZWN0Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIGVzdGFibGlzaGVzIGFuIElVQ1YgcGF0aC4gQWx0aG91Z2ggdGhlIGNvbm5lY3QgbWF5IGNvbXBsZXRlCi0gKgkgICAgc3VjY2Vzc2Z1bGx5LCB5b3UgYXJlIG5vdCBhYmxlIHRvIHVzZSB0aGUgcGF0aCB1bnRpbCB5b3UgcmVjZWl2ZSBhbiBJVUNWCi0gKiAgICAgICAgICBDb25uZWN0aW9uIENvbXBsZXRlIGV4dGVybmFsIGludGVycnVwdC4KLSAqIElucHV0OiBwYXRoaWQgLSB1MTYgKiwgUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICBtc2dsaW1fcmVxc3RkIC0gdTE2LCBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgbWVzc2FnZXMgcmVxdWVzdGVkCi0gKiAgICAgICAgdXNlcl9kYXRhIC0gdWNoYXJbMTZdLCAxNi1ieXRlIHVzZXIgZGF0YQotICoJICB1c2VyaWQgLSB1Y2hhcls4XSwgVXNlciBpZGVudGlmaWNhdGlvbgotICogICAgICAgIHN5c3RlbV9uYW1lIC0gdWNoYXJbOF0sIDgtYnl0ZSBpZGVudGlmeWluZyB0aGUgc3lzdGVtIG5hbWUKLSAqCSAgZmxhZ3MxIC0gaW50LCBDb250YWlucyBvcHRpb25zIGZvciB0aGlzIHBhdGguCi0gKiAgICAgICAgICAtSVBQUlRZIC0gICAweDIwLCBTcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlLgotICogICAgICAgICAgLUlQUk1EQVRBIC0gMHg4MCwgU3BlY2lmaWVzIHdoZXRoZXIgeW91ciBwcm9ncmFtIGNhbiBoYW5kbGUgYSBtZXNzYWdlCi0gKiAgICAgICAgICAgIAkgaW4gIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLSAqICAgICAgICAgIC1JUFFVU0NFIC0gIDB4NDAsIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvIHF1aWVzY2UgdGhlIHBhdGggYmVpbmcKLSAqCQllc3RhYmxpc2hlZC4KLSAqICAgICAgICAgIC1JUExPQ0FMIC0gIDBYMDEsIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBmb3JjZSB0aGUgcGFydG5lciB0byBiZSBvbgotICoJCXRoZSBsb2NhbCBzeXN0ZW0uIElmIGxvY2FsIGlzIHNwZWNpZmllZCB0aGVuIHRhcmdldCBjbGFzcyBjYW5ub3QgYmUKLSAqCQlzcGVjaWZpZWQuCi0gKiAgICAgICAgZmxhZ3MxX291dCAtIGludCAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXRoCi0gKiAgICAgICAgICAgLSBJUFBSVFkgLSAweDIwLCBJbmRpY2F0ZXMgeW91IG1heSBzZW5kIHByaW9yaXR5IG1lc3NhZ2VzLgotICogICAgICAgIG1zZ2xpbSAtICogdTE2LCBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgbWVzc2FnZXMKLSAqICAgICAgICBoYW5kbGUgLSBpdWN2X2hhbmRsZV90LCBBZGRyZXNzIG9mIGhhbmRsZXIKLSAqICAgICAgICBwZ21fZGF0YSAtIHZvaWQgKiwgQXBwbGljYXRpb24gZGF0YSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzCi0gKiBPdXRwdXQ6IHJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsCi0gKiAgICAgICAgIHJjIC0gcmV0dXJuIGNvZGUgZnJvbSBpdWN2X2RlY2xhcmVfYnVmZmVyCi0gKiAgICAgICAgIC1FSU5WQUwgLSBJbnZhbGlkIGhhbmRsZSBwYXNzZWQgYnkgYXBwbGljYXRpb24KLSAqICAgICAgICAgLUVJTlZBTCAtIFBhdGhpZCBhZGRyZXNzIGlzIE5VTEwKLSAqICAgICAgICAgYWRkX3BhdGhpZF9yZXN1bHQgLSBSZXR1cm4gY29kZSBmcm9tIGludGVybmFsIGZ1bmN0aW9uIGFkZF9wYXRoaWQKLSovCi1pbnQKLSAgICBpdWN2X2Nvbm5lY3QgKHUxNiAqIHBhdGhpZCwKLQkJICB1MTYgbXNnbGltX3JlcXN0ZCwKLQkJICB1Y2hhciB1c2VyX2RhdGFbMTZdLAotCQkgIHVjaGFyIHVzZXJpZFs4XSwKLQkJICB1Y2hhciBzeXN0ZW1fbmFtZVs4XSwKLQkJICBpbnQgZmxhZ3MxLAotCQkgIGludCAqZmxhZ3MxX291dCwKLQkJICB1MTYgKiBtc2dsaW0sIGl1Y3ZfaGFuZGxlX3QgaGFuZGxlLCB2b2lkICpwZ21fZGF0YSk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3B1cmdlCi0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIGNhbmNlbHMgYSBtZXNzYWdlIHRoYXQgeW91IGhhdmUgc2VudC4KLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICBtc2dpZCAtIFNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBiZSBwdXJnZWQuCi0gKiAgICAgICAgc3JjY2xzIC0gU3BlY2lmaWVzIHRoZSBzb3VyY2UgbWVzc2FnZSBjbGFzcy4KLSAqIE91dHB1dDogYXVkaXQgLSBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhc3luY2hyb25vdXMgZXJyb3IKLSAqICAgICAgICAgICAgICAgICB0aGF0IG1heSBoYXZlIGFmZmVjdGVkIHRoZSBub3JtYWwgY29tcGxldGlvbgotICogICAgICAgICAgICAgICAgIG9mIHRoaXMgbWVzc2FnZS4KLSAqIFJldHVybjogUmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0qLwotaW50IGl1Y3ZfcHVyZ2UgKHUxNiBwYXRoaWQsIHUzMiBtc2dpZCwgdTMyIHNyY2NscywgX191MzIgKmF1ZGl0KTsKLS8qCi0gKiBOYW1lOiBpdWN2X3F1ZXJ5X21heGNvbm4KLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29tbXVuaWNhdGlvbiBwYXRocyB5b3UKLSAqCSAgICBtYXkgZXN0YWJsaXNoLgotICogUmV0dXJuOiAgbWF4Y29ubiAtIHVsb25nLCBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9uIHRoZSB2aXJ0dWFsIG1hY2hpbmUgbWF5Ci0gKiAgICAgICAgICBlc3RhYmxpc2guCi0qLwotdWxvbmcgaXVjdl9xdWVyeV9tYXhjb25uICh2b2lkKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3ZfcXVlcnlfYnVmc2l6ZQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGhvdyBsYXJnZSBhbiBleHRlcm5hbCBpbnRlcnJ1cHQKLSAqICAgICAgICAgIGJ1ZmZlciBJVUNWIHJlcXVpcmVzIHRvIHN0b3JlIGluZm9ybWF0aW9uLgotICogUmV0dXJuOiAgYnVmc2l6ZSAtIHVsb25nLCBTaXplIG9mIGV4dGVybmFsIGludGVycnVwdCBidWZmZXIuCi0gKi8KLXVsb25nIGl1Y3ZfcXVlcnlfYnVmc2l6ZSAodm9pZCk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3F1aWVzY2UKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gdGVtcG9yYXJpbHkgc3VzcGVuZHMgaW5jb21pbmcgbWVzc2FnZXMgb24gYW4KLSAqICAgICAgICAgIElVQ1YgcGF0aC4gWW91IGNhbiBsYXRlciByZWFjdGl2YXRlIHRoZSBwYXRoIGJ5IGludm9raW5nCi0gKiAgICAgICAgICB0aGUgaXVjdl9yZXN1bWUgZnVuY3Rpb24uCi0gKiBJbnB1dDogcGF0aGlkIC0gUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICB1c2VyX2RhdGEgIC0gMTYtYnl0ZXMgb2YgdXNlciBkYXRhCi0gKiBPdXRwdXQ6IE5BCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotKi8KLWludCBpdWN2X3F1aWVzY2UgKHUxNiBwYXRoaWQsIHVjaGFyIHVzZXJfZGF0YVsxNl0pOwotCi0vKgotICogTmFtZTogaXVjdl9yZWNlaXZlCi0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHJlY2VpdmVzIG1lc3NhZ2VzIHRoYXQgYXJlIGJlaW5nIHNlbnQgdG8geW91Ci0gKiAgICAgICAgICBvdmVyIGVzdGFibGlzaGVkIHBhdGhzLiBEYXRhIHdpbGwgYmUgcmV0dXJuZWQgaW4gYnVmZmVyIGZvciBsZW5ndGggb2YKLSAqICAgICAgICAgIGJ1Zmxlbi4KLSAqIElucHV0OgotICogICAgICAgcGF0aGlkIC0gUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIuCi0gKiAgICAgICBidWZmZXIgLSBBZGRyZXNzIG9mIGJ1ZmZlciB0byByZWNlaXZlLgotICogICAgICAgYnVmbGVuIC0gTGVuZ3RoIG9mIGJ1ZmZlciB0byByZWNlaXZlLgotICogICAgICAgbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogT3V0cHV0OgotICoJIGZsYWdzMV9vdXQ6IGludCAqLCBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHBhdGguCi0gKiAgICAgICAgIElQTk9SUFkgLSAweDEwIFNwZWNpZmllcyB0aGlzIGlzIGEgb25lLXdheSBtZXNzYWdlIGFuZCBubyByZXBseSBpcwotICoJICAgZXhwZWN0ZWQuCi0gKiAgICAgICAgIElQUFJUWSAgLSAweDIwIFNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgICAgIElQUk1EQVRBIC0gMHg4MCBzcGVjaWZpZXMgdGhlIGRhdGEgaXMgY29udGFpbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdAotICogICAgICAgcmVzaWR1YWxfYnVmZmVyIC0gYWRkcmVzcyBvZiBidWZmZXIgdXBkYXRlZCBieSB0aGUgbnVtYmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBvZiBieXRlcyB5b3UgaGF2ZSByZWNlaXZlZC4KLSAqICAgICAgIHJlc2lkdWFsX2xlbmd0aCAtCi0gKiAgICAgICAgICAgICAgQ29udGFpbnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLCBpZiB0aGUgcmVjZWl2ZSBidWZmZXIgaXM6Ci0gKiAgICAgICAgICAgICAgIFRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgbWVzc2FnZSwgdGhpcyBmaWVsZCBpcyB6ZXJvLgotICogICAgICAgICAgICAgICBMb25nZXIgdGhhbiB0aGUgbWVzc2FnZSwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgbnVtYmVyIG9mCi0gKiAgICAgICAgICAgICAgICBieXRlcyByZW1haW5pbmcgaW4gdGhlIGJ1ZmZlci4KLSAqICAgICAgICAgICAgICAgU2hvcnRlciB0aGFuIHRoZSBtZXNzYWdlLCB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSByZXNpZHVhbAotICogICAgICAgICAgICAgICAgY291bnQgKHRoYXQgaXMsIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZQotICogICAgICAgICAgICAgICAgbWVzc2FnZSB0aGF0IGRvZXMgbm90IGZpdCBpbnRvIHRoZSBidWZmZXIuIEluIHRoaXMKLSAqICAgICAgICAgICAgICAgIGNhc2UgYjJmMF9yZXN1bHQgPSA1LgotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSAqICAgICAgICAgKC1FSU5WQUwpIC0gYnVmZmVyIGFkZHJlc3MgaXMgcG9pbnRpbmcgdG8gTlVMTAotKi8KLWludCBpdWN2X3JlY2VpdmUgKHUxNiBwYXRoaWQsCi0JCSAgdTMyIG1zZ2lkLAotCQkgIHUzMiB0cmdjbHMsCi0JCSAgdm9pZCAqYnVmZmVyLAotCQkgIHVsb25nIGJ1ZmxlbiwKLQkJICBpbnQgKmZsYWdzMV9vdXQsCi0JCSAgdWxvbmcgKiByZXNpZHVhbF9idWZmZXIsIHVsb25nICogcmVzaWR1YWxfbGVuZ3RoKTsKLQotIC8qCi0gICogTmFtZTogaXVjdl9yZWNlaXZlX2FycmF5Ci0gICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBtZXNzYWdlcyB0aGF0IGFyZSBiZWluZyBzZW50IHRvIHlvdQotICAqICAgICAgICAgIG92ZXIgZXN0YWJsaXNoZWQgcGF0aHMuIERhdGEgd2lsbCBiZSByZXR1cm5lZCBpbiBmaXJzdCBidWZmZXIgZm9yCi0gICogICAgICAgICAgbGVuZ3RoIG9mIGZpcnN0IGJ1ZmZlci4KLSAgKiBJbnB1dDogcGF0aGlkIC0gUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIuCi0gICogICAgICAgIG1zZ2lkIC0gc3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICAqICAgICAgICBidWZmZXIgLSBBZGRyZXNzIG9mIGFycmF5IG9mIGJ1ZmZlcnMuCi0gICogICAgICAgIGJ1ZmxlbiAtIFRvdGFsIGxlbmd0aCBvZiBidWZmZXJzLgotICAqIE91dHB1dDoKLSAgKiAgICAgICAgZmxhZ3MxX291dDogaW50ICosIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcGF0aC4KLSAgKiAgICAgICAgICBJUE5PUlBZIC0gMHgxMCBTcGVjaWZpZXMgdGhpcyBpcyBhIG9uZS13YXkgbWVzc2FnZSBhbmQgbm8gcmVwbHkgaXMKLSAgKiAgICAgICAgICBleHBlY3RlZC4KLSAgKiAgICAgICAgICBJUFBSVFkgIC0gMHgyMCBTcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlLgotICAqICAgICAgICAgIElQUk1EQVRBIC0gMHg4MCBzcGVjaWZpZXMgdGhlIGRhdGEgaXMgY29udGFpbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdAotICAqICAgICAgIHJlc2lkdWFsX2J1ZmZlciAtIGFkZHJlc3MgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGxpc3QgZW50cnkgSVVDVgotICAqICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHdvcmtpbmcgb24uCi0gICogICAgICAgcmVzaWR1YWxfbGVuZ3RoIC0KLSAgKiAgICAgICAgICAgICAgQ29udGFpbnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLCBpZiB0aGUgcmVjZWl2ZSBidWZmZXIgaXM6Ci0gICogICAgICAgICAgICAgICBUaGUgc2FtZSBsZW5ndGggYXMgdGhlIG1lc3NhZ2UsIHRoaXMgZmllbGQgaXMgemVyby4KLSAgKiAgICAgICAgICAgICAgIExvbmdlciB0aGFuIHRoZSBtZXNzYWdlLCB0aGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YKLSAgKiAgICAgICAgICAgICAgICBieXRlcyByZW1haW5pbmcgaW4gdGhlIGJ1ZmZlci4KLSAgKiAgICAgICAgICAgICAgIFNob3J0ZXIgdGhhbiB0aGUgbWVzc2FnZSwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgcmVzaWR1YWwKLSAgKiAgICAgICAgICAgICAgICBjb3VudCAodGhhdCBpcywgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlCi0gICogICAgICAgICAgICAgICAgbWVzc2FnZSB0aGF0IGRvZXMgbm90IGZpdCBpbnRvIHRoZSBidWZmZXIuIEluIHRoaXMKLSAgKiAgICAgICAgICAgICAgICBjYXNlIGIyZjBfcmVzdWx0ID0gNS4KLSAgKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotICAqICAgICAgICAgKC1FSU5WQUwpIC0gQnVmZmVyIGFkZHJlc3MgaXMgTlVMTC4KLSAgKi8KLWludCBpdWN2X3JlY2VpdmVfYXJyYXkgKHUxNiBwYXRoaWQsCi0JCQl1MzIgbXNnaWQsCi0JCQl1MzIgdHJnY2xzLAotCQkJaXVjdl9hcnJheV90ICogYnVmZmVyLAotCQkJdWxvbmcgYnVmbGVuLAotCQkJaW50ICpmbGFnczFfb3V0LAotCQkJdWxvbmcgKiByZXNpZHVhbF9idWZmZXIsIHVsb25nICogcmVzaWR1YWxfbGVuZ3RoKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3ZfcmVqZWN0Ci0gKiBQdXJwb3NlOiBUaGUgcmVqZWN0IGZ1bmN0aW9uIHJlZnVzZXMgYSBzcGVjaWZpZWQgbWVzc2FnZS4gQmV0d2VlbiB0aGUKLSAqICAgICAgICAgIHRpbWUgeW91IGFyZSBub3RpZmllZCBvZiBhIG1lc3NhZ2UgYW5kIHRoZSB0aW1lIHRoYXQgeW91Ci0gKiAgICAgICAgICBjb21wbGV0ZSB0aGUgbWVzc2FnZSwgdGhlIG1lc3NhZ2UgbWF5IGJlIHJlamVjdGVkLgotICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICogICAgICAgIG1zZ2lkIC0gU3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICogICAgICAgIHRyZ2NscyAtIFNwZWNpZmllcyB0YXJnZXQgY2xhc3MuCi0gKiBPdXRwdXQ6IE5BCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotKi8KLWludCBpdWN2X3JlamVjdCAodTE2IHBhdGhpZCwgdTMyIG1zZ2lkLCB1MzIgdHJnY2xzKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3ZfcmVwbHkKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gcmVzcG9uZHMgdG8gdGhlIHR3by13YXkgbWVzc2FnZXMgdGhhdCB5b3UKLSAqICAgICAgICAgIHJlY2VpdmUuIFlvdSBtdXN0IGlkZW50aWZ5IGNvbXBsZXRlbHkgdGhlIG1lc3NhZ2UgdG8KLSAqICAgICAgICAgIHdoaWNoIHlvdSB3aXNoIHRvIHJlcGx5LiBpZSwgcGF0aGlkLCBtc2dpZCwgYW5kIHRyZ2Nscy4KLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICBtc2dpZCAtIFNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogICAgICAgIGZsYWdzMSAtIE9wdGlvbiBmb3IgcGF0aC4KLSAqICAgICAgICAgIElQUFJUWS0gMHgyMCwgU3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICBidWZmZXIgLSBBZGRyZXNzIG9mIHJlcGx5IGJ1ZmZlci4KLSAqICAgICAgICBidWZsZW4gLSBMZW5ndGggb2YgcmVwbHkgYnVmZmVyLgotICogT3V0cHV0OiByZXNpZHVhbF9idWZmZXIgLSBBZGRyZXNzIG9mIGJ1ZmZlciB1cGRhdGVkIGJ5IHRoZSBudW1iZXIKLSAqICAgICAgICAgICAgICAgICAgICBvZiBieXRlcyB5b3UgaGF2ZSBtb3ZlZC4KLSAqICAgICAgICAgcmVzaWR1YWxfbGVuZ3RoIC0gQ29udGFpbnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICoJCUlmIHRoZSBhbnN3ZXIgYnVmZmVyIGlzIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgcmVwbHksIHRoaXMgZmllbGQKLSAqCQkgY29udGFpbnMgemVyby4KLSAqCQlJZiB0aGUgYW5zd2VyIGJ1ZmZlciBpcyBsb25nZXIgdGhhbiB0aGUgcmVwbHksIHRoaXMgZmllbGQgY29udGFpbnMKLSAqCQkgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIGJ1ZmZlci4KLSAqCQlJZiB0aGUgYW5zd2VyIGJ1ZmZlciBpcyBzaG9ydGVyIHRoYW4gdGhlIHJlcGx5LCB0aGlzIGZpZWxkIGNvbnRhaW5zCi0gKgkJIGEgcmVzaWR1YWwgY291bnQgKHRoYXQgaXMsIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtaWFuaW5nIGluIHRoZQotICoJCSByZXBseSB0aGF0IGRvZXMgbm90IGZpdCBpbnRvIHRoZSBidWZmZXIuIEluIHRoaXMKLSAqICAgICAgICAgICAgICAgY2FzZSBiMmYwX3Jlc3VsdCA9IDUuCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotICogICAgICAgICAoLUVJTlZBTCkgLSBCdWZmZXIgYWRkcmVzcyBpcyBOVUxMLgotKi8KLWludCBpdWN2X3JlcGx5ICh1MTYgcGF0aGlkLAotCQl1MzIgbXNnaWQsCi0JCXUzMiB0cmdjbHMsCi0JCWludCBmbGFnczEsCi0JCXZvaWQgKmJ1ZmZlciwgdWxvbmcgYnVmbGVuLCB1bG9uZyAqIHJlc2lkdWFsX2J1ZmZlciwKLQkJdWxvbmcgKiByZXNpZHVhbF9sZW5ndGgpOwotCi0vKgotICogTmFtZTogaXVjdl9yZXBseV9hcnJheQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiByZXNwb25kcyB0byB0aGUgdHdvLXdheSBtZXNzYWdlcyB0aGF0IHlvdQotICogICAgICAgICAgcmVjZWl2ZS4gWW91IG11c3QgaWRlbnRpZnkgY29tcGxldGVseSB0aGUgbWVzc2FnZSB0bwotICogICAgICAgICAgd2hpY2ggeW91IHdpc2ggdG8gcmVwbHkuIGllLCBwYXRoaWQsIG1zZ2lkLCBhbmQgdHJnY2xzLgotICogICAgICAgICAgVGhlIGFycmF5IGlkZW50aWZpZXMgYSBsaXN0IG9mIGFkZHJlc3NlcyBhbmQgbGVuZ3RocyBvZgotICogICAgICAgICAgZGlzY29udGlndW91cyBidWZmZXJzIHRoYXQgY29udGFpbnMgdGhlIHJlcGx5IGRhdGEuCi0gKiBJbnB1dDogcGF0aGlkIC0gUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIKLSAqICAgICAgICBtc2dpZCAtIFNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogICAgICAgIGZsYWdzMSAtIE9wdGlvbiBmb3IgcGF0aC4KLSAqICAgICAgICAgIElQUFJUWS0gMHgyMCwgU3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICBidWZmZXIgLSBBZGRyZXNzIG9mIGFycmF5IG9mIHJlcGx5IGJ1ZmZlcnMuCi0gKiAgICAgICAgYnVmbGVuIC0gVG90YWwgbGVuZ3RoIG9mIHJlcGx5IGJ1ZmZlcnMuCi0gKiBPdXRwdXQ6IHJlc2lkdWFsX2J1ZmZlciAtIEFkZHJlc3Mgb2YgYnVmZmVyIHdoaWNoIElVQ1YgaXMgY3VycmVudGx5IHdvcmtpbmcgb24uCi0gKiAgICAgICAgIHJlc2lkdWFsX2xlbmd0aCAtIENvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICBJZiB0aGUgYW5zd2VyIGJ1ZmZlciBpcyB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHJlcGx5LCB0aGlzIGZpZWxkCi0gKiAgICAgICAgICAgICAgIGNvbnRhaW5zIHplcm8uCi0gKiAgICAgICAgICAgICAgSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgbG9uZ2VyIHRoYW4gdGhlIHJlcGx5LCB0aGlzIGZpZWxkIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBidWZmZXIuCi0gKiAgICAgICAgICAgICAgSWYgdGhlIGFuc3dlciBidWZmZXIgaXMgc2hvcnRlciB0aGFuIHRoZSByZXBseSwgdGhpcyBmaWVsZCBjb250YWlucwotICogICAgICAgICAgICAgICBhIHJlc2lkdWFsIGNvdW50ICh0aGF0IGlzLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWlhbmluZyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgcmVwbHkgdGhhdCBkb2VzIG5vdCBmaXQgaW50byB0aGUgYnVmZmVyLiBJbiB0aGlzCi0gKiAgICAgICAgICAgICAgIGNhc2UgYjJmMF9yZXN1bHQgPSA1LgotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSAqICAgICAgICAgKC1FSU5WQUwpIC0gQnVmZmVyIGFkZHJlc3MgaXMgTlVMTC4KLSovCi1pbnQgaXVjdl9yZXBseV9hcnJheSAodTE2IHBhdGhpZCwKLQkJICAgICAgdTMyIG1zZ2lkLAotCQkgICAgICB1MzIgdHJnY2xzLAotCQkgICAgICBpbnQgZmxhZ3MxLAotCQkgICAgICBpdWN2X2FycmF5X3QgKiBidWZmZXIsCi0JCSAgICAgIHVsb25nIGJ1ZmxlbiwgdWxvbmcgKiByZXNpZHVhbF9hZGRyZXNzLAotCQkgICAgICB1bG9uZyAqIHJlc2lkdWFsX2xlbmd0aCk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3JlcGx5X3BybW1zZwotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiByZXNwb25kcyB0byB0aGUgdHdvLXdheSBtZXNzYWdlcyB0aGF0IHlvdQotICogICAgICAgICAgcmVjZWl2ZS4gWW91IG11c3QgaWRlbnRpZnkgY29tcGxldGVseSB0aGUgbWVzc2FnZSB0bwotICogICAgICAgICAgd2hpY2ggeW91IHdpc2ggdG8gcmVwbHkuIGllLCBwYXRoaWQsIG1zZ2lkLCBhbmQgdHJnY2xzLgotICogICAgICAgICAgUHJtbXNnIHNpZ25pZmllcyB0aGUgZGF0YSBpcyBtb3ZlZCBpbnRvIHRoZQotICogICAgICAgICAgcGFyYW1ldGVyIGxpc3QuCi0gKiBJbnB1dDogcGF0aGlkIC0gUGF0aCBpZGVudGlmaWNhdGlvbiBudW1iZXIuCi0gKiAgICAgICAgbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiAgICAgICAgdHJnY2xzIC0gU3BlY2lmaWVzIHRhcmdldCBjbGFzcy4KLSAqICAgICAgICBmbGFnczEgLSBPcHRpb24gZm9yIHBhdGguCi0gKiAgICAgICAgICBJUFBSVFktIDB4MjAgU3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICBwcm1tc2cgLSA4LWJ5dGVzIG9mIGRhdGEgdG8gYmUgcGxhY2VkIGludG8gdGhlIHBhcmFtZXRlci4KLSAqICAgICAgICAgICAgICAgICBsaXN0LgotICogT3V0cHV0OiBOQQotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSovCi1pbnQgaXVjdl9yZXBseV9wcm1tc2cgKHUxNiBwYXRoaWQsCi0JCSAgICAgICB1MzIgbXNnaWQsIHUzMiB0cmdjbHMsIGludCBmbGFnczEsIHVjaGFyIHBybW1zZ1s4XSk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3Jlc3VtZQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiByZXN0b3JlcyBjb21tdW5pY2F0aW9ucyBvdmVyIGEgcXVpZXNjZWQgcGF0aAotICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICogICAgICAgIHVzZXJfZGF0YSAgLSAxNi1ieXRlcyBvZiB1c2VyIGRhdGEuCi0gKiBPdXRwdXQ6IE5BCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotKi8KLWludCBpdWN2X3Jlc3VtZSAodTE2IHBhdGhpZCwgdWNoYXIgdXNlcl9kYXRhWzE2XSk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NlbmQKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4KLSAqICAgICAgICAgIERhdGEgdG8gYmUgdHJhbnNtaXR0ZWQgaXMgaW4gYSBidWZmZXIgYW5kIHRoaXMgaXMgYQotICogICAgICAgICAgb25lLXdheSBtZXNzYWdlIGFuZCB0aGUgcmVjZWl2ZXIgd2lsbCBub3QgcmVwbHkgdG8gdGhlCi0gKiAgICAgICAgICBtZXNzYWdlLgotICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICogICAgICAgIHRyZ2NscyAtIFNwZWNpZmllcyB0YXJnZXQgY2xhc3MuCi0gKiAgICAgICAgc3JjY2xzIC0gU3BlY2lmaWVzIHRoZSBzb3VyY2UgbWVzc2FnZSBjbGFzcy4KLSAqICAgICAgICBtc2d0YWcgLSBTcGVjaWZpZXMgYSB0YWcgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlLgotICogICAgICAgIGZsYWdzMSAtIE9wdGlvbiBmb3IgcGF0aC4KLSAqICAgICAgICAgIElQUFJUWS0gMHgyMCBTcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlLgotICogICAgICAgIGJ1ZmZlciAtIEFkZHJlc3Mgb2Ygc2VuZCBidWZmZXIuCi0gKiAgICAgICAgYnVmbGVuIC0gTGVuZ3RoIG9mIHNlbmQgYnVmZmVyLgotICogT3V0cHV0OiBtc2dpZCAtIFNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqIFJldHVybjogUmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIEJ1ZmZlciBhZGRyZXNzIGlzIE5VTEwuCi0qLwotaW50IGl1Y3Zfc2VuZCAodTE2IHBhdGhpZCwKLQkgICAgICAgdTMyICogbXNnaWQsCi0JICAgICAgIHUzMiB0cmdjbHMsCi0JICAgICAgIHUzMiBzcmNjbHMsIHUzMiBtc2d0YWcsIGludCBmbGFnczEsIHZvaWQgKmJ1ZmZlciwgdWxvbmcgYnVmbGVuKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2VuZF9hcnJheQotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgVGhlIGNvbnRlbnRzIG9mIGJ1ZmZlciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgYXJyYXkgb2YKLSAqICAgICAgICAgIGFkZHJlc3NlcyBhbmQgbGVuZ3RocyBvZiBkaXNjb250aWd1b3VzIGJ1ZmZlcnMgdGhhdCBob2xkCi0gKiAgICAgICAgICB0aGUgbWVzc2FnZSB0ZXh0LiBUaGlzIGlzIGEgb25lLXdheSBtZXNzYWdlIGFuZCB0aGUKLSAqICAgICAgICAgIHJlY2VpdmVyIHdpbGwgbm90IHJlcGx5IHRvIHRoZSBtZXNzYWdlLgotICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICogICAgICAgIHRyZ2NscyAtIFNwZWNpZmllcyB0YXJnZXQgY2xhc3MuCi0gKiAgICAgICAgc3JjY2xzIC0gU3BlY2lmaWVzIHRoZSBzb3VyY2UgbWVzc2FnZSBjbGFzcy4KLSAqICAgICAgICBtc2d0YWcgLSBTcGVjaWZpZXMgYSB0YWcgdG8gYmUgYXNzb2NpYXRlZCB3aXRodCB0aGUgbWVzc2FnZS4KLSAqICAgICAgICBmbGFnczEgLSBPcHRpb24gZm9yIHBhdGguCi0gKiAgICAgICAgICBJUFBSVFktIHNwZWNpZmllcyBpZiB5b3Ugd2FudCB0byBzZW5kIHByaW9yaXR5IG1lc3NhZ2UuCi0gKiAgICAgICAgYnVmZmVyIC0gQWRkcmVzcyBvZiBhcnJheSBvZiBzZW5kIGJ1ZmZlcnMuCi0gKiAgICAgICAgYnVmbGVuIC0gVG90YWwgbGVuZ3RoIG9mIHNlbmQgYnVmZmVycy4KLSAqIE91dHB1dDogbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotICogICAgICAgICAoLUVJTlZBTCkgLSBCdWZmZXIgYWRkcmVzcyBpcyBOVUxMLgotKi8KLWludCBpdWN2X3NlbmRfYXJyYXkgKHUxNiBwYXRoaWQsCi0JCSAgICAgdTMyICogbXNnaWQsCi0JCSAgICAgdTMyIHRyZ2NscywKLQkJICAgICB1MzIgc3JjY2xzLAotCQkgICAgIHUzMiBtc2d0YWcsCi0JCSAgICAgaW50IGZsYWdzMSwgaXVjdl9hcnJheV90ICogYnVmZmVyLCB1bG9uZyBidWZsZW4pOwotCi0vKgotICogTmFtZTogaXVjdl9zZW5kX3BybW1zZwotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgUHJtbXNnIHNwZWNpZmllcyB0aGF0IHRoZSA4LWJ5dGVzIG9mIGRhdGEgYXJlIHRvIGJlIG1vdmVkCi0gKiAgICAgICAgICBpbnRvIHRoZSBwYXJhbWV0ZXIgbGlzdC4gVGhpcyBpcyBhIG9uZS13YXkgbWVzc2FnZSBhbmQgdGhlCi0gKiAgICAgICAgICByZWNlaXZlciB3aWxsIG5vdCByZXBseSB0byB0aGUgbWVzc2FnZS4KLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogICAgICAgIHNyY2NscyAtIFNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MuCi0gKiAgICAgICAgbXNndGFnIC0gU3BlY2lmaWVzIGEgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS4KLSAqICAgICAgICBmbGFnczEgLSBPcHRpb24gZm9yIHBhdGguCi0gKiAgICAgICAgICBJUFBSVFktIDB4MjAgc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICBwcm1tc2cgLSA4LWJ5dGVzIG9mIGRhdGEgdG8gYmUgcGxhY2VkIGludG8gcGFyYW1ldGVyIGxpc3QuCi0gKiBPdXRwdXQ6IG1zZ2lkIC0gU3BlY2lmaWVzIHRoZSBtZXNzYWdlIElELgotICogUmV0dXJuOiBSZXR1cm4gY29kZSBmcm9tIENQIElVQ1YgY2FsbC4KLSovCi1pbnQgaXVjdl9zZW5kX3BybW1zZyAodTE2IHBhdGhpZCwKLQkJICAgICAgdTMyICogbXNnaWQsCi0JCSAgICAgIHUzMiB0cmdjbHMsCi0JCSAgICAgIHUzMiBzcmNjbHMsIHUzMiBtc2d0YWcsIGludCBmbGFnczEsIHVjaGFyIHBybW1zZ1s4XSk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NlbmQyd2F5Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uCi0gKiAgICAgICAgICBEYXRhIHRvIGJlIHRyYW5zbWl0dGVkIGlzIGluIGEgYnVmZmVyLiBUaGUgcmVjZWl2ZXIKLSAqICAgICAgICAgIG9mIHRoZSBzZW5kIGlzIGV4cGVjdGVkIHRvIHJlcGx5IHRvIHRoZSBtZXNzYWdlIGFuZAotICogICAgICAgICAgYSBidWZmZXIgaXMgcHJvdmlkZWQgaW50byB3aGljaCBJVUNWIG1vdmVzIHRoZSByZXBseQotICogICAgICAgICAgdG8gdGhpcyBtZXNzYWdlLgotICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICogICAgICAgIHRyZ2NscyAtIFNwZWNpZmllcyB0YXJnZXQgY2xhc3MuCi0gKiAgICAgICAgc3JjY2xzIC0gU3BlY2lmaWVzIHRoZSBzb3VyY2UgbWVzc2FnZSBjbGFzcy4KLSAqICAgICAgICBtc2d0YWcgLSBTcGVjaWZpZXMgYSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlLgotICogICAgICAgIGZsYWdzMSAtIE9wdGlvbiBmb3IgcGF0aC4KLSAqICAgICAgICAgIElQUFJUWS0gMHgyMCBTcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlLgotICogICAgICAgIGJ1ZmZlciAtIEFkZHJlc3Mgb2Ygc2VuZCBidWZmZXIuCi0gKiAgICAgICAgYnVmbGVuIC0gTGVuZ3RoIG9mIHNlbmQgYnVmZmVyLgotICogICAgICAgIGFuc2J1ZiAtIEFkZHJlc3Mgb2YgYnVmZmVyIGludG8gd2hpY2ggSVVDViBtb3ZlcyB0aGUgcmVwbHkgb2YKLSAqICAgICAgICAgICAgICAgICB0aGlzIG1lc3NhZ2UuCi0gKiAgICAgICAgYW5zbGVuIC0gQWRkcmVzcyBvZiBsZW5ndGggb2YgYnVmZmVyLgotICogT3V0cHV0OiBtc2dpZCAtIFNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqIFJldHVybjogUmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIEJ1ZmZlciBvciBhbnNidWYgYWRkcmVzcyBpcyBOVUxMLgotKi8KLWludCBpdWN2X3NlbmQyd2F5ICh1MTYgcGF0aGlkLAotCQkgICB1MzIgKiBtc2dpZCwKLQkJICAgdTMyIHRyZ2NscywKLQkJICAgdTMyIHNyY2NscywKLQkJICAgdTMyIG1zZ3RhZywKLQkJICAgaW50IGZsYWdzMSwKLQkJICAgdm9pZCAqYnVmZmVyLCB1bG9uZyBidWZsZW4sIHZvaWQgKmFuc2J1ZiwgdWxvbmcgYW5zbGVuKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2VuZDJ3YXlfYXJyYXkKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4KLSAqICAgICAgICAgIFRoZSBjb250ZW50cyBvZiBidWZmZXIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGFycmF5IG9mCi0gKiAgICAgICAgICBhZGRyZXNzZXMgYW5kIGxlbmd0aHMgb2YgZGlzY29udGlndW91cyBidWZmZXJzIHRoYXQgaG9sZAotICogICAgICAgICAgdGhlIG1lc3NhZ2UgdGV4dC4gVGhlIHJlY2VpdmVyIG9mIHRoZSBzZW5kIGlzIGV4cGVjdGVkIHRvCi0gKiAgICAgICAgICByZXBseSB0byB0aGUgbWVzc2FnZSBhbmQgYSBidWZmZXIgaXMgcHJvdmlkZWQgaW50byB3aGljaAotICogICAgICAgICAgSVVDViBtb3ZlcyB0aGUgcmVwbHkgdG8gdGhpcyBtZXNzYWdlLgotICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICogICAgICAgIHRyZ2NscyAtIFNwZWNpZmllcyB0YXJnZXQgY2xhc3MuCi0gKiAgICAgICAgc3JjY2xzIC0gU3BlY2lmaWVzIHRoZSBzb3VyY2UgbWVzc2FnZSBjbGFzcy4KLSAqICAgICAgICBtc2d0YWcgLSBTcGVjaWZpZXMgYSB0YWcgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlLgotICogICAgICAgIGZsYWdzMSAtIE9wdGlvbiBmb3IgcGF0aC4KLSAqICAgICAgICAgIElQUFJUWS0gMHgyMCBTcGVjaWZpZXMgaWYgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlLgotICogICAgICAgIGJ1ZmZlciAtIFNkZHJlc3Mgb2YgYXJyYXkgb2Ygc2VuZCBidWZmZXJzLgotICogICAgICAgIGJ1ZmxlbiAtIFRvdGFsIGxlbmd0aCBvZiBzZW5kIGJ1ZmZlcnMuCi0gKiAgICAgICAgYW5zYnVmIC0gQWRkcmVzcyBvZiBhcnJheSBvZiBidWZmZXIgaW50byB3aGljaCBJVUNWIG1vdmVzIHRoZSByZXBseQotICogICAgICAgICAgICAgICAgIG9mIHRoaXMgbWVzc2FnZS4KLSAqICAgICAgICBhbnNsZW4gLSBBZGRyZXNzIG9mIGxlbmd0aCByZXBseSBidWZmZXJzLgotICogT3V0cHV0OiBtc2dpZCAtIFNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqIFJldHVybjogUmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIEJ1ZmZlciBhZGRyZXNzIGlzIE5VTEwuCi0qLwotaW50IGl1Y3Zfc2VuZDJ3YXlfYXJyYXkgKHUxNiBwYXRoaWQsCi0JCQkgdTMyICogbXNnaWQsCi0JCQkgdTMyIHRyZ2NscywKLQkJCSB1MzIgc3JjY2xzLAotCQkJIHUzMiBtc2d0YWcsCi0JCQkgaW50IGZsYWdzMSwKLQkJCSBpdWN2X2FycmF5X3QgKiBidWZmZXIsCi0JCQkgdWxvbmcgYnVmbGVuLCBpdWN2X2FycmF5X3QgKiBhbnNidWYsIHVsb25nIGFuc2xlbik7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NlbmQyd2F5X3BybW1zZwotICogUHVycG9zZTogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLgotICogICAgICAgICAgUHJtbXNnIHNwZWNpZmllcyB0aGF0IHRoZSA4LWJ5dGVzIG9mIGRhdGEgYXJlIHRvIGJlIG1vdmVkCi0gKiAgICAgICAgICBpbnRvIHRoZSBwYXJhbWV0ZXIgbGlzdC4gVGhpcyBpcyBhIHR3by13YXkgbWVzc2FnZSBhbmQgdGhlCi0gKiAgICAgICAgICByZWNlaXZlciBvZiB0aGUgbWVzc2FnZSBpcyBleHBlY3RlZCB0byByZXBseS4gQSBidWZmZXIKLSAqICAgICAgICAgIGlzIHByb3ZpZGVkIGludG8gd2hpY2ggSVVDViBtb3ZlcyB0aGUgcmVwbHkgdG8gdGhpcwotICogICAgICAgICAgbWVzc2FnZS4KLSAqIElucHV0OiBwYXRoaWQgLSBSYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogICAgICAgIHNyY2NscyAtIFNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MuCi0gKiAgICAgICAgbXNndGFnIC0gU3BlY2lmaWVzIGEgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS4KLSAqICAgICAgICBmbGFnczEgLSBPcHRpb24gZm9yIHBhdGguCi0gKiAgICAgICAgICBJUFBSVFktIDB4MjAgU3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICBwcm1tc2cgLSA4LWJ5dGVzIG9mIGRhdGEgdG8gYmUgcGxhY2VkIGluIHBhcmFtZXRlciBsaXN0LgotICogICAgICAgIGFuc2J1ZiAtIEFkZHJlc3Mgb2YgYnVmZmVyIGludG8gd2hpY2ggSVVDViBtb3ZlcyB0aGUgcmVwbHkgb2YKLSAqICAgICAgICAgICAgICAgICB0aGlzIG1lc3NhZ2UuCi0gKiAgICAgICAgYW5zbGVuIC0gQWRkcmVzcyBvZiBsZW5ndGggb2YgYnVmZmVyLgotICogT3V0cHV0OiBtc2dpZCAtIFNwZWNpZmllcyB0aGUgbWVzc2FnZSBJRC4KLSAqIFJldHVybjogUmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIEJ1ZmZlciBhZGRyZXNzIGlzIE5VTEwuCi0qLwotaW50IGl1Y3Zfc2VuZDJ3YXlfcHJtbXNnICh1MTYgcGF0aGlkLAotCQkJICB1MzIgKiBtc2dpZCwKLQkJCSAgdTMyIHRyZ2NscywKLQkJCSAgdTMyIHNyY2NscywKLQkJCSAgdTMyIG1zZ3RhZywKLQkJCSAgdWxvbmcgZmxhZ3MxLAotCQkJICB1Y2hhciBwcm1tc2dbOF0sIHZvaWQgKmFuc2J1ZiwgdWxvbmcgYW5zbGVuKTsKLQotLyoKLSAqIE5hbWU6IGl1Y3Zfc2VuZDJ3YXlfcHJtbXNnX2FycmF5Ci0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbWl0cyBkYXRhIHRvIGFub3RoZXIgYXBwbGljYXRpb24uCi0gKiAgICAgICAgICBQcm1tc2cgc3BlY2lmaWVzIHRoYXQgdGhlIDgtYnl0ZXMgb2YgZGF0YSBhcmUgdG8gYmUgbW92ZWQKLSAqICAgICAgICAgIGludG8gdGhlIHBhcmFtZXRlciBsaXN0LiBUaGlzIGlzIGEgdHdvLXdheSBtZXNzYWdlIGFuZCB0aGUKLSAqICAgICAgICAgIHJlY2VpdmVyIG9mIHRoZSBtZXNzYWdlIGlzIGV4cGVjdGVkIHRvIHJlcGx5LiBBIGJ1ZmZlcgotICogICAgICAgICAgaXMgcHJvdmlkZWQgaW50byB3aGljaCBJVUNWIG1vdmVzIHRoZSByZXBseSB0byB0aGlzCi0gKiAgICAgICAgICBtZXNzYWdlLiBUaGUgY29udGVudHMgb2YgYW5zYnVmIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICogICAgICAgICAgYXJyYXkgb2YgYWRkcmVzc2VzIGFuZCBsZW5ndGhzIG9mIGRpc2NvbnRpZ3VvdXMgYnVmZmVycwotICogICAgICAgICAgdGhhdCBjb250YWluIHRoZSByZXBseS4KLSAqIElucHV0OiBwYXRoaWQgLSBQYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KLSAqICAgICAgICB0cmdjbHMgLSBTcGVjaWZpZXMgdGFyZ2V0IGNsYXNzLgotICogICAgICAgIHNyY2NscyAtIFNwZWNpZmllcyB0aGUgc291cmNlIG1lc3NhZ2UgY2xhc3MuCi0gKiAgICAgICAgbXNndGFnIC0gU3BlY2lmaWVzIGEgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS4KLSAqICAgICAgICBmbGFnczEgLSBPcHRpb24gZm9yIHBhdGguCi0gKiAgICAgICAgICBJUFBSVFktIDB4MjAgc3BlY2lmaWVzIGlmIHlvdSB3YW50IHRvIHNlbmQgcHJpb3JpdHkgbWVzc2FnZS4KLSAqICAgICAgICBwcm1tc2cgLSA4LWJ5dGVzIG9mIGRhdGEgdG8gYmUgcGxhY2VkIGludG8gdGhlIHBhcmFtZXRlciBsaXN0LgotICogICAgICAgIGFuc2J1ZiAtIEFkZHJlc3Mgb2YgYXJyYXkgb2YgYnVmZmVyIGludG8gd2hpY2ggSVVDViBtb3ZlcyB0aGUgcmVwbHkKLSAqICAgICAgICAgICAgICAgICBvZiB0aGlzIG1lc3NhZ2UuCi0gKiAgICAgICAgYW5zbGVuIC0gQWRkcmVzcyBvZiBsZW5ndGggb2YgcmVwbHkgYnVmZmVycy4KLSAqIE91dHB1dDogbXNnaWQgLSBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgSUQuCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotICogICAgICAgICAoLUVJTlZBTCkgLSBBbnNidWYgYWRkcmVzcyBpcyBOVUxMLgotKi8KLWludCBpdWN2X3NlbmQyd2F5X3BybW1zZ19hcnJheSAodTE2IHBhdGhpZCwKLQkJCQl1MzIgKiBtc2dpZCwKLQkJCQl1MzIgdHJnY2xzLAotCQkJCXUzMiBzcmNjbHMsCi0JCQkJdTMyIG1zZ3RhZywKLQkJCQlpbnQgZmxhZ3MxLAotCQkJCXVjaGFyIHBybW1zZ1s4XSwKLQkJCQlpdWN2X2FycmF5X3QgKiBhbnNidWYsIHVsb25nIGFuc2xlbik7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NldG1hc2sKLSAqIFB1cnBvc2U6IFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZm9sbG93aW5nIElVQ1YKLSAqICAgICAgICAgIGV4dGVybmFsIGludGVycnVwdGlvbnM6IE5vbnByaW9yaXR5IGFuZCBwcmlvcml0eSBtZXNzYWdlCi0gKiAgICAgICAgICBpbnRlcnJ1cHRzLCBub25wcmlvcml0eSBhbmQgcHJpb3JpdHkgcmVwbHkgaW50ZXJydXB0cy4KLSAqIElucHV0OiBTZXRNYXNrRmxhZyAtIG9wdGlvbnMgZm9yIGludGVycnVwdHMKLSAqICAgICAgICAgICAweDgwIC0gTm9ucHJpb3JpdHlfTWVzc2FnZVBlbmRpbmdJbnRlcnJ1cHRzRmxhZwotICogICAgICAgICAgIDB4NDAgLSBQcmlvcml0eV9NZXNzYWdlUGVuZGluZ0ludGVycnVwdHNGbGFnCi0gKiAgICAgICAgICAgMHgyMCAtIE5vbnByaW9yaXR5X01lc3NhZ2VDb21wbGV0aW9uSW50ZXJydXB0c0ZsYWcKLSAqICAgICAgICAgICAweDEwIC0gUHJpb3JpdHlfTWVzc2FnZUNvbXBsZXRpb25JbnRlcnJ1cHRzRmxhZwotICogICAgICAgICAgIDB4MDggLSBJVUNWQ29udHJvbEludGVycnVwdHNGbGFnCi0gKiBPdXRwdXQ6IE5BCi0gKiBSZXR1cm46IFJldHVybiBjb2RlIGZyb20gQ1AgSVVDViBjYWxsLgotKi8KLWludCBpdWN2X3NldG1hc2sgKGludCBTZXRNYXNrRmxhZyk7Ci0KLS8qCi0gKiBOYW1lOiBpdWN2X3NldmVyCi0gKiBQdXJwb3NlOiBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgYW4gSVVDViBwYXRoLgotICogSW5wdXQ6IHBhdGhpZCAtIFBhdGggaWRlbnRpZmljYXRpb24gbnVtYmVyLgotICogICAgICAgIHVzZXJfZGF0YSAtIDE2LWJ5dGVzIG9mIHVzZXIgZGF0YS4KLSAqIE91dHB1dDogTkEKLSAqIFJldHVybjogUmV0dXJuIGNvZGUgZnJvbSBDUCBJVUNWIGNhbGwuCi0gKiAgICAgICAgICgtRUlOVkFMKSAtIEludGVyYWwgZXJyb3IsIHdpbGQgcG9pbnRlci4KLSovCi1pbnQgaXVjdl9zZXZlciAodTE2IHBhdGhpZCwgdWNoYXIgdXNlcl9kYXRhWzE2XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYyBiL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCmluZGV4IDMzNDYwODguLjYzODdiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIElVQ1YgbmV0d29yayBkcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IDIwMDEgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgogICogQXV0aG9yKHMpOiBGcml0eiBFbGZlcnQgKGVsZmVydEBkZS5pYm0uY29tLCBmZWxmZXJ0QG1pbGxlbnV4LmNvbSkKICAqCiAgKiBTeXNmcyBpbnRlZ3JhdGlvbiBhbmQgYWxsIGJ1Z3MgdGhlcmVpbiBieSBDb3JuZWxpYSBIdWNrCkBAIC01OCwxMyArNTgsOTQgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAiaXVjdi5oIgorI2luY2x1ZGUgPG5ldC9pdWN2L2l1Y3YuaD4KICNpbmNsdWRlICJmc20uaCIKIAogTU9EVUxFX0FVVEhPUgogICAgICgiKEMpIDIwMDEgSUJNIENvcnBvcmF0aW9uIGJ5IEZyaXR6IEVsZmVydCAoZmVsZmVydEBtaWxsZW51eC5jb20pIik7CiBNT0RVTEVfREVTQ1JJUFRJT04gKCJMaW51eCBmb3IgUy8zOTAgSVVDViBuZXR3b3JrIGRyaXZlciIpOwogCisvKioKKyAqIERlYnVnIEZhY2lsaXR5IHN0dWZmCisgKi8KKyNkZWZpbmUgSVVDVl9EQkZfU0VUVVBfTkFNRSAiaXVjdl9zZXR1cCIKKyNkZWZpbmUgSVVDVl9EQkZfU0VUVVBfTEVOIDMyCisjZGVmaW5lIElVQ1ZfREJGX1NFVFVQX1BBR0VTIDIKKyNkZWZpbmUgSVVDVl9EQkZfU0VUVVBfTlJfQVJFQVMgMQorI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9MRVZFTCAzCisKKyNkZWZpbmUgSVVDVl9EQkZfREFUQV9OQU1FICJpdWN2X2RhdGEiCisjZGVmaW5lIElVQ1ZfREJGX0RBVEFfTEVOIDEyOAorI2RlZmluZSBJVUNWX0RCRl9EQVRBX1BBR0VTIDIKKyNkZWZpbmUgSVVDVl9EQkZfREFUQV9OUl9BUkVBUyAxCisjZGVmaW5lIElVQ1ZfREJGX0RBVEFfTEVWRUwgMgorCisjZGVmaW5lIElVQ1ZfREJGX1RSQUNFX05BTUUgIml1Y3ZfdHJhY2UiCisjZGVmaW5lIElVQ1ZfREJGX1RSQUNFX0xFTiAxNgorI2RlZmluZSBJVUNWX0RCRl9UUkFDRV9QQUdFUyA0CisjZGVmaW5lIElVQ1ZfREJGX1RSQUNFX05SX0FSRUFTIDEKKyNkZWZpbmUgSVVDVl9EQkZfVFJBQ0VfTEVWRUwgMworCisjZGVmaW5lIElVQ1ZfREJGX1RFWFQobmFtZSxsZXZlbCx0ZXh0KSBcCisJZG8geyBcCisJCWRlYnVnX3RleHRfZXZlbnQoaXVjdl9kYmZfIyNuYW1lLGxldmVsLHRleHQpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBJVUNWX0RCRl9IRVgobmFtZSxsZXZlbCxhZGRyLGxlbikgXAorCWRvIHsgXAorCQlkZWJ1Z19ldmVudChpdWN2X2RiZl8jI25hbWUsbGV2ZWwsKHZvaWQqKShhZGRyKSxsZW4pOyBcCisJfSB3aGlsZSAoMCkKKworREVDTEFSRV9QRVJfQ1BVKGNoYXJbMjU2XSwgaXVjdl9kYmZfdHh0X2J1Zik7CisKKyNkZWZpbmUgSVVDVl9EQkZfVEVYVF8obmFtZSxsZXZlbCx0ZXh0Li4uKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQljaGFyKiBpdWN2X2RiZl90eHRfYnVmID0gZ2V0X2NwdV92YXIoaXVjdl9kYmZfdHh0X2J1Zik7CVwKKwkJc3ByaW50ZihpdWN2X2RiZl90eHRfYnVmLCB0ZXh0KTsJCQlcCisJCWRlYnVnX3RleHRfZXZlbnQoaXVjdl9kYmZfIyNuYW1lLGxldmVsLGl1Y3ZfZGJmX3R4dF9idWYpOyBcCisJCXB1dF9jcHVfdmFyKGl1Y3ZfZGJmX3R4dF9idWYpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBJVUNWX0RCRl9TUFJJTlRGKG5hbWUsbGV2ZWwsdGV4dC4uLikgXAorCWRvIHsgXAorCQlkZWJ1Z19zcHJpbnRmX2V2ZW50KGl1Y3ZfZGJmX3RyYWNlLCBsZXZlbCwgIyN0ZXh0ICk7IFwKKwkJZGVidWdfc3ByaW50Zl9ldmVudChpdWN2X2RiZl90cmFjZSwgbGV2ZWwsIHRleHQgKTsgXAorCX0gd2hpbGUgKDApCisKKy8qKgorICogc29tZSBtb3JlIGRlYnVnIHN0dWZmCisgKi8KKyNkZWZpbmUgSVVDVl9IRVhEVU1QMTYoaW1wb3J0YW5jZSxoZWFkZXIscHRyKSBcCitQUklOVF8jI2ltcG9ydGFuY2UoaGVhZGVyICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICAiIFwKKwkJICAgIiUwMnggJTAyeCAlMDJ4ICUwMnggICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIFwKKwkJICAgKigoKGNoYXIqKXB0cikpLCooKChjaGFyKilwdHIpKzEpLCooKChjaGFyKilwdHIpKzIpLCBcCisJCSAgICooKChjaGFyKilwdHIpKzMpLCooKChjaGFyKilwdHIpKzQpLCooKChjaGFyKilwdHIpKzUpLCBcCisJCSAgICooKChjaGFyKilwdHIpKzYpLCooKChjaGFyKilwdHIpKzcpLCooKChjaGFyKilwdHIpKzgpLCBcCisJCSAgICooKChjaGFyKilwdHIpKzkpLCooKChjaGFyKilwdHIpKzEwKSwqKCgoY2hhciopcHRyKSsxMSksIFwKKwkJICAgKigoKGNoYXIqKXB0cikrMTIpLCooKChjaGFyKilwdHIpKzEzKSwgXAorCQkgICAqKCgoY2hhciopcHRyKSsxNCksKigoKGNoYXIqKXB0cikrMTUpKTsgXAorUFJJTlRfIyNpbXBvcnRhbmNlKGhlYWRlciAiJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgIiBcCisJCSAgICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBcCisJCSAgICooKChjaGFyKilwdHIpKzE2KSwqKCgoY2hhciopcHRyKSsxNyksIFwKKwkJICAgKigoKGNoYXIqKXB0cikrMTgpLCooKChjaGFyKilwdHIpKzE5KSwgXAorCQkgICAqKCgoY2hhciopcHRyKSsyMCksKigoKGNoYXIqKXB0cikrMjEpLCBcCisJCSAgICooKChjaGFyKilwdHIpKzIyKSwqKCgoY2hhciopcHRyKSsyMyksIFwKKwkJICAgKigoKGNoYXIqKXB0cikrMjQpLCooKChjaGFyKilwdHIpKzI1KSwgXAorCQkgICAqKCgoY2hhciopcHRyKSsyNiksKigoKGNoYXIqKXB0cikrMjcpLCBcCisJCSAgICooKChjaGFyKilwdHIpKzI4KSwqKCgoY2hhciopcHRyKSsyOSksIFwKKwkJICAgKigoKGNoYXIqKXB0cikrMzApLCooKChjaGFyKilwdHIpKzMxKSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpdWN2X2hleF9kdW1wKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoaSAmJiAhKGkgJSAxNikpCisJCQlwcmludGsoIlxuIik7CisJCXByaW50aygiJTAyeCAiLCAqKGJ1ZiArIGkpKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQogCiAjZGVmaW5lIFBSSU5US19IRUFERVIgIiBpdWN2OiAiICAgICAgIC8qIGZvciBkZWJ1Z2dpbmcgKi8KIApAQCAtNzMsNiArMTU0LDI1IEBACiAJLmJ1cyAgPSAmaXVjdl9idXMsCiB9OwogCitzdGF0aWMgaW50IG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlcShzdHJ1Y3QgaXVjdl9wYXRoICosCisJCQkJICAgIHU4IGlwdm1pZFs4XSwgdTggaXB1c2VyWzE2XSk7CitzdGF0aWMgdm9pZCBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5hY2soc3RydWN0IGl1Y3ZfcGF0aCAqLCB1OCBpcHVzZXJbMTZdKTsKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlaihzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdXNlclsxNl0pOworc3RhdGljIHZvaWQgbmV0aXVjdl9jYWxsYmFja19jb25uc3VzcChzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdXNlclsxNl0pOworc3RhdGljIHZvaWQgbmV0aXVjdl9jYWxsYmFja19jb25ucmVzKHN0cnVjdCBpdWN2X3BhdGggKiwgdTggaXB1c2VyWzE2XSk7CitzdGF0aWMgdm9pZCBuZXRpdWN2X2NhbGxiYWNrX3J4KHN0cnVjdCBpdWN2X3BhdGggKiwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqKTsKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfY2FsbGJhY2tfdHhkb25lKHN0cnVjdCBpdWN2X3BhdGggKiwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqKTsKKworc3RhdGljIHN0cnVjdCBpdWN2X2hhbmRsZXIgbmV0aXVjdl9oYW5kbGVyID0geworCS5wYXRoX3BlbmRpbmcJICA9IG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlcSwKKwkucGF0aF9jb21wbGV0ZQkgID0gbmV0aXVjdl9jYWxsYmFja19jb25uYWNrLAorCS5wYXRoX3NldmVyZWQJICA9IG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlaiwKKwkucGF0aF9xdWllc2NlZAkgID0gbmV0aXVjdl9jYWxsYmFja19jb25uc3VzcCwKKwkucGF0aF9yZXN1bWVkCSAgPSBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZXMsCisJLm1lc3NhZ2VfcGVuZGluZyAgPSBuZXRpdWN2X2NhbGxiYWNrX3J4LAorCS5tZXNzYWdlX2NvbXBsZXRlID0gbmV0aXVjdl9jYWxsYmFja190eGRvbmUKK307CisKIC8qKgogICogUGVyIGNvbm5lY3Rpb24gcHJvZmlsaW5nIGRhdGEKICAqLwpAQCAtOTIsOSArMTkyLDggQEAKICAqIFJlcHJlc2VudGF0aW9uIG9mIG9uZSBpdWN2IGNvbm5lY3Rpb24KICAqLwogc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiB7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAgICAqbmV4dDsKLQlpdWN2X2hhbmRsZV90ICAgICAgICAgICAgIGhhbmRsZTsKLQlfX3UxNiAgICAgICAgICAgICAgICAgICAgIHBhdGhpZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSAgbGlzdDsKKwlzdHJ1Y3QgaXVjdl9wYXRoCSAgKnBhdGg7CiAJc3RydWN0IHNrX2J1ZmYgICAgICAgICAgICAqcnhfYnVmZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAgICp0eF9idWZmOwogCXN0cnVjdCBza19idWZmX2hlYWQgICAgICAgY29sbGVjdF9xdWV1ZTsKQEAgLTExMiwxMiArMjExLDkgQEAKIC8qKgogICogTGlua2VkIGxpc3Qgb2YgYWxsIGNvbm5lY3Rpb24gc3RydWN0cy4KICAqLwotc3RydWN0IGl1Y3ZfY29ubmVjdGlvbl9zdHJ1Y3QgewotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKml1Y3ZfY29ubmVjdGlvbnM7Ci0Jcndsb2NrX3QgaXVjdl9yd2xvY2s7Ci19OwotCi1zdGF0aWMgc3RydWN0IGl1Y3ZfY29ubmVjdGlvbl9zdHJ1Y3QgaXVjdl9jb25uczsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGl1Y3ZfY29ubmVjdGlvbl9saXN0ID0KKwlMSVNUX0hFQURfSU5JVChpdWN2X2Nvbm5lY3Rpb25fbGlzdCk7CitzdGF0aWMgcndsb2NrX3QgaXVjdl9jb25uZWN0aW9uX3J3bG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQ7CiAKIC8qKgogICogUmVwcmVzZW50YXRpb24gb2YgZXZlbnQtZGF0YSBmb3IgdGhlCkBAIC0xNDIsMTEgKzIzOCwxMSBAQAogLyoqCiAgKiBMaW5rIGxldmVsIGhlYWRlciBmb3IgYSBwYWNrZXQuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGxsX2hlYWRlcl90IHsKLQlfX3UxNiBuZXh0OwotfSBsbF9oZWFkZXI7CitzdHJ1Y3QgbGxfaGVhZGVyIHsKKwl1MTYgbmV4dDsKK307CiAKLSNkZWZpbmUgTkVUSVVDVl9IRFJMRU4gICAgICAgICAgIChzaXplb2YobGxfaGVhZGVyKSkKKyNkZWZpbmUgTkVUSVVDVl9IRFJMRU4JCSAoc2l6ZW9mKHN0cnVjdCBsbF9oZWFkZXIpKQogI2RlZmluZSBORVRJVUNWX0JVRlNJWkVfTUFYICAgICAgMzI3NjgKICNkZWZpbmUgTkVUSVVDVl9CVUZTSVpFX0RFRkFVTFQgIE5FVElVQ1ZfQlVGU0laRV9NQVgKICNkZWZpbmUgTkVUSVVDVl9NVFVfTUFYICAgICAgICAgIChORVRJVUNWX0JVRlNJWkVfTUFYIC0gTkVUSVVDVl9IRFJMRU4pCkBAIC0xNTgsMzYgKzI1NCwyNiBAQAogICogQ29tcGF0aWJpbGl0eSBtYWNyb3MgZm9yIGJ1c3kgaGFuZGxpbmcKICAqIG9mIG5ldHdvcmsgZGV2aWNlcy4KICAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBuZXRpdWN2X2NsZWFyX2J1c3koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRpdWN2X2NsZWFyX2J1c3koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQljbGVhcl9iaXQoMCwgJigoKHN0cnVjdCBuZXRpdWN2X3ByaXYgKilkZXYtPnByaXYpLT50YnVzeSkpOworCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNsZWFyX2JpdCgwLCAmcHJpdi0+dGJ1c3kpOwogCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IG5ldGl1Y3ZfdGVzdF9hbmRfc2V0X2J1c3koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgaW50IG5ldGl1Y3ZfdGVzdF9hbmRfc2V0X2J1c3koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJigoc3RydWN0IG5ldGl1Y3ZfcHJpdiAqKWRldi0+cHJpdiktPnRidXN5KTsKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCAmcHJpdi0+dGJ1c3kpOwogfQogCi1zdGF0aWMgX191OCBpdWN2X2hvc3RbOF0gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLXN0YXRpYyBfX3U4IGl1Y3ZNYWdpY1sxNl0gPSB7CitzdGF0aWMgdTggaXVjdk1hZ2ljWzE2XSA9IHsKIAkweEYwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLAogCTB4RjAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAKIH07CiAKIC8qKgotICogVGhpcyBtYXNrIG1lYW5zIHRoZSAxNi1ieXRlIElVQ1YgIm1hZ2ljIiBhbmQgdGhlIG9yaWdpbiB1c2VyaWQgbXVzdAotICogbWF0Y2ggZXhhY3RseSBhcyBzcGVjaWZpZWQgaW4gb3JkZXIgdG8gZ2l2ZSBjb25uZWN0aW9uX3BlbmRpbmcoKQotICogY29udHJvbC4KLSAqLwotc3RhdGljIF9fdTggbmV0aXVjdl9tYXNrW10gPSB7Ci0JMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKLX07Ci0KLS8qKgogICogQ29udmVydCBhbiBpdWN2IHVzZXJJZCB0byBpdHMgcHJpbnRhYmxlCiAgKiBmb3JtIChzdHJpcCB3aGl0ZXNwYWNlIGF0IGVuZCkuCiAgKgpAQCAtMTk1LDggKzI4MSw3IEBACiAgKgogICogQHJldHVybnMgVGhlIHByaW50YWJsZSBzdHJpbmcgKHN0YXRpYyBkYXRhISEpCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIGNoYXIgKgotbmV0aXVjdl9wcmludG5hbWUoY2hhciAqbmFtZSkKK3N0YXRpYyBpbmxpbmUgY2hhciAqbmV0aXVjdl9wcmludG5hbWUoY2hhciAqbmFtZSkKIHsKIAlzdGF0aWMgY2hhciB0bXBbOV07CiAJY2hhciAqcCA9IHRtcDsKQEAgLTM3OSw4ICs0NjQsNyBAQAogCiBERUZJTkVfUEVSX0NQVShjaGFyWzI1Nl0sIGl1Y3ZfZGJmX3R4dF9idWYpOwogCi1zdGF0aWMgdm9pZAotaXVjdl91bnJlZ2lzdGVyX2RiZl92aWV3cyh2b2lkKQorc3RhdGljIHZvaWQgaXVjdl91bnJlZ2lzdGVyX2RiZl92aWV3cyh2b2lkKQogewogCWlmIChpdWN2X2RiZl9zZXR1cCkKIAkJZGVidWdfdW5yZWdpc3RlcihpdWN2X2RiZl9zZXR1cCk7CkBAIC0zODksOCArNDczLDcgQEAKIAlpZiAoaXVjdl9kYmZfdHJhY2UpCiAJCWRlYnVnX3VucmVnaXN0ZXIoaXVjdl9kYmZfdHJhY2UpOwogfQotc3RhdGljIGludAotaXVjdl9yZWdpc3Rlcl9kYmZfdmlld3Modm9pZCkKK3N0YXRpYyBpbnQgaXVjdl9yZWdpc3Rlcl9kYmZfdmlld3Modm9pZCkKIHsKIAlpdWN2X2RiZl9zZXR1cCA9IGRlYnVnX3JlZ2lzdGVyKElVQ1ZfREJGX1NFVFVQX05BTUUsCiAJCQkJCUlVQ1ZfREJGX1NFVFVQX1BBR0VTLApAQCAtNDIyLDEyNSArNTA1LDExMSBAQAogCXJldHVybiAwOwogfQogCi0vKioKKy8qCiAgKiBDYWxsYmFjay13cmFwcGVycywgY2FsbGVkIGZyb20gbG93bGV2ZWwgaXVjdiBsYXllci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogCi1zdGF0aWMgdm9pZAotbmV0aXVjdl9jYWxsYmFja19yeChpdWN2X01lc3NhZ2VQZW5kaW5nICplaWIsIHZvaWQgKnBnbV9kYXRhKQorc3RhdGljIHZvaWQgbmV0aXVjdl9jYWxsYmFja19yeChzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLAorCQkJCXN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZykKIHsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKilwZ21fZGF0YTsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gcGF0aC0+cHJpdmF0ZTsKIAlzdHJ1Y3QgaXVjdl9ldmVudCBldjsKIAogCWV2LmNvbm4gPSBjb25uOwotCWV2LmRhdGEgPSAodm9pZCAqKWVpYjsKLQorCWV2LmRhdGEgPSBtc2c7CiAJZnNtX2V2ZW50KGNvbm4tPmZzbSwgQ09OTl9FVkVOVF9SWCwgJmV2KTsKIH0KIAotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfY2FsbGJhY2tfdHhkb25lKGl1Y3ZfTWVzc2FnZUNvbXBsZXRlICplaWIsIHZvaWQgKnBnbV9kYXRhKQorc3RhdGljIHZvaWQgbmV0aXVjdl9jYWxsYmFja190eGRvbmUoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwKKwkJCQkgICAgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnKQogewotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSAoc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqKXBnbV9kYXRhOworCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSBwYXRoLT5wcml2YXRlOwogCXN0cnVjdCBpdWN2X2V2ZW50IGV2OwogCiAJZXYuY29ubiA9IGNvbm47Ci0JZXYuZGF0YSA9ICh2b2lkICopZWliOworCWV2LmRhdGEgPSBtc2c7CiAJZnNtX2V2ZW50KGNvbm4tPmZzbSwgQ09OTl9FVkVOVF9UWERPTkUsICZldik7CiB9CiAKLXN0YXRpYyB2b2lkCi1uZXRpdWN2X2NhbGxiYWNrX2Nvbm5hY2soaXVjdl9Db25uZWN0aW9uQ29tcGxldGUgKmVpYiwgdm9pZCAqcGdtX2RhdGEpCitzdGF0aWMgdm9pZCBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5hY2soc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggaXB1c2VyWzE2XSkKIHsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKilwZ21fZGF0YTsKLQlzdHJ1Y3QgaXVjdl9ldmVudCBldjsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gcGF0aC0+cHJpdmF0ZTsKIAotCWV2LmNvbm4gPSBjb25uOwotCWV2LmRhdGEgPSAodm9pZCAqKWVpYjsKLQlmc21fZXZlbnQoY29ubi0+ZnNtLCBDT05OX0VWRU5UX0NPTk5fQUNLLCAmZXYpOworCWZzbV9ldmVudChjb25uLT5mc20sIENPTk5fRVZFTlRfQ09OTl9BQ0ssIGNvbm4pOwogfQogCi1zdGF0aWMgdm9pZAotbmV0aXVjdl9jYWxsYmFja19jb25ucmVxKGl1Y3ZfQ29ubmVjdGlvblBlbmRpbmcgKmVpYiwgdm9pZCAqcGdtX2RhdGEpCitzdGF0aWMgaW50IG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlcShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLAorCQkJCSAgICB1OCBpcHZtaWRbOF0sIHU4IGlwdXNlclsxNl0pCiB7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IChzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICopcGdtX2RhdGE7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IHBhdGgtPnByaXZhdGU7CiAJc3RydWN0IGl1Y3ZfZXZlbnQgZXY7CisJaW50IHJjOwogCi0JZXYuY29ubiA9IGNvbm47Ci0JZXYuZGF0YSA9ICh2b2lkICopZWliOwotCWZzbV9ldmVudChjb25uLT5mc20sIENPTk5fRVZFTlRfQ09OTl9SRVEsICZldik7CisJaWYgKG1lbWNtcChpdWN2TWFnaWMsIGlwdXNlciwgc2l6ZW9mKGlwdXNlcikpKQorCQkvKiBpcHVzZXIgbXVzdCBtYXRjaCBpdWN2TWFnaWMuICovCisJCXJldHVybiAtRUlOVkFMOworCXJjID0gLUVJTlZBTDsKKwlyZWFkX2xvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJml1Y3ZfY29ubmVjdGlvbl9saXN0LCBsaXN0KSB7CisJCWlmIChzdHJuY21wKGlwdm1pZCwgY29ubi0+dXNlcmlkLCA4KSkKKwkJCWNvbnRpbnVlOworCQkvKiBGb3VuZCBhIG1hdGNoaW5nIGNvbm5lY3Rpb24gZm9yIHRoaXMgcGF0aC4gKi8KKwkJY29ubi0+cGF0aCA9IHBhdGg7CisJCWV2LmNvbm4gPSBjb25uOworCQlldi5kYXRhID0gcGF0aDsKKwkJZnNtX2V2ZW50KGNvbm4tPmZzbSwgQ09OTl9FVkVOVF9DT05OX1JFUSwgJmV2KTsKKwkJcmMgPSAwOworCX0KKwlyZWFkX3VubG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CisJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZAotbmV0aXVjdl9jYWxsYmFja19jb25ucmVqKGl1Y3ZfQ29ubmVjdGlvblNldmVyZWQgKmVpYiwgdm9pZCAqcGdtX2RhdGEpCitzdGF0aWMgdm9pZCBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZWooc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggaXB1c2VyWzE2XSkKIHsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKilwZ21fZGF0YTsKLQlzdHJ1Y3QgaXVjdl9ldmVudCBldjsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gcGF0aC0+cHJpdmF0ZTsKIAotCWV2LmNvbm4gPSBjb25uOwotCWV2LmRhdGEgPSAodm9pZCAqKWVpYjsKLQlmc21fZXZlbnQoY29ubi0+ZnNtLCBDT05OX0VWRU5UX0NPTk5fUkVKLCAmZXYpOworCWZzbV9ldmVudChjb25uLT5mc20sIENPTk5fRVZFTlRfQ09OTl9SRUosIGNvbm4pOwogfQogCi1zdGF0aWMgdm9pZAotbmV0aXVjdl9jYWxsYmFja19jb25uc3VzcChpdWN2X0Nvbm5lY3Rpb25RdWllc2NlZCAqZWliLCB2b2lkICpwZ21fZGF0YSkKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnN1c3Aoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggaXB1c2VyWzE2XSkKIHsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKilwZ21fZGF0YTsKLQlzdHJ1Y3QgaXVjdl9ldmVudCBldjsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gcGF0aC0+cHJpdmF0ZTsKIAotCWV2LmNvbm4gPSBjb25uOwotCWV2LmRhdGEgPSAodm9pZCAqKWVpYjsKLQlmc21fZXZlbnQoY29ubi0+ZnNtLCBDT05OX0VWRU5UX0NPTk5fU1VTLCAmZXYpOworCWZzbV9ldmVudChjb25uLT5mc20sIENPTk5fRVZFTlRfQ09OTl9TVVMsIGNvbm4pOwogfQogCi1zdGF0aWMgdm9pZAotbmV0aXVjdl9jYWxsYmFja19jb25ucmVzKGl1Y3ZfQ29ubmVjdGlvblJlc3VtZWQgKmVpYiwgdm9pZCAqcGdtX2RhdGEpCitzdGF0aWMgdm9pZCBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZXMoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggaXB1c2VyWzE2XSkKIHsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKilwZ21fZGF0YTsKLQlzdHJ1Y3QgaXVjdl9ldmVudCBldjsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gcGF0aC0+cHJpdmF0ZTsKIAotCWV2LmNvbm4gPSBjb25uOwotCWV2LmRhdGEgPSAodm9pZCAqKWVpYjsKLQlmc21fZXZlbnQoY29ubi0+ZnNtLCBDT05OX0VWRU5UX0NPTk5fUkVTLCAmZXYpOworCWZzbV9ldmVudChjb25uLT5mc20sIENPTk5fRVZFTlRfQ09OTl9SRVMsIGNvbm4pOwogfQogCi1zdGF0aWMgaXVjdl9pbnRlcnJ1cHRfb3BzX3QgbmV0aXVjdl9vcHMgPSB7Ci0JLkNvbm5lY3Rpb25QZW5kaW5nICA9IG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlcSwKLQkuQ29ubmVjdGlvbkNvbXBsZXRlID0gbmV0aXVjdl9jYWxsYmFja19jb25uYWNrLAotCS5Db25uZWN0aW9uU2V2ZXJlZCAgPSBuZXRpdWN2X2NhbGxiYWNrX2Nvbm5yZWosCi0JLkNvbm5lY3Rpb25RdWllc2NlZCA9IG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnN1c3AsCi0JLkNvbm5lY3Rpb25SZXN1bWVkICA9IG5ldGl1Y3ZfY2FsbGJhY2tfY29ubnJlcywKLQkuTWVzc2FnZVBlbmRpbmcgICAgID0gbmV0aXVjdl9jYWxsYmFja19yeCwKLQkuTWVzc2FnZUNvbXBsZXRlICAgID0gbmV0aXVjdl9jYWxsYmFja190eGRvbmUKLX07Ci0KIC8qKgogICogRHVtbXkgTk9QIGFjdGlvbiBmb3IgYWxsIHN0YXRlbWFjaGluZXMKICAqLwotc3RhdGljIHZvaWQKLWZzbV9hY3Rpb25fbm9wKGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgZnNtX2FjdGlvbl9ub3AoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7CiB9CiAKLS8qKgorLyoKICAqIEFjdGlvbnMgb2YgdGhlIGNvbm5lY3Rpb24gc3RhdGVtYWNoaW5lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIAogLyoqCi0gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGNvbm5fYWN0aW9uX3J4KCkKLSAqIFVucGFjayBhIGp1c3QgcmVjZWl2ZWQgc2tiIGFuZCBoYW5kIGl0IG92ZXIgdG8KLSAqIHVwcGVyIGxheWVycy4KKyAqIG5ldGl1Y3ZfdW5wYWNrX3NrYgorICogQGNvbm46IFRoZSBjb25uZWN0aW9uIHdoZXJlIHRoaXMgc2tiIGhhcyBiZWVuIHJlY2VpdmVkLgorICogQHBza2I6IFRoZSByZWNlaXZlZCBza2IuCiAgKgotICogQHBhcmFtIGNvbm4gVGhlIGNvbm5lY3Rpb24gd2hlcmUgdGhpcyBza2IgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gKiBAcGFyYW0gcHNrYiBUaGUgcmVjZWl2ZWQgc2tiLgorICogVW5wYWNrIGEganVzdCByZWNlaXZlZCBza2IgYW5kIGhhbmQgaXQgb3ZlciB0byB1cHBlciBsYXllcnMuCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGNvbm5fYWN0aW9uX3J4LgogICovCi0vL3N0YXRpYyBfX2lubGluZV9fIHZvaWQKLXN0YXRpYyB2b2lkCi1uZXRpdWN2X3VucGFja19za2Ioc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnBza2IpCitzdGF0aWMgdm9pZCBuZXRpdWN2X3VucGFja19za2Ioc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcHNrYikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAgICAgKmRldiA9IGNvbm4tPm5ldGRldjsKLQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICAgKnByaXZwdHIgPSBkZXYtPnByaXY7Ci0JX191MTYgICAgICAgICAgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICAgKnByaXZwdHIgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBvZmZzZXQgPSAwOwogCiAJc2tiX3B1dChwc2tiLCBORVRJVUNWX0hEUkxFTik7CiAJcHNrYi0+ZGV2ID0gZGV2OwpAQCAtNTQ5LDcgKzYxOCw3IEBACiAKIAl3aGlsZSAoMSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCQlsbF9oZWFkZXIgKmhlYWRlciA9IChsbF9oZWFkZXIgKilwc2tiLT5kYXRhOworCQlzdHJ1Y3QgbGxfaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IGxsX2hlYWRlciAqKSBwc2tiLT5kYXRhOwogCiAJCWlmICghaGVhZGVyLT5uZXh0KQogCQkJYnJlYWs7CkBAIC01OTUsNDAgKzY2NCwzNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQKLWNvbm5fYWN0aW9uX3J4KGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgY29ubl9hY3Rpb25fcngoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgKmV2ID0gKHN0cnVjdCBpdWN2X2V2ZW50ICopYXJnOworCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IGFyZzsKIAlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gZXYtPmNvbm47Ci0JaXVjdl9NZXNzYWdlUGVuZGluZyAqZWliID0gKGl1Y3ZfTWVzc2FnZVBlbmRpbmcgKilldi0+ZGF0YTsKLQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0oc3RydWN0IG5ldGl1Y3ZfcHJpdiAqKWNvbm4tPm5ldGRldi0+cHJpdjsKLQotCV9fdTMyIG1zZ2xlbiA9IGVpYi0+bG4xbXNnMi5pcGJmbG4xZjsKKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2cgPSBldi0+ZGF0YTsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gbmV0ZGV2X3ByaXYoY29ubi0+bmV0ZGV2KTsKIAlpbnQgcmM7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCA0LCBfX0ZVTkNUSU9OX18pOwogCiAJaWYgKCFjb25uLT5uZXRkZXYpIHsKLQkJLyogRlJJVFo6IEhvdyB0byB0ZWxsIGl1Y3YgTEwgdG8gZHJvcCB0aGUgbXNnPyAqLworCQlpdWN2X21lc3NhZ2VfcmVqZWN0KGNvbm4tPnBhdGgsIG1zZyk7CiAJCVBSSU5UX1dBUk4oIlJlY2VpdmVkIGRhdGEgZm9yIHVubGlua2VkIGNvbm5lY3Rpb25cbiIpOwogCQlJVUNWX0RCRl9URVhUKGRhdGEsIDIsCi0JCQkiUmVjZWl2ZWQgZGF0YSBmb3IgdW5saW5rZWQgY29ubmVjdGlvblxuIik7CisJCQkgICAgICAiUmVjZWl2ZWQgZGF0YSBmb3IgdW5saW5rZWQgY29ubmVjdGlvblxuIik7CiAJCXJldHVybjsKIAl9Ci0JaWYgKG1zZ2xlbiA+IGNvbm4tPm1heF9idWZmc2l6ZSkgewotCQkvKiBGUklUWjogSG93IHRvIHRlbGwgaXVjdiBMTCB0byBkcm9wIHRoZSBtc2c/ICovCisJaWYgKG1zZy0+bGVuZ3RoID4gY29ubi0+bWF4X2J1ZmZzaXplKSB7CisJCWl1Y3ZfbWVzc2FnZV9yZWplY3QoY29ubi0+cGF0aCwgbXNnKTsKIAkJcHJpdnB0ci0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlQUklOVF9XQVJOKCJtc2dsZW4gJWQgPiBtYXhfYnVmZnNpemUgJWRcbiIsCi0JCQltc2dsZW4sIGNvbm4tPm1heF9idWZmc2l6ZSk7CisJCQkgICBtc2ctPmxlbmd0aCwgY29ubi0+bWF4X2J1ZmZzaXplKTsKIAkJSVVDVl9EQkZfVEVYVF8oZGF0YSwgMiwgIm1zZ2xlbiAlZCA+IG1heF9idWZmc2l6ZSAlZFxuIiwKLQkJCW1zZ2xlbiwgY29ubi0+bWF4X2J1ZmZzaXplKTsKKwkJCSAgICAgICBtc2ctPmxlbmd0aCwgY29ubi0+bWF4X2J1ZmZzaXplKTsKIAkJcmV0dXJuOwogCX0KIAljb25uLT5yeF9idWZmLT5kYXRhID0gY29ubi0+cnhfYnVmZi0+dGFpbCA9IGNvbm4tPnJ4X2J1ZmYtPmhlYWQ7CiAJY29ubi0+cnhfYnVmZi0+bGVuID0gMDsKLQlyYyA9IGl1Y3ZfcmVjZWl2ZShjb25uLT5wYXRoaWQsIGVpYi0+aXBtc2dpZCwgZWliLT5pcHRyZ2NscywKLQkJCSAgY29ubi0+cnhfYnVmZi0+ZGF0YSwgbXNnbGVuLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAocmMgfHwgbXNnbGVuIDwgNSkgeworCXJjID0gaXVjdl9tZXNzYWdlX3JlY2VpdmUoY29ubi0+cGF0aCwgbXNnLCAwLCBjb25uLT5yeF9idWZmLT5kYXRhLAorCQkJCSAgbXNnLT5sZW5ndGgsIE5VTEwpOworCWlmIChyYyB8fCBtc2ctPmxlbmd0aCA8IDUpIHsKIAkJcHJpdnB0ci0+c3RhdHMucnhfZXJyb3JzKys7CiAJCVBSSU5UX1dBUk4oIml1Y3ZfcmVjZWl2ZSByZXR1cm5lZCAlMDh4XG4iLCByYyk7CiAJCUlVQ1ZfREJGX1RFWFRfKGRhdGEsIDIsICJyYyAlZCBmcm9tIGl1Y3ZfcmVjZWl2ZVxuIiwgcmMpOwpAQCAtNjM3LDI2ICs3MDMsMjYgQEAKIAluZXRpdWN2X3VucGFja19za2IoY29ubiwgY29ubi0+cnhfYnVmZik7CiB9CiAKLXN0YXRpYyB2b2lkCi1jb25uX2FjdGlvbl90eGRvbmUoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCitzdGF0aWMgdm9pZCBjb25uX2FjdGlvbl90eGRvbmUoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgKmV2ID0gKHN0cnVjdCBpdWN2X2V2ZW50ICopYXJnOworCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IGFyZzsKIAlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gZXYtPmNvbm47Ci0JaXVjdl9NZXNzYWdlQ29tcGxldGUgKmVpYiA9IChpdWN2X01lc3NhZ2VDb21wbGV0ZSAqKWV2LT5kYXRhOworCXN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZyA9IGV2LT5kYXRhOworCXN0cnVjdCBpdWN2X21lc3NhZ2UgdHhtc2c7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IE5VTEw7Ci0JCQkgICAgICAgICAvKiBTaHV0IHVwLCBnY2MhIHNrYiBpcyBhbHdheXMgYmVsb3cgMkcuICovCi0JX191MzIgc2luZ2xlX2ZsYWcgPSBlaWItPmlwbXNndGFnOwotCV9fdTMyIHR4Ynl0ZXMgPSAwOwotCV9fdTMyIHR4cGFja2V0cyA9IDA7Ci0JX191MzIgc3RhdF9tYXhjcSA9IDA7CisJdTMyIHNpbmdsZV9mbGFnID0gbXNnLT50YWc7CisJdTMyIHR4Ynl0ZXMgPSAwOworCXUzMiB0eHBhY2tldHMgPSAwOworCXUzMiBzdGF0X21heGNxID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGxvbmcgc2F2ZWZsYWdzOwotCWxsX2hlYWRlciBoZWFkZXI7CisJc3RydWN0IGxsX2hlYWRlciBoZWFkZXI7CisJaW50IHJjOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgNCwgX19GVU5DVElPTl9fKTsKIAotCWlmIChjb25uICYmIGNvbm4tPm5ldGRldiAmJiBjb25uLT5uZXRkZXYtPnByaXYpCi0JCXByaXZwdHIgPSAoc3RydWN0IG5ldGl1Y3ZfcHJpdiAqKWNvbm4tPm5ldGRldi0+cHJpdjsKKwlpZiAoY29ubiAmJiBjb25uLT5uZXRkZXYpCisJCXByaXZwdHIgPSBuZXRkZXZfcHJpdihjb25uLT5uZXRkZXYpOwogCWNvbm4tPnByb2YudHhfcGVuZGluZy0tOwogCWlmIChzaW5nbGVfZmxhZykgewogCQlpZiAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjb25uLT5jb21taXRfcXVldWUpKSkgewpAQCAtNjg4LDU2ICs3NTQsNTUgQEAKIAkJY29ubi0+cHJvZi5tYXhtdWx0aSA9IGNvbm4tPmNvbGxlY3RfbGVuOwogCWNvbm4tPmNvbGxlY3RfbGVuID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25uLT5jb2xsZWN0X2xvY2ssIHNhdmVmbGFncyk7Ci0JaWYgKGNvbm4tPnR4X2J1ZmYtPmxlbikgewotCQlpbnQgcmM7Ci0KLQkJaGVhZGVyLm5leHQgPSAwOwotCQltZW1jcHkoc2tiX3B1dChjb25uLT50eF9idWZmLCBORVRJVUNWX0hEUkxFTiksICZoZWFkZXIsCi0JCSAgICAgICBORVRJVUNWX0hEUkxFTik7Ci0KLQkJY29ubi0+cHJvZi5zZW5kX3N0YW1wID0geHRpbWU7Ci0JCXJjID0gaXVjdl9zZW5kKGNvbm4tPnBhdGhpZCwgTlVMTCwgMCwgMCwgMCwgMCwKLQkJCSAgICAgICBjb25uLT50eF9idWZmLT5kYXRhLCBjb25uLT50eF9idWZmLT5sZW4pOwotCQljb25uLT5wcm9mLmRvaW9zX211bHRpKys7Ci0JCWNvbm4tPnByb2YudHhsZW4gKz0gY29ubi0+dHhfYnVmZi0+bGVuOwotCQljb25uLT5wcm9mLnR4X3BlbmRpbmcrKzsKLQkJaWYgKGNvbm4tPnByb2YudHhfcGVuZGluZyA+IGNvbm4tPnByb2YudHhfbWF4X3BlbmRpbmcpCi0JCQljb25uLT5wcm9mLnR4X21heF9wZW5kaW5nID0gY29ubi0+cHJvZi50eF9wZW5kaW5nOwotCQlpZiAocmMpIHsKLQkJCWNvbm4tPnByb2YudHhfcGVuZGluZy0tOwotCQkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX0lETEUpOwotCQkJaWYgKHByaXZwdHIpCi0JCQkJcHJpdnB0ci0+c3RhdHMudHhfZXJyb3JzICs9IHR4cGFja2V0czsKLQkJCVBSSU5UX1dBUk4oIml1Y3Zfc2VuZCByZXR1cm5lZCAlMDh4XG4iLAlyYyk7Ci0JCQlJVUNWX0RCRl9URVhUXyhkYXRhLCAyLCAicmMgJWQgZnJvbSBpdWN2X3NlbmRcbiIsIHJjKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwcml2cHRyKSB7Ci0JCQkJcHJpdnB0ci0+c3RhdHMudHhfcGFja2V0cyArPSB0eHBhY2tldHM7Ci0JCQkJcHJpdnB0ci0+c3RhdHMudHhfYnl0ZXMgKz0gdHhieXRlczsKLQkJCX0KLQkJCWlmIChzdGF0X21heGNxID4gY29ubi0+cHJvZi5tYXhjcXVldWUpCi0JCQkJY29ubi0+cHJvZi5tYXhjcXVldWUgPSBzdGF0X21heGNxOwotCQl9Ci0JfSBlbHNlCisJaWYgKGNvbm4tPnR4X2J1ZmYtPmxlbiA9PSAwKSB7CiAJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9JRExFKTsKKwkJcmV0dXJuOworCX0KKworCWhlYWRlci5uZXh0ID0gMDsKKwltZW1jcHkoc2tiX3B1dChjb25uLT50eF9idWZmLCBORVRJVUNWX0hEUkxFTiksICZoZWFkZXIsIE5FVElVQ1ZfSERSTEVOKTsKKwljb25uLT5wcm9mLnNlbmRfc3RhbXAgPSB4dGltZTsKKwl0eG1zZy5jbGFzcyA9IDA7CisJdHhtc2cudGFnID0gMDsKKwlyYyA9IGl1Y3ZfbWVzc2FnZV9zZW5kKGNvbm4tPnBhdGgsICZ0eG1zZywgMCwgMCwKKwkJCSAgICAgICBjb25uLT50eF9idWZmLT5kYXRhLCBjb25uLT50eF9idWZmLT5sZW4pOworCWNvbm4tPnByb2YuZG9pb3NfbXVsdGkrKzsKKwljb25uLT5wcm9mLnR4bGVuICs9IGNvbm4tPnR4X2J1ZmYtPmxlbjsKKwljb25uLT5wcm9mLnR4X3BlbmRpbmcrKzsKKwlpZiAoY29ubi0+cHJvZi50eF9wZW5kaW5nID4gY29ubi0+cHJvZi50eF9tYXhfcGVuZGluZykKKwkJY29ubi0+cHJvZi50eF9tYXhfcGVuZGluZyA9IGNvbm4tPnByb2YudHhfcGVuZGluZzsKKwlpZiAocmMpIHsKKwkJY29ubi0+cHJvZi50eF9wZW5kaW5nLS07CisJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9JRExFKTsKKwkJaWYgKHByaXZwdHIpCisJCQlwcml2cHRyLT5zdGF0cy50eF9lcnJvcnMgKz0gdHhwYWNrZXRzOworCQlQUklOVF9XQVJOKCJpdWN2X3NlbmQgcmV0dXJuZWQgJTA4eFxuIiwJcmMpOworCQlJVUNWX0RCRl9URVhUXyhkYXRhLCAyLCAicmMgJWQgZnJvbSBpdWN2X3NlbmRcbiIsIHJjKTsKKwl9IGVsc2UgeworCQlpZiAocHJpdnB0cikgeworCQkJcHJpdnB0ci0+c3RhdHMudHhfcGFja2V0cyArPSB0eHBhY2tldHM7CisJCQlwcml2cHRyLT5zdGF0cy50eF9ieXRlcyArPSB0eGJ5dGVzOworCQl9CisJCWlmIChzdGF0X21heGNxID4gY29ubi0+cHJvZi5tYXhjcXVldWUpCisJCQljb25uLT5wcm9mLm1heGNxdWV1ZSA9IHN0YXRfbWF4Y3E7CisJfQogfQogCi1zdGF0aWMgdm9pZAotY29ubl9hY3Rpb25fY29ubmFjY2VwdChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGNvbm5fYWN0aW9uX2Nvbm5hY2NlcHQoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgKmV2ID0gKHN0cnVjdCBpdWN2X2V2ZW50ICopYXJnOworCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IGFyZzsKIAlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gZXYtPmNvbm47Ci0JaXVjdl9Db25uZWN0aW9uUGVuZGluZyAqZWliID0gKGl1Y3ZfQ29ubmVjdGlvblBlbmRpbmcgKilldi0+ZGF0YTsKKwlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoID0gZXYtPmRhdGE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGNvbm4tPm5ldGRldjsKLQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gKHN0cnVjdCBuZXRpdWN2X3ByaXYgKiluZXRkZXYtPnByaXY7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IHJjOwotCV9fdTE2IG1zZ2xpbWl0OwotCV9fdTggdWRhdGFbMTZdOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKIAotCXJjID0gaXVjdl9hY2NlcHQoZWliLT5pcHBhdGhpZCwgTkVUSVVDVl9RVUVVRUxFTl9ERUZBVUxULCB1ZGF0YSwgMCwKLQkJCSBjb25uLT5oYW5kbGUsIGNvbm4sIE5VTEwsICZtc2dsaW1pdCk7CisJY29ubi0+cGF0aCA9IHBhdGg7CisJcGF0aC0+bXNnbGltID0gTkVUSVVDVl9RVUVVRUxFTl9ERUZBVUxUOworCXBhdGgtPmZsYWdzID0gMDsKKwlyYyA9IGl1Y3ZfcGF0aF9hY2NlcHQocGF0aCwgJm5ldGl1Y3ZfaGFuZGxlciwgTlVMTCwgY29ubik7CiAJaWYgKHJjKSB7CiAJCVBSSU5UX1dBUk4oIiVzOiBJVUNWIGFjY2VwdCBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwKIAkJICAgICAgIG5ldGRldi0+bmFtZSwgcmMpOwpAQCAtNzQ1LDE4MyArODEwLDEyNiBAQAogCQlyZXR1cm47CiAJfQogCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9JRExFKTsKLQljb25uLT5wYXRoaWQgPSBlaWItPmlwcGF0aGlkOwotCW5ldGRldi0+dHhfcXVldWVfbGVuID0gbXNnbGltaXQ7CisJbmV0ZGV2LT50eF9xdWV1ZV9sZW4gPSBjb25uLT5wYXRoLT5tc2dsaW07CiAJZnNtX2V2ZW50KHByaXZwdHItPmZzbSwgREVWX0VWRU5UX0NPTlVQLCBuZXRkZXYpOwogfQogCi1zdGF0aWMgdm9pZAotY29ubl9hY3Rpb25fY29ubnJlamVjdChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGNvbm5fYWN0aW9uX2Nvbm5yZWplY3QoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgKmV2ID0gKHN0cnVjdCBpdWN2X2V2ZW50ICopYXJnOwotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSBldi0+Y29ubjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gY29ubi0+bmV0ZGV2OwotCWl1Y3ZfQ29ubmVjdGlvblBlbmRpbmcgKmVpYiA9IChpdWN2X0Nvbm5lY3Rpb25QZW5kaW5nICopZXYtPmRhdGE7Ci0JX191OCB1ZGF0YVsxNl07CisJc3RydWN0IGl1Y3ZfZXZlbnQgKmV2ID0gYXJnOworCXN0cnVjdCBpdWN2X3BhdGggKnBhdGggPSBldi0+ZGF0YTsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7Ci0KLQlpdWN2X3NldmVyKGVpYi0+aXBwYXRoaWQsIHVkYXRhKTsKLQlpZiAoZWliLT5pcHBhdGhpZCAhPSBjb25uLT5wYXRoaWQpIHsKLQkJUFJJTlRfSU5GTygiJXM6IElSIENvbm5lY3Rpb24gUGVuZGluZzsgIgotCQkJInBhdGhpZCAlZCBkb2VzIG5vdCBtYXRjaCBvcmlnaW5hbCBwYXRoaWQgJWRcbiIsCi0JCQluZXRkZXYtPm5hbWUsIGVpYi0+aXBwYXRoaWQsIGNvbm4tPnBhdGhpZCk7Ci0JCUlVQ1ZfREJGX1RFWFRfKGRhdGEsIDIsCi0JCQkiY29ubnJlamVjdDogSVIgcGF0aGlkICVkLCBjb25uLiBwYXRoaWQgJWRcbiIsCi0JCQllaWItPmlwcGF0aGlkLCBjb25uLT5wYXRoaWQpOwotCQlpdWN2X3NldmVyKGNvbm4tPnBhdGhpZCwgdWRhdGEpOwotCX0KKwlpdWN2X3BhdGhfc2V2ZXIocGF0aCwgTlVMTCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1jb25uX2FjdGlvbl9jb25uYWNrKGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgY29ubl9hY3Rpb25fY29ubmFjayhmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgaXVjdl9ldmVudCAqZXYgPSAoc3RydWN0IGl1Y3ZfZXZlbnQgKilhcmc7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IGV2LT5jb25uOwotCWl1Y3ZfQ29ubmVjdGlvbkNvbXBsZXRlICplaWIgPSAoaXVjdl9Db25uZWN0aW9uQ29tcGxldGUgKilldi0+ZGF0YTsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gYXJnOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBjb25uLT5uZXRkZXY7Ci0Jc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IChzdHJ1Y3QgbmV0aXVjdl9wcml2ICopbmV0ZGV2LT5wcml2OworCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKLQogCWZzbV9kZWx0aW1lcigmY29ubi0+dGltZXIpOwogCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9JRExFKTsKLQlpZiAoZWliLT5pcHBhdGhpZCAhPSBjb25uLT5wYXRoaWQpIHsKLQkJUFJJTlRfSU5GTygiJXM6IElSIENvbm5lY3Rpb24gQ29tcGxldGU7ICIKLQkJCSJwYXRoaWQgJWQgZG9lcyBub3QgbWF0Y2ggb3JpZ2luYWwgcGF0aGlkICVkXG4iLAotCQkJbmV0ZGV2LT5uYW1lLCBlaWItPmlwcGF0aGlkLCBjb25uLT5wYXRoaWQpOwotCQlJVUNWX0RCRl9URVhUXyhkYXRhLCAyLAotCQkJImNvbm5hY2s6IElSIHBhdGhpZCAlZCwgY29ubi4gcGF0aGlkICVkXG4iLAotCQkJZWliLT5pcHBhdGhpZCwgY29ubi0+cGF0aGlkKTsKLQkJY29ubi0+cGF0aGlkID0gZWliLT5pcHBhdGhpZDsKLQl9Ci0JbmV0ZGV2LT50eF9xdWV1ZV9sZW4gPSBlaWItPmlwbXNnbGltOworCW5ldGRldi0+dHhfcXVldWVfbGVuID0gY29ubi0+cGF0aC0+bXNnbGltOwogCWZzbV9ldmVudChwcml2cHRyLT5mc20sIERFVl9FVkVOVF9DT05VUCwgbmV0ZGV2KTsKIH0KIAotc3RhdGljIHZvaWQKLWNvbm5fYWN0aW9uX2Nvbm50aW1zZXYoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCitzdGF0aWMgdm9pZCBjb25uX2FjdGlvbl9jb25udGltc2V2KGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSAoc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqKWFyZzsKLQlfX3U4IHVkYXRhWzE2XTsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gYXJnOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKLQogCWZzbV9kZWx0aW1lcigmY29ubi0+dGltZXIpOwotCWl1Y3Zfc2V2ZXIoY29ubi0+cGF0aGlkLCB1ZGF0YSk7CisJaXVjdl9wYXRoX3NldmVyKGNvbm4tPnBhdGgsIE5VTEwpOwogCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9TVEFSVFdBSVQpOwogfQogCi1zdGF0aWMgdm9pZAotY29ubl9hY3Rpb25fY29ubnNldmVyKGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgY29ubl9hY3Rpb25fY29ubnNldmVyKGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBpdWN2X2V2ZW50ICpldiA9IChzdHJ1Y3QgaXVjdl9ldmVudCAqKWFyZzsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gZXYtPmNvbm47CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IGFyZzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gY29ubi0+bmV0ZGV2OwotCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSAoc3RydWN0IG5ldGl1Y3ZfcHJpdiAqKW5ldGRldi0+cHJpdjsKLQlfX3U4IHVkYXRhWzE2XTsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7CiAKIAlmc21fZGVsdGltZXIoJmNvbm4tPnRpbWVyKTsKLQlpdWN2X3NldmVyKGNvbm4tPnBhdGhpZCwgdWRhdGEpOworCWl1Y3ZfcGF0aF9zZXZlcihjb25uLT5wYXRoLCBOVUxMKTsKIAlQUklOVF9JTkZPKCIlczogUmVtb3RlIGRyb3BwZWQgY29ubmVjdGlvblxuIiwgbmV0ZGV2LT5uYW1lKTsKIAlJVUNWX0RCRl9URVhUKGRhdGEsIDIsCi0JCSJjb25uX2FjdGlvbl9jb25uc2V2ZXI6IFJlbW90ZSBkcm9wcGVkIGNvbm5lY3Rpb25cbiIpOworCQkgICAgICAiY29ubl9hY3Rpb25fY29ubnNldmVyOiBSZW1vdGUgZHJvcHBlZCBjb25uZWN0aW9uXG4iKTsKIAlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfU1RBUlRXQUlUKTsKIAlmc21fZXZlbnQocHJpdnB0ci0+ZnNtLCBERVZfRVZFTlRfQ09ORE9XTiwgbmV0ZGV2KTsKIH0KIAotc3RhdGljIHZvaWQKLWNvbm5fYWN0aW9uX3N0YXJ0KGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgY29ubl9hY3Rpb25fc3RhcnQoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGl1Y3ZfZXZlbnQgKmV2ID0gKHN0cnVjdCBpdWN2X2V2ZW50ICopYXJnOwotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSBldi0+Y29ubjsKLQlfX3UxNiBtc2dsaW1pdDsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gYXJnOwogCWludCByYzsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7CiAKLQlpZiAoIWNvbm4tPmhhbmRsZSkgewotCQlJVUNWX0RCRl9URVhUKHRyYWNlLCA1LCAiY2FsbGluZyBpdWN2X3JlZ2lzdGVyX3Byb2dyYW1cbiIpOwotCQljb25uLT5oYW5kbGUgPQotCQkJaXVjdl9yZWdpc3Rlcl9wcm9ncmFtKGl1Y3ZNYWdpYywgY29ubi0+dXNlcmlkLAotCQkJCQkgICAgICBuZXRpdWN2X21hc2ssCi0JCQkJCSAgICAgICZuZXRpdWN2X29wcywgY29ubik7Ci0JCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9TVEFSVFdBSVQpOwotCQlpZiAoIWNvbm4tPmhhbmRsZSkgewotCQkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX1JFR0VSUik7Ci0JCQljb25uLT5oYW5kbGUgPSBOVUxMOwotCQkJSVVDVl9EQkZfVEVYVChzZXR1cCwgMiwKLQkJCQkiTlVMTCBmcm9tIGl1Y3ZfcmVnaXN0ZXJfcHJvZ3JhbVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlQUklOVF9ERUJVRygiJXMoJyVzJyk6IHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5XG4iLAotCQkJIGNvbm4tPm5ldGRldi0+bmFtZSwgY29ubi0+dXNlcmlkKTsKLQl9Ci0KKwlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfU1RBUlRXQUlUKTsKIAlQUklOVF9ERUJVRygiJXMoJyVzJyk6IGNvbm5lY3RpbmcgLi4uXG4iLAotCQkgY29ubi0+bmV0ZGV2LT5uYW1lLCBjb25uLT51c2VyaWQpOworCQkgICAgY29ubi0+bmV0ZGV2LT5uYW1lLCBjb25uLT51c2VyaWQpOwogCi0JLyogV2UgbXVzdCBzZXQgdGhlIHN0YXRlIGJlZm9yZSBjYWxsaW5nIGl1Y3ZfY29ubmVjdCBiZWNhdXNlIHRoZSBjYWxsYmFjawotCSAqIGhhbmRsZXIgY291bGQgYmUgY2FsbGVkIGF0IGFueSBwb2ludCBhZnRlciB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGlzCi0JICogc2VudCAqLworCS8qCisJICogV2UgbXVzdCBzZXQgdGhlIHN0YXRlIGJlZm9yZSBjYWxsaW5nIGl1Y3ZfY29ubmVjdCBiZWNhdXNlIHRoZQorCSAqIGNhbGxiYWNrIGhhbmRsZXIgY291bGQgYmUgY2FsbGVkIGF0IGFueSBwb2ludCBhZnRlciB0aGUgY29ubmVjdGlvbgorCSAqIHJlcXVlc3QgaXMgc2VudAorCSAqLwogCiAJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX1NFVFVQV0FJVCk7Ci0JcmMgPSBpdWN2X2Nvbm5lY3QoJihjb25uLT5wYXRoaWQpLCBORVRJVUNWX1FVRVVFTEVOX0RFRkFVTFQsIGl1Y3ZNYWdpYywKLQkJCSAgY29ubi0+dXNlcmlkLCBpdWN2X2hvc3QsIDAsIE5VTEwsICZtc2dsaW1pdCwKLQkJCSAgY29ubi0+aGFuZGxlLCBjb25uKTsKKwljb25uLT5wYXRoID0gaXVjdl9wYXRoX2FsbG9jKE5FVElVQ1ZfUVVFVUVMRU5fREVGQVVMVCwgMCwgR0ZQX0tFUk5FTCk7CisJcmMgPSBpdWN2X3BhdGhfY29ubmVjdChjb25uLT5wYXRoLCAmbmV0aXVjdl9oYW5kbGVyLCBjb25uLT51c2VyaWQsCisJCQkgICAgICAgTlVMTCwgaXVjdk1hZ2ljLCBjb25uKTsKIAlzd2l0Y2ggKHJjKSB7Ci0JCWNhc2UgMDoKLQkJCWNvbm4tPm5ldGRldi0+dHhfcXVldWVfbGVuID0gbXNnbGltaXQ7Ci0JCQlmc21fYWRkdGltZXIoJmNvbm4tPnRpbWVyLCBORVRJVUNWX1RJTUVPVVRfNVNFQywKLQkJCQlDT05OX0VWRU5UX1RJTUVSLCBjb25uKTsKLQkJCXJldHVybjsKLQkJY2FzZSAxMToKLQkJCVBSSU5UX0lORk8oIiVzOiBVc2VyICVzIGlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlLlxuIiwKLQkJCSAgICAgICBjb25uLT5uZXRkZXYtPm5hbWUsCi0JCQkgICAgICAgbmV0aXVjdl9wcmludG5hbWUoY29ubi0+dXNlcmlkKSk7Ci0JCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfU1RBUlRXQUlUKTsKLQkJCXJldHVybjsKLQkJY2FzZSAxMjoKLQkJCVBSSU5UX0lORk8oIiVzOiBVc2VyICVzIGlzIGN1cnJlbnRseSBub3QgcmVhZHkuXG4iLAotCQkJICAgICAgIGNvbm4tPm5ldGRldi0+bmFtZSwKLQkJCSAgICAgICBuZXRpdWN2X3ByaW50bmFtZShjb25uLT51c2VyaWQpKTsKLQkJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9TVEFSVFdBSVQpOwotCQkJcmV0dXJuOwotCQljYXNlIDEzOgotCQkJUFJJTlRfV0FSTigiJXM6IFRvbyBtYW55IElVQ1YgY29ubmVjdGlvbnMuXG4iLAotCQkJICAgICAgIGNvbm4tPm5ldGRldi0+bmFtZSk7Ci0JCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfQ09OTkVSUik7Ci0JCQlicmVhazsKLQkJY2FzZSAxNDoKLQkJCVBSSU5UX1dBUk4oCi0JCQkgICAgICAgIiVzOiBVc2VyICVzIGhhcyB0b28gbWFueSBJVUNWIGNvbm5lY3Rpb25zLlxuIiwKLQkJCSAgICAgICBjb25uLT5uZXRkZXYtPm5hbWUsCi0JCQkgICAgICAgbmV0aXVjdl9wcmludG5hbWUoY29ubi0+dXNlcmlkKSk7Ci0JCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfQ09OTkVSUik7Ci0JCQlicmVhazsKLQkJY2FzZSAxNToKLQkJCVBSSU5UX1dBUk4oCi0JCQkgICAgICAgIiVzOiBObyBJVUNWIGF1dGhvcml6YXRpb24gaW4gQ1AgZGlyZWN0b3J5LlxuIiwKLQkJCSAgICAgICBjb25uLT5uZXRkZXYtPm5hbWUpOwotCQkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX0NPTk5FUlIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQUklOVF9XQVJOKCIlczogaXVjdl9jb25uZWN0IHJldHVybmVkIGVycm9yICVkXG4iLAotCQkJICAgICAgIGNvbm4tPm5ldGRldi0+bmFtZSwgcmMpOwotCQkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX0NPTk5FUlIpOwotCQkJYnJlYWs7CisJY2FzZSAwOgorCQljb25uLT5uZXRkZXYtPnR4X3F1ZXVlX2xlbiA9IGNvbm4tPnBhdGgtPm1zZ2xpbTsKKwkJZnNtX2FkZHRpbWVyKCZjb25uLT50aW1lciwgTkVUSVVDVl9USU1FT1VUXzVTRUMsCisJCQkgICAgIENPTk5fRVZFTlRfVElNRVIsIGNvbm4pOworCQlyZXR1cm47CisJY2FzZSAxMToKKwkJUFJJTlRfSU5GTygiJXM6IFVzZXIgJXMgaXMgY3VycmVudGx5IG5vdCBhdmFpbGFibGUuXG4iLAorCQkJICAgY29ubi0+bmV0ZGV2LT5uYW1lLAorCQkJICAgbmV0aXVjdl9wcmludG5hbWUoY29ubi0+dXNlcmlkKSk7CisJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9TVEFSVFdBSVQpOworCQlicmVhazsKKwljYXNlIDEyOgorCQlQUklOVF9JTkZPKCIlczogVXNlciAlcyBpcyBjdXJyZW50bHkgbm90IHJlYWR5LlxuIiwKKwkJCSAgIGNvbm4tPm5ldGRldi0+bmFtZSwKKwkJCSAgIG5ldGl1Y3ZfcHJpbnRuYW1lKGNvbm4tPnVzZXJpZCkpOworCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfU1RBUlRXQUlUKTsKKwkJYnJlYWs7CisJY2FzZSAxMzoKKwkJUFJJTlRfV0FSTigiJXM6IFRvbyBtYW55IElVQ1YgY29ubmVjdGlvbnMuXG4iLAorCQkJICAgY29ubi0+bmV0ZGV2LT5uYW1lKTsKKwkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX0NPTk5FUlIpOworCQlicmVhazsKKwljYXNlIDE0OgorCQlQUklOVF9XQVJOKCIlczogVXNlciAlcyBoYXMgdG9vIG1hbnkgSVVDViBjb25uZWN0aW9ucy5cbiIsCisJCQkgICBjb25uLT5uZXRkZXYtPm5hbWUsCisJCQkgICBuZXRpdWN2X3ByaW50bmFtZShjb25uLT51c2VyaWQpKTsKKwkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX0NPTk5FUlIpOworCQlicmVhazsKKwljYXNlIDE1OgorCQlQUklOVF9XQVJOKCIlczogTm8gSVVDViBhdXRob3JpemF0aW9uIGluIENQIGRpcmVjdG9yeS5cbiIsCisJCQkgICBjb25uLT5uZXRkZXYtPm5hbWUpOworCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfQ09OTkVSUik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBSSU5UX1dBUk4oIiVzOiBpdWN2X2Nvbm5lY3QgcmV0dXJuZWQgZXJyb3IgJWRcbiIsCisJCQkgICBjb25uLT5uZXRkZXYtPm5hbWUsIHJjKTsKKwkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX0NPTk5FUlIpOworCQlicmVhazsKIAl9CiAJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDUsICJpdWN2X2Nvbm5lY3QgcmMgaXMgJWRcbiIsIHJjKTsKLQlJVUNWX0RCRl9URVhUKHRyYWNlLCA1LCAiY2FsbGluZyBpdWN2X3VucmVnaXN0ZXJfcHJvZ3JhbVxuIik7Ci0JaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0oY29ubi0+aGFuZGxlKTsKLQljb25uLT5oYW5kbGUgPSBOVUxMOworCWtmcmVlKGNvbm4tPnBhdGgpOworCWNvbm4tPnBhdGggPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZAotbmV0aXVjdl9wdXJnZV9za2JfcXVldWUoc3RydWN0IHNrX2J1ZmZfaGVhZCAqcSkKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfcHVyZ2Vfc2tiX3F1ZXVlKHN0cnVjdCBza19idWZmX2hlYWQgKnEpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtOTMxLDM2ICs5MzksMzQgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1jb25uX2FjdGlvbl9zdG9wKGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorc3RhdGljIHZvaWQgY29ubl9hY3Rpb25fc3RvcChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgaXVjdl9ldmVudCAqZXYgPSAoc3RydWN0IGl1Y3ZfZXZlbnQgKilhcmc7CisJc3RydWN0IGl1Y3ZfZXZlbnQgKmV2ID0gYXJnOwogCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSBldi0+Y29ubjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gY29ubi0+bmV0ZGV2OwotCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSAoc3RydWN0IG5ldGl1Y3ZfcHJpdiAqKW5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7CiAKIAlmc21fZGVsdGltZXIoJmNvbm4tPnRpbWVyKTsKIAlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfU1RPUFBFRCk7CiAJbmV0aXVjdl9wdXJnZV9za2JfcXVldWUoJmNvbm4tPmNvbGxlY3RfcXVldWUpOwotCWlmIChjb25uLT5oYW5kbGUpCi0JCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDUsICJjYWxsaW5nIGl1Y3ZfdW5yZWdpc3Rlcl9wcm9ncmFtXG4iKTsKLQkJaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0oY29ubi0+aGFuZGxlKTsKLQljb25uLT5oYW5kbGUgPSBOVUxMOworCWlmIChjb25uLT5wYXRoKSB7CisJCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDUsICJjYWxsaW5nIGl1Y3ZfcGF0aF9zZXZlclxuIik7CisJCWl1Y3ZfcGF0aF9zZXZlcihjb25uLT5wYXRoLCBpdWN2TWFnaWMpOworCQlrZnJlZShjb25uLT5wYXRoKTsKKwkJY29ubi0+cGF0aCA9IE5VTEw7CisJfQogCW5ldGl1Y3ZfcHVyZ2Vfc2tiX3F1ZXVlKCZjb25uLT5jb21taXRfcXVldWUpOwogCWZzbV9ldmVudChwcml2cHRyLT5mc20sIERFVl9FVkVOVF9DT05ET1dOLCBuZXRkZXYpOwogfQogCi1zdGF0aWMgdm9pZAotY29ubl9hY3Rpb25faW52YWwoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCitzdGF0aWMgdm9pZCBjb25uX2FjdGlvbl9pbnZhbChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgaXVjdl9ldmVudCAqZXYgPSAoc3RydWN0IGl1Y3ZfZXZlbnQgKilhcmc7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9IGV2LT5jb25uOworCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4gPSBhcmc7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGNvbm4tPm5ldGRldjsKIAotCVBSSU5UX1dBUk4oIiVzOiBDYW5ub3QgY29ubmVjdCB3aXRob3V0IHVzZXJuYW1lXG4iLAotCSAgICAgICBuZXRkZXYtPm5hbWUpOworCVBSSU5UX1dBUk4oIiVzOiBDYW5ub3QgY29ubmVjdCB3aXRob3V0IHVzZXJuYW1lXG4iLCBuZXRkZXYtPm5hbWUpOwogCUlVQ1ZfREJGX1RFWFQoZGF0YSwgMiwgImNvbm5fYWN0aW9uX2ludmFsIGNhbGxlZFxuIik7CiB9CiAKQEAgLTk5OSwyOSArMTAwNSwyNyBAQAogc3RhdGljIGNvbnN0IGludCBDT05OX0ZTTV9MRU4gPSBzaXplb2YoY29ubl9mc20pIC8gc2l6ZW9mKGZzbV9ub2RlKTsKIAogCi0vKioKKy8qCiAgKiBBY3Rpb25zIGZvciBpbnRlcmZhY2UgLSBzdGF0ZW1hY2hpbmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKi8KIAogLyoqCi0gKiBTdGFydHVwIGNvbm5lY3Rpb24gYnkgc2VuZGluZyBDT05OX0VWRU5UX1NUQVJUIHRvIGl0LgorICogZGV2X2FjdGlvbl9zdGFydAorICogQGZpOiBBbiBpbnN0YW5jZSBvZiBhbiBpbnRlcmZhY2Ugc3RhdGVtYWNoaW5lLgorICogQGV2ZW50OiBUaGUgZXZlbnQsIGp1c3QgaGFwcGVuZWQuCisgKiBAYXJnOiBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIHN0cnVjdCBuZXRfZGV2aWNlICogdXBvbiBjYWxsLgogICoKLSAqIEBwYXJhbSBmaSAgICBBbiBpbnN0YW5jZSBvZiBhbiBpbnRlcmZhY2Ugc3RhdGVtYWNoaW5lLgotICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCwganVzdCBoYXBwZW5lZC4KLSAqIEBwYXJhbSBhcmcgICBHZW5lcmljIHBvaW50ZXIsIGNhc3RlZCBmcm9tIHN0cnVjdCBuZXRfZGV2aWNlICogdXBvbiBjYWxsLgorICogU3RhcnR1cCBjb25uZWN0aW9uIGJ5IHNlbmRpbmcgQ09OTl9FVkVOVF9TVEFSVCB0byBpdC4KICAqLwotc3RhdGljIHZvaWQKLWRldl9hY3Rpb25fc3RhcnQoZnNtX2luc3RhbmNlICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCitzdGF0aWMgdm9pZCBkZXZfYWN0aW9uX3N0YXJ0KGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWFyZzsKLQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gZGV2LT5wcml2OwotCXN0cnVjdCBpdWN2X2V2ZW50ICAgZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gYXJnOworCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKIAotCWV2LmNvbm4gPSBwcml2cHRyLT5jb25uOwogCWZzbV9uZXdzdGF0ZShmaSwgREVWX1NUQVRFX1NUQVJUV0FJVCk7Ci0JZnNtX2V2ZW50KHByaXZwdHItPmNvbm4tPmZzbSwgQ09OTl9FVkVOVF9TVEFSVCwgJmV2KTsKKwlmc21fZXZlbnQocHJpdnB0ci0+Y29ubi0+ZnNtLCBDT05OX0VWRU5UX1NUQVJULCBwcml2cHRyLT5jb25uKTsKIH0KIAogLyoqCkBAIC0xMDM0LDggKzEwMzgsOCBAQAogc3RhdGljIHZvaWQKIGRldl9hY3Rpb25fc3RvcChmc21faW5zdGFuY2UgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilhcmc7Ci0Jc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSBhcmc7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl1Y3ZfZXZlbnQgICBldjsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7CkBAIC0xMDU3LDggKzEwNjEsOCBAQAogc3RhdGljIHZvaWQKIGRldl9hY3Rpb25fY29ubnVwKGZzbV9pbnN0YW5jZSAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWFyZzsKLQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IGFyZzsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTExMzEsMTEgKzExMzUsMTMgQEAKICAqCiAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgLUVSUk5PIG9uIGZhaWx1cmUuIChOZXZlciBmYWlscy4pCiAgKi8KLXN0YXRpYyBpbnQKLW5ldGl1Y3ZfdHJhbnNtaXRfc2tiKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpIHsKK3N0YXRpYyBpbnQgbmV0aXVjdl90cmFuc21pdF9za2Ioc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpdWN2X21lc3NhZ2UgbXNnOwogCXVuc2lnbmVkIGxvbmcgc2F2ZWZsYWdzOwotCWxsX2hlYWRlciBoZWFkZXI7Ci0JaW50ICAgICAgIHJjID0gMDsKKwlzdHJ1Y3QgbGxfaGVhZGVyIGhlYWRlcjsKKwlpbnQgcmM7CiAKIAlpZiAoZnNtX2dldHN0YXRlKGNvbm4tPmZzbSkgIT0gQ09OTl9TVEFURV9JRExFKSB7CiAJCWludCBsID0gc2tiLT5sZW4gKyBORVRJVUNWX0hEUkxFTjsKQEAgLTExNDUsMTEgKzExNTEsMTIgQEAKIAkJICAgIChjb25uLT5tYXhfYnVmZnNpemUgLSBORVRJVUNWX0hEUkxFTikpIHsKIAkJCXJjID0gLUVCVVNZOwogCQkJSVVDVl9EQkZfVEVYVChkYXRhLCAyLAotCQkJCSJFQlVTWSBmcm9tIG5ldGl1Y3ZfdHJhbnNtaXRfc2tiXG4iKTsKKwkJCQkgICAgICAiRUJVU1kgZnJvbSBuZXRpdWN2X3RyYW5zbWl0X3NrYlxuIik7CiAJCX0gZWxzZSB7CiAJCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKIAkJCXNrYl9xdWV1ZV90YWlsKCZjb25uLT5jb2xsZWN0X3F1ZXVlLCBza2IpOwogCQkJY29ubi0+Y29sbGVjdF9sZW4gKz0gbDsKKwkJCXJjID0gMDsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25uLT5jb2xsZWN0X2xvY2ssIHNhdmVmbGFncyk7CiAJfSBlbHNlIHsKQEAgLTExODgsOSArMTE5NSwxMCBAQAogCQlmc21fbmV3c3RhdGUoY29ubi0+ZnNtLCBDT05OX1NUQVRFX1RYKTsKIAkJY29ubi0+cHJvZi5zZW5kX3N0YW1wID0geHRpbWU7CiAKLQkJcmMgPSBpdWN2X3NlbmQoY29ubi0+cGF0aGlkLCBOVUxMLCAwLCAwLCAxIC8qIHNpbmdsZV9mbGFnICovLAotCQkJMCwgbnNrYi0+ZGF0YSwgbnNrYi0+bGVuKTsKLQkJCSAgICAgICAvKiBTaHV0IHVwLCBnY2MhIG5za2IgaXMgYWx3YXlzIGJlbG93IDJHLiAqLworCQltc2cudGFnID0gMTsKKwkJbXNnLmNsYXNzID0gMDsKKwkJcmMgPSBpdWN2X21lc3NhZ2Vfc2VuZChjb25uLT5wYXRoLCAmbXNnLCAwLCAwLAorCQkJCSAgICAgICBuc2tiLT5kYXRhLCBuc2tiLT5sZW4pOwogCQljb25uLT5wcm9mLmRvaW9zX3NpbmdsZSsrOwogCQljb25uLT5wcm9mLnR4bGVuICs9IHNrYi0+bGVuOwogCQljb25uLT5wcm9mLnR4X3BlbmRpbmcrKzsKQEAgLTEyMDAsNyArMTIwOCw3IEBACiAJCQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyOwogCQkJZnNtX25ld3N0YXRlKGNvbm4tPmZzbSwgQ09OTl9TVEFURV9JRExFKTsKIAkJCWNvbm4tPnByb2YudHhfcGVuZGluZy0tOwotCQkJcHJpdnB0ciA9IChzdHJ1Y3QgbmV0aXVjdl9wcml2ICopY29ubi0+bmV0ZGV2LT5wcml2OworCQkJcHJpdnB0ciA9IG5ldGRldl9wcml2KGNvbm4tPm5ldGRldik7CiAJCQlpZiAocHJpdnB0cikKIAkJCQlwcml2cHRyLT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCWlmIChjb3BpZWQpCkBAIC0xMjI2LDkgKzEyMzQsOSBAQAogCXJldHVybiByYzsKIH0KIAotLyoqCisvKgogICogSW50ZXJmYWNlIEFQSSBmb3IgdXBwZXIgbmV0d29yayBsYXllcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogCiAvKioKICAqIE9wZW4gYW4gaW50ZXJmYWNlLgpAQCAtMTIzOCw5ICsxMjQ2LDExIEBACiAgKgogICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC1FUlJOTyBvbiBmYWlsdXJlLiAoTmV2ZXIgZmFpbHMuKQogICovCi1zdGF0aWMgaW50Ci1uZXRpdWN2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewotCWZzbV9ldmVudCgoKHN0cnVjdCBuZXRpdWN2X3ByaXYgKilkZXYtPnByaXYpLT5mc20sIERFVl9FVkVOVF9TVEFSVCxkZXYpOworc3RhdGljIGludCBuZXRpdWN2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZzbV9ldmVudChwcml2LT5mc20sIERFVl9FVkVOVF9TVEFSVCwgZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI1Miw5ICsxMjYyLDExIEBACiAgKgogICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC1FUlJOTyBvbiBmYWlsdXJlLiAoTmV2ZXIgZmFpbHMuKQogICovCi1zdGF0aWMgaW50Ci1uZXRpdWN2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKLQlmc21fZXZlbnQoKChzdHJ1Y3QgbmV0aXVjdl9wcml2ICopZGV2LT5wcml2KS0+ZnNtLCBERVZfRVZFTlRfU1RPUCwgZGV2KTsKK3N0YXRpYyBpbnQgbmV0aXVjdl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZnNtX2V2ZW50KHByaXYtPmZzbSwgREVWX0VWRU5UX1NUT1AsIGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNzEsOCArMTI4Myw4IEBACiAgKi8KIHN0YXRpYyBpbnQgbmV0aXVjdl90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWludCAgICAgICAgICByYyA9IDA7Ci0Jc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCA0LCBfX0ZVTkNUSU9OX18pOwogCS8qKgpAQCAtMTMxMiw0MCArMTMyNCw0MSBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQlpZiAobmV0aXVjdl90cmFuc21pdF9za2IocHJpdnB0ci0+Y29ubiwgc2tiKSkKLQkJcmMgPSAxOworCXJjID0gbmV0aXVjdl90cmFuc21pdF9za2IocHJpdnB0ci0+Y29ubiwgc2tiKSAhPSAwOwogCW5ldGl1Y3ZfY2xlYXJfYnVzeShkZXYpOwogCXJldHVybiByYzsKIH0KIAogLyoqCisgKiBuZXRpdWN2X3N0YXRzCisgKiBAZGV2OiBQb2ludGVyIHRvIGludGVyZmFjZSBzdHJ1Y3QuCisgKgogICogUmV0dXJucyBpbnRlcmZhY2Ugc3RhdGlzdGljcyBvZiBhIGRldmljZS4KICAqCi0gKiBAcGFyYW0gZGV2IFBvaW50ZXIgdG8gaW50ZXJmYWNlIHN0cnVjdC4KLSAqCi0gKiBAcmV0dXJuIFBvaW50ZXIgdG8gc3RhdHMgc3RydWN0IG9mIHRoaXMgaW50ZXJmYWNlLgorICogUmV0dXJucyBwb2ludGVyIHRvIHN0YXRzIHN0cnVjdCBvZiB0aGlzIGludGVyZmFjZS4KICAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKLW5ldGl1Y3Zfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRpdWN2X3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKIHsKKwlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDUsIF9fRlVOQ1RJT05fXyk7Ci0JcmV0dXJuICYoKHN0cnVjdCBuZXRpdWN2X3ByaXYgKilkZXYtPnByaXYpLT5zdGF0czsKKwlyZXR1cm4gJnByaXYtPnN0YXRzOwogfQogCiAvKioKKyAqIG5ldGl1Y3ZfY2hhbmdlX210dQorICogQGRldjogUG9pbnRlciB0byBpbnRlcmZhY2Ugc3RydWN0LgorICogQG5ld19tdHU6IFRoZSBuZXcgTVRVIHRvIHVzZSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgKgogICogU2V0cyBNVFUgb2YgYW4gaW50ZXJmYWNlLgogICoKLSAqIEBwYXJhbSBkZXYgICAgIFBvaW50ZXIgdG8gaW50ZXJmYWNlIHN0cnVjdC4KLSAqIEBwYXJhbSBuZXdfbXR1IFRoZSBuZXcgTVRVIHRvIHVzZSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gKgotICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgTVRVIGlzIG91dCBvZiB2YWxpZCByYW5nZS4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIE1UVSBpcyBvdXQgb2YgdmFsaWQgcmFuZ2UuCiAgKiAgICAgICAgICh2YWxpZCByYW5nZSBpcyA1NzYgLi4gTkVUSVVDVl9NVFVfTUFYKS4KICAqLwotc3RhdGljIGludAotbmV0aXVjdl9jaGFuZ2VfbXR1IChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IG5ld19tdHUpCitzdGF0aWMgaW50IG5ldGl1Y3ZfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IG5ld19tdHUpCiB7CiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKLQlpZiAoKG5ld19tdHUgPCA1NzYpIHx8IChuZXdfbXR1ID4gTkVUSVVDVl9NVFVfTUFYKSkgeworCWlmIChuZXdfbXR1IDwgNTc2IHx8IG5ld19tdHUgPiBORVRJVUNWX01UVV9NQVgpIHsKIAkJSVVDVl9EQkZfVEVYVChzZXR1cCwgMiwgImdpdmVuIE1UVSBvdXQgb2YgdmFsaWQgcmFuZ2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMzUzLDEyICsxMzY2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qKgorLyoKICAqIGF0dHJpYnV0ZXMgaW4gc3lzZnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLwogCi1zdGF0aWMgc3NpemVfdAotdXNlcl9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB1c2VyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTEzNjYsOCArMTM3OSw4IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIG5ldGl1Y3ZfcHJpbnRuYW1lKHByaXYtPmNvbm4tPnVzZXJpZCkpOwogfQogCi1zdGF0aWMgc3NpemVfdAotdXNlcl93cml0ZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCB1c2VyX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHJpdi0+Y29ubi0+bmV0ZGV2OwpAQCAtMTM3NSw4MCArMTM4OCw3MCBAQAogCWNoYXIgICAgKnRtcDsKIAljaGFyIAl1c2VybmFtZVs5XTsKIAlpbnQgCWk7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqKmNsaXN0ID0gJml1Y3ZfY29ubnMuaXVjdl9jb25uZWN0aW9uczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNwOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKLQlpZiAoY291bnQ+OSkgewotCQlQUklOVF9XQVJOKCJuZXRpdWN2OiB1c2VybmFtZSB0b28gbG9uZyAoJWQpIVxuIiwgKGludCljb3VudCk7CisJaWYgKGNvdW50ID4gOSkgeworCQlQUklOVF9XQVJOKCJuZXRpdWN2OiB1c2VybmFtZSB0b28gbG9uZyAoJWQpIVxuIiwgKGludCkgY291bnQpOwogCQlJVUNWX0RCRl9URVhUXyhzZXR1cCwgMiwKLQkJCSIlZCBpcyBsZW5ndGggb2YgdXNlcm5hbWVcbiIsIChpbnQpY291bnQpOworCQkJICAgICAgICIlZCBpcyBsZW5ndGggb2YgdXNlcm5hbWVcbiIsIChpbnQpIGNvdW50KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJdG1wID0gc3Ryc2VwKChjaGFyICoqKSAmYnVmLCAiXG4iKTsKLQlmb3IgKGk9MCwgcD10bXA7IGk8OCAmJiAqcDsgaSsrLCBwKyspIHsKLQkJaWYgKGlzYWxudW0oKnApIHx8ICgqcCA9PSAnJCcpKQorCWZvciAoaSA9IDAsIHAgPSB0bXA7IGkgPCA4ICYmICpwOyBpKyssIHArKykgeworCQlpZiAoaXNhbG51bSgqcCkgfHwgKCpwID09ICckJykpIHsKIAkJCXVzZXJuYW1lW2ldPSB0b3VwcGVyKCpwKTsKLQkJZWxzZSBpZiAoKnAgPT0gJ1xuJykgeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCpwID09ICdcbicpIHsKIAkJCS8qIHRyYWlsaW5nIGxmLCBncnIgKi8KIAkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJUFJJTlRfV0FSTigibmV0aXVjdjogSW52YWxpZCBjaGFyICVjIGluIHVzZXJuYW1lIVxuIiwKLQkJCQkqcCk7Ci0JCQlJVUNWX0RCRl9URVhUXyhzZXR1cCwgMiwKLQkJCQkidXNlcm5hbWU6IGludmFsaWQgY2hhcmFjdGVyICVjXG4iLAotCQkJCSpwKTsKLQkJCXJldHVybiAtRUlOVkFMOwogCQl9CisJCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IEludmFsaWQgY2hhciAlYyBpbiB1c2VybmFtZSFcbiIsICpwKTsKKwkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsCisJCQkgICAgICAgInVzZXJuYW1lOiBpbnZhbGlkIGNoYXJhY3RlciAlY1xuIiwgKnApOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0Jd2hpbGUgKGk8OCkKKwl3aGlsZSAoaSA8IDgpCiAJCXVzZXJuYW1lW2krK10gPSAnICc7CiAJdXNlcm5hbWVbOF0gPSAnXDAnOwogCi0JaWYgKG1lbWNtcCh1c2VybmFtZSwgcHJpdi0+Y29ubi0+dXNlcmlkLCA5KSkgewotCQkvKiB1c2VybmFtZSBjaGFuZ2VkICovCi0JCWlmIChuZGV2LT5mbGFncyAmIChJRkZfVVAgfCBJRkZfUlVOTklORykpIHsKLQkJCVBSSU5UX1dBUk4oCi0JCQkJIm5ldGl1Y3Y6IGRldmljZSAlcyBhY3RpdmUsIGNvbm5lY3RlZCB0byAlc1xuIiwKLQkJCQlkZXYtPmJ1c19pZCwgcHJpdi0+Y29ubi0+dXNlcmlkKTsKLQkJCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IHVzZXIgY2Fubm90IGJlIHVwZGF0ZWRcbiIpOwotCQkJSVVDVl9EQkZfVEVYVChzZXR1cCwgMiwgInVzZXJfd3JpdGU6IGRldmljZSBhY3RpdmVcbiIpOwotCQkJcmV0dXJuIC1FQlVTWTsKKwlpZiAobWVtY21wKHVzZXJuYW1lLCBwcml2LT5jb25uLT51c2VyaWQsIDkpICYmCisJICAgIChuZGV2LT5mbGFncyAmIChJRkZfVVAgfCBJRkZfUlVOTklORykpKSB7CisJCS8qIHVzZXJuYW1lIGNoYW5nZWQgd2hpbGUgdGhlIGludGVyZmFjZSBpcyBhY3RpdmUuICovCisJCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IGRldmljZSAlcyBhY3RpdmUsIGNvbm5lY3RlZCB0byAlc1xuIiwKKwkJCSAgIGRldi0+YnVzX2lkLCBwcml2LT5jb25uLT51c2VyaWQpOworCQlQUklOVF9XQVJOKCJuZXRpdWN2OiB1c2VyIGNhbm5vdCBiZSB1cGRhdGVkXG4iKTsKKwkJSVVDVl9EQkZfVEVYVChzZXR1cCwgMiwgInVzZXJfd3JpdGU6IGRldmljZSBhY3RpdmVcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZWFkX2xvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpdWN2X2Nvbm5lY3Rpb25fbGlzdCwgbGlzdCkgeworCQlpZiAoIXN0cm5jbXAodXNlcm5hbWUsIGNwLT51c2VyaWQsIDkpICYmIGNwLT5uZXRkZXYgIT0gbmRldikgeworCQkJcmVhZF91bmxvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOworCQkJUFJJTlRfV0FSTigibmV0aXVjdjogQ29ubmVjdGlvbiB0byAlcyBhbHJlYWR5ICIKKwkJCQkgICAiZXhpc3RzXG4iLCB1c2VybmFtZSk7CisJCQlyZXR1cm4gLUVFWElTVDsKIAkJfQogCX0KLQlyZWFkX2xvY2tfaXJxc2F2ZSgmaXVjdl9jb25ucy5pdWN2X3J3bG9jaywgZmxhZ3MpOwotCXdoaWxlICgqY2xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAodXNlcm5hbWUsICgqY2xpc3QpLT51c2VyaWQsIDkpIHx8Ci0JCSAgICAoKCpjbGlzdCktPm5ldGRldiAhPSBuZGV2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNsaXN0ID0gJigoKmNsaXN0KS0+bmV4dCk7Ci0gICAgICAgIH0KLQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZpdWN2X2Nvbm5zLml1Y3Zfcndsb2NrLCBmbGFncyk7Ci0gICAgICAgIGlmICgqY2xpc3QpIHsKLSAgICAgICAgICAgICAgICBQUklOVF9XQVJOKCJuZXRpdWN2OiBDb25uZWN0aW9uIHRvICVzIGFscmVhZHkgZXhpc3RzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUVYSVNUOwotICAgICAgICB9CisJcmVhZF91bmxvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOwogCW1lbWNweShwcml2LT5jb25uLT51c2VyaWQsIHVzZXJuYW1lLCA5KTsKLQogCXJldHVybiBjb3VudDsKLQogfQogCiBzdGF0aWMgREVWSUNFX0FUVFIodXNlciwgMDY0NCwgdXNlcl9zaG93LCB1c2VyX3dyaXRlKTsKIAotc3RhdGljIHNzaXplX3QKLWJ1ZmZlcl9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CitzdGF0aWMgc3NpemVfdCBidWZmZXJfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCit7CXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgNSwgX19GVU5DVElPTl9fKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHJpdi0+Y29ubi0+bWF4X2J1ZmZzaXplKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLWJ1ZmZlcl93cml0ZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBidWZmZXJfd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHJpdi0+Y29ubi0+bmV0ZGV2OwpAQCAtMTUwMiw4ICsxNTA1LDggQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGJ1ZmZlciwgMDY0NCwgYnVmZmVyX3Nob3csIGJ1ZmZlcl93cml0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1kZXZfZnNtX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGRldl9mc21fc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNTEzLDggKzE1MTYsOCBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoZGV2aWNlX2ZzbV9zdGF0ZSwgMDQ0NCwgZGV2X2ZzbV9zaG93LCBOVUxMKTsKIAotc3RhdGljIHNzaXplX3QKLWNvbm5fZnNtX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGNvbm5fZnNtX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE1MjQsOCArMTUyNyw4IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihjb25uZWN0aW9uX2ZzbV9zdGF0ZSwgMDQ0NCwgY29ubl9mc21fc2hvdywgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1tYXhtdWx0aV9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBtYXhtdWx0aV9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNTMzLDggKzE1MzYsOSBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgcHJpdi0+Y29ubi0+cHJvZi5tYXhtdWx0aSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1tYXhtdWx0aV93cml0ZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBtYXhtdWx0aV93cml0ZSAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNTQ1LDggKzE1NDksOCBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIobWF4X3R4X2J1ZmZlcl91c2VkLCAwNjQ0LCBtYXhtdWx0aV9zaG93LCBtYXhtdWx0aV93cml0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1tYXhjcV9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBtYXhjcV9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNTU0LDggKzE1NTgsOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgcHJpdi0+Y29ubi0+cHJvZi5tYXhjcXVldWUpOwogfQogCi1zdGF0aWMgc3NpemVfdAotbWF4Y3Ffd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgbWF4Y3Ffd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE1NjYsOCArMTU3MCw4IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihtYXhfY2hhaW5lZF9za2JzLCAwNjQ0LCBtYXhjcV9zaG93LCBtYXhjcV93cml0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1zZG9pb19zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzZG9pb19zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNTc1LDggKzE1NzksOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgcHJpdi0+Y29ubi0+cHJvZi5kb2lvc19zaW5nbGUpOwogfQogCi1zdGF0aWMgc3NpemVfdAotc2RvaW9fd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc2RvaW9fd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE1ODcsOCArMTU5MSw4IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUih0eF9zaW5nbGVfd3JpdGVfb3BzLCAwNjQ0LCBzZG9pb19zaG93LCBzZG9pb193cml0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1tZG9pb19zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBtZG9pb19zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNTk2LDggKzE2MDAsOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgcHJpdi0+Y29ubi0+cHJvZi5kb2lvc19tdWx0aSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1tZG9pb193cml0ZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBtZG9pb193cml0ZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTYwOCw4ICsxNjEyLDggQEAKIAogc3RhdGljIERFVklDRV9BVFRSKHR4X211bHRpX3dyaXRlX29wcywgMDY0NCwgbWRvaW9fc2hvdywgbWRvaW9fd3JpdGUpOwogCi1zdGF0aWMgc3NpemVfdAotdHhsZW5fc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHhsZW5fc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTYxNyw4ICsxNjIxLDggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIHByaXYtPmNvbm4tPnByb2YudHhsZW4pOwogfQogCi1zdGF0aWMgc3NpemVfdAotdHhsZW5fd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgdHhsZW5fd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE2MjksOCArMTYzMyw4IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihuZXR0b19ieXRlcywgMDY0NCwgdHhsZW5fc2hvdywgdHhsZW5fd3JpdGUpOwogCi1zdGF0aWMgc3NpemVfdAotdHh0aW1lX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR4dGltZV9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTYzOCw4ICsxNjQyLDggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIHByaXYtPmNvbm4tPnByb2YudHhfdGltZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci10eHRpbWVfd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgdHh0aW1lX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2LT5kcml2ZXJfZGF0YTsKIApAQCAtMTY1MCw4ICsxNjU0LDggQEAKIAogc3RhdGljIERFVklDRV9BVFRSKG1heF90eF9pb190aW1lLCAwNjQ0LCB0eHRpbWVfc2hvdywgdHh0aW1lX3dyaXRlKTsKIAotc3RhdGljIHNzaXplX3QKLXR4cGVuZF9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0eHBlbmRfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE2NTksOCArMTY2Myw4IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBwcml2LT5jb25uLT5wcm9mLnR4X3BlbmRpbmcpOwogfQogCi1zdGF0aWMgc3NpemVfdAotdHhwZW5kX3dyaXRlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHR4cGVuZF93cml0ZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE2NzEsOCArMTY3NSw4IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUih0eF9wZW5kaW5nLCAwNjQ0LCB0eHBlbmRfc2hvdywgdHhwZW5kX3dyaXRlKTsKIAotc3RhdGljIHNzaXplX3QKLXR4bXBuZF9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0eG1wbmRfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE2ODAsOCArMTY4NCw4IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBwcml2LT5jb25uLT5wcm9mLnR4X21heF9wZW5kaW5nKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXR4bXBuZF93cml0ZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCB0eG1wbmRfd3JpdGUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXYtPmRyaXZlcl9kYXRhOwogCkBAIC0xNzIxLDggKzE3MjUsNyBAQAogCS5hdHRycyA9IG5ldGl1Y3Zfc3RhdF9hdHRycywKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1uZXRpdWN2X2FkZF9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIGludCBuZXRpdWN2X2FkZF9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKIApAQCAtMTczNiwxOCArMTczOSwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotbmV0aXVjdl9yZW1vdmVfZmlsZXMoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIG5ldGl1Y3ZfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmbmV0aXVjdl9zdGF0X2F0dHJfZ3JvdXApOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmbmV0aXVjdl9hdHRyX2dyb3VwKTsKIH0KIAotc3RhdGljIGludAotbmV0aXVjdl9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCitzdGF0aWMgaW50IG5ldGl1Y3ZfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBuZGV2LT5wcml2OworCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaW50IHJldDsKIApAQCAtMTc4Niw4ICsxNzg3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZAotbmV0aXVjdl91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuZXRpdWN2X3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwogCW5ldGl1Y3ZfcmVtb3ZlX2ZpbGVzKGRldik7CkBAIC0xNzk4LDEwNyArMTc5OCw4OSBAQAogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgY29ubmVjdGlvbiBzdHJ1Y3R1cmUuCiAgKiBBZGQgaXQgdG8gdGhlIGxpc3Qgb2YgbmV0aXVjdiBjb25uZWN0aW9uczsKICAqLwotc3RhdGljIHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKgotbmV0aXVjdl9uZXdfY29ubmVjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICp1c2VybmFtZSkKK3N0YXRpYyBzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpuZXRpdWN2X25ld19jb25uZWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgICAgICBjaGFyICp1c2VybmFtZSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKipjbGlzdCA9ICZpdWN2X2Nvbm5zLml1Y3ZfY29ubmVjdGlvbnM7Ci0Jc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubiA9Ci0JCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24pLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uOwogCi0JaWYgKGNvbm4pIHsKLQkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY29ubi0+Y29sbGVjdF9xdWV1ZSk7Ci0JCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvbm4tPmNvbW1pdF9xdWV1ZSk7Ci0JCXNwaW5fbG9ja19pbml0KCZjb25uLT5jb2xsZWN0X2xvY2spOwotCQljb25uLT5tYXhfYnVmZnNpemUgPSBORVRJVUNWX0JVRlNJWkVfREVGQVVMVDsKLQkJY29ubi0+bmV0ZGV2ID0gZGV2OworCWNvbm4gPSBremFsbG9jKHNpemVvZigqY29ubiksIEdGUF9LRVJORUwpOworCWlmICghY29ubikKKwkJZ290byBvdXQ7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY29ubi0+Y29sbGVjdF9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY29ubi0+Y29tbWl0X3F1ZXVlKTsKKwlzcGluX2xvY2tfaW5pdCgmY29ubi0+Y29sbGVjdF9sb2NrKTsKKwljb25uLT5tYXhfYnVmZnNpemUgPSBORVRJVUNWX0JVRlNJWkVfREVGQVVMVDsKKwljb25uLT5uZXRkZXYgPSBkZXY7CiAKLQkJY29ubi0+cnhfYnVmZiA9IGFsbG9jX3NrYihORVRJVUNWX0JVRlNJWkVfREVGQVVMVCwKLQkJCQkJICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JCWlmICghY29ubi0+cnhfYnVmZikgewotCQkJa2ZyZWUoY29ubik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQljb25uLT50eF9idWZmID0gYWxsb2Nfc2tiKE5FVElVQ1ZfQlVGU0laRV9ERUZBVUxULAotCQkJCQkgIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQkJaWYgKCFjb25uLT50eF9idWZmKSB7Ci0JCQlrZnJlZV9za2IoY29ubi0+cnhfYnVmZik7Ci0JCQlrZnJlZShjb25uKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWNvbm4tPmZzbSA9IGluaXRfZnNtKCJuZXRpdWN2Y29ubiIsIGNvbm5fc3RhdGVfbmFtZXMsCi0JCQkJICAgICBjb25uX2V2ZW50X25hbWVzLCBOUl9DT05OX1NUQVRFUywKLQkJCQkgICAgIE5SX0NPTk5fRVZFTlRTLCBjb25uX2ZzbSwgQ09OTl9GU01fTEVOLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY29ubi0+ZnNtKSB7Ci0JCQlrZnJlZV9za2IoY29ubi0+dHhfYnVmZik7Ci0JCQlrZnJlZV9za2IoY29ubi0+cnhfYnVmZik7Ci0JCQlrZnJlZShjb25uKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWZzbV9zZXR0aW1lcihjb25uLT5mc20sICZjb25uLT50aW1lcik7Ci0JCWZzbV9uZXdzdGF0ZShjb25uLT5mc20sIENPTk5fU1RBVEVfSU5WQUxJRCk7CisJY29ubi0+cnhfYnVmZiA9IGFsbG9jX3NrYihjb25uLT5tYXhfYnVmZnNpemUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWNvbm4tPnJ4X2J1ZmYpCisJCWdvdG8gb3V0X2Nvbm47CisJY29ubi0+dHhfYnVmZiA9IGFsbG9jX3NrYihjb25uLT5tYXhfYnVmZnNpemUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWNvbm4tPnR4X2J1ZmYpCisJCWdvdG8gb3V0X3J4OworCWNvbm4tPmZzbSA9IGluaXRfZnNtKCJuZXRpdWN2Y29ubiIsIGNvbm5fc3RhdGVfbmFtZXMsCisJCQkgICAgIGNvbm5fZXZlbnRfbmFtZXMsIE5SX0NPTk5fU1RBVEVTLAorCQkJICAgICBOUl9DT05OX0VWRU5UUywgY29ubl9mc20sIENPTk5fRlNNX0xFTiwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb25uLT5mc20pCisJCWdvdG8gb3V0X3R4OwogCi0JCWlmICh1c2VybmFtZSkgewotCQkJbWVtY3B5KGNvbm4tPnVzZXJpZCwgdXNlcm5hbWUsIDkpOwotCQkJZnNtX25ld3N0YXRlKGNvbm4tPmZzbSwgQ09OTl9TVEFURV9TVE9QUEVEKTsKLQkJfQorCWZzbV9zZXR0aW1lcihjb25uLT5mc20sICZjb25uLT50aW1lcik7CisJZnNtX25ld3N0YXRlKGNvbm4tPmZzbSwgQ09OTl9TVEFURV9JTlZBTElEKTsKIAotCQl3cml0ZV9sb2NrX2lycXNhdmUoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2ssIGZsYWdzKTsKLQkJY29ubi0+bmV4dCA9ICpjbGlzdDsKLQkJKmNsaXN0ID0gY29ubjsKLQkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2ssIGZsYWdzKTsKKwlpZiAodXNlcm5hbWUpIHsKKwkJbWVtY3B5KGNvbm4tPnVzZXJpZCwgdXNlcm5hbWUsIDkpOworCQlmc21fbmV3c3RhdGUoY29ubi0+ZnNtLCBDT05OX1NUQVRFX1NUT1BQRUQpOwogCX0KKworCXdyaXRlX2xvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmNvbm4tPmxpc3QsICZpdWN2X2Nvbm5lY3Rpb25fbGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKIAlyZXR1cm4gY29ubjsKKworb3V0X3R4OgorCWtmcmVlX3NrYihjb25uLT50eF9idWZmKTsKK291dF9yeDoKKwlrZnJlZV9za2IoY29ubi0+cnhfYnVmZik7CitvdXRfY29ubjoKKwlrZnJlZShjb25uKTsKK291dDoKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoqCiAgKiBSZWxlYXNlIGEgY29ubmVjdGlvbiBzdHJ1Y3R1cmUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZQogICogbGlzdCBvZiBuZXRpdWN2IGNvbm5lY3Rpb25zLgogICovCi1zdGF0aWMgdm9pZAotbmV0aXVjdl9yZW1vdmVfY29ubmVjdGlvbihzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uKQorc3RhdGljIHZvaWQgbmV0aXVjdl9yZW1vdmVfY29ubmVjdGlvbihzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uKQogewotCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKipjbGlzdCA9ICZpdWN2X2Nvbm5zLml1Y3ZfY29ubmVjdGlvbnM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7Ci0JaWYgKGNvbm4gPT0gTlVMTCkKLQkJcmV0dXJuOwotCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaXVjdl9jb25ucy5pdWN2X3J3bG9jaywgZmxhZ3MpOwotCXdoaWxlICgqY2xpc3QpIHsKLQkJaWYgKCpjbGlzdCA9PSBjb25uKSB7Ci0JCQkqY2xpc3QgPSBjb25uLT5uZXh0OwotCQkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2ssIGZsYWdzKTsKLQkJCWlmIChjb25uLT5oYW5kbGUpIHsKLQkJCQlpdWN2X3VucmVnaXN0ZXJfcHJvZ3JhbShjb25uLT5oYW5kbGUpOwotCQkJCWNvbm4tPmhhbmRsZSA9IE5VTEw7Ci0JCQl9Ci0JCQlmc21fZGVsdGltZXIoJmNvbm4tPnRpbWVyKTsKLQkJCWtmcmVlX2ZzbShjb25uLT5mc20pOwotCQkJa2ZyZWVfc2tiKGNvbm4tPnJ4X2J1ZmYpOwotCQkJa2ZyZWVfc2tiKGNvbm4tPnR4X2J1ZmYpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNsaXN0ID0gJigoKmNsaXN0KS0+bmV4dCk7CisJd3JpdGVfbG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CisJbGlzdF9kZWxfaW5pdCgmY29ubi0+bGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKKwlpZiAoY29ubi0+cGF0aCkgeworCQlpdWN2X3BhdGhfc2V2ZXIoY29ubi0+cGF0aCwgaXVjdk1hZ2ljKTsKKwkJa2ZyZWUoY29ubi0+cGF0aCk7CisJCWNvbm4tPnBhdGggPSBOVUxMOwogCX0KLQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmaXVjdl9jb25ucy5pdWN2X3J3bG9jaywgZmxhZ3MpOworCWZzbV9kZWx0aW1lcigmY29ubi0+dGltZXIpOworCWtmcmVlX2ZzbShjb25uLT5mc20pOworCWtmcmVlX3NrYihjb25uLT5yeF9idWZmKTsKKwlrZnJlZV9za2IoY29ubi0+dHhfYnVmZik7CiB9CiAKIC8qKgogICogUmVsZWFzZSBldmVyeXRoaW5nIG9mIGEgbmV0IGRldmljZS4KICAqLwotc3RhdGljIHZvaWQKLW5ldGl1Y3ZfZnJlZV9uZXRkZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfZnJlZV9uZXRkZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyOworCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXZwdHIgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKIAogCWlmICghZGV2KQogCQlyZXR1cm47CiAKLQlwcml2cHRyID0gKHN0cnVjdCBuZXRpdWN2X3ByaXYgKilkZXYtPnByaXY7CiAJaWYgKHByaXZwdHIpIHsKIAkJaWYgKHByaXZwdHItPmNvbm4pCiAJCQluZXRpdWN2X3JlbW92ZV9jb25uZWN0aW9uKHByaXZwdHItPmNvbm4pOwpAQCAtMTkxMywxMSArMTg5NSw4IEBACiAvKioKICAqIEluaXRpYWxpemUgYSBuZXQgZGV2aWNlLiAoQ2FsbGVkIGZyb20ga2VybmVsIGluIGFsbG9jX25ldGRldigpKQogICovCi1zdGF0aWMgdm9pZAotbmV0aXVjdl9zZXR1cF9uZXRkZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5ldGl1Y3Zfc2V0dXBfbmV0ZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgICAgIG1lbXNldChkZXYtPnByaXYsIDAsIHNpemVvZihzdHJ1Y3QgbmV0aXVjdl9wcml2KSk7Ci0KIAlkZXYtPm10dQkgICAgICAgICA9IE5FVElVQ1ZfTVRVX0RFRkFVTFQ7CiAJZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgID0gbmV0aXVjdl90eDsKIAlkZXYtPm9wZW4JICAgICAgICAgPSBuZXRpdWN2X29wZW47CkBAIC0xOTM2LDggKzE5MTUsNyBAQAogLyoqCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBldmVyeXRoaW5nIG9mIGEgbmV0IGRldmljZS4KICAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoKLW5ldGl1Y3ZfaW5pdF9uZXRkZXZpY2UoY2hhciAqdXNlcm5hbWUpCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGl1Y3ZfaW5pdF9uZXRkZXZpY2UoY2hhciAqdXNlcm5hbWUpCiB7CiAJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdnB0cjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMTk0Niw0MCArMTkyNCw0MCBAQAogCQkJICAgbmV0aXVjdl9zZXR1cF9uZXRkZXZpY2UpOwogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKLQlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpIDwgMCkgewotCQlmcmVlX25ldGRldihkZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisJaWYgKGRldl9hbGxvY19uYW1lKGRldiwgZGV2LT5uYW1lKSA8IDApCisJCWdvdG8gb3V0X25ldGRldjsKIAotCXByaXZwdHIgPSAoc3RydWN0IG5ldGl1Y3ZfcHJpdiAqKWRldi0+cHJpdjsKKwlwcml2cHRyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlwcml2cHRyLT5mc20gPSBpbml0X2ZzbSgibmV0aXVjdmRldiIsIGRldl9zdGF0ZV9uYW1lcywKIAkJCQlkZXZfZXZlbnRfbmFtZXMsIE5SX0RFVl9TVEFURVMsIE5SX0RFVl9FVkVOVFMsCiAJCQkJZGV2X2ZzbSwgREVWX0ZTTV9MRU4sIEdGUF9LRVJORUwpOwotCWlmICghcHJpdnB0ci0+ZnNtKSB7Ci0JCWZyZWVfbmV0ZGV2KGRldik7Ci0JCXJldHVybiBOVUxMOwotCX0KKwlpZiAoIXByaXZwdHItPmZzbSkKKwkJZ290byBvdXRfbmV0ZGV2OworCiAJcHJpdnB0ci0+Y29ubiA9IG5ldGl1Y3ZfbmV3X2Nvbm5lY3Rpb24oZGV2LCB1c2VybmFtZSk7CiAJaWYgKCFwcml2cHRyLT5jb25uKSB7Ci0JCWtmcmVlX2ZzbShwcml2cHRyLT5mc20pOwotCQlmcmVlX25ldGRldihkZXYpOwogCQlJVUNWX0RCRl9URVhUKHNldHVwLCAyLCAiTlVMTCBmcm9tIG5ldGl1Y3ZfbmV3X2Nvbm5lY3Rpb25cbiIpOwotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBvdXRfZnNtOwogCX0KIAlmc21fbmV3c3RhdGUocHJpdnB0ci0+ZnNtLCBERVZfU1RBVEVfU1RPUFBFRCk7Ci0KIAlyZXR1cm4gZGV2OworCitvdXRfZnNtOgorCWtmcmVlX2ZzbShwcml2cHRyLT5mc20pOworb3V0X25ldGRldjoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3NpemVfdAotY29ubl93cml0ZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGNvbm5fd3JpdGUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JY2hhciAqcDsKKwljb25zdCBjaGFyICpwOwogCWNoYXIgdXNlcm5hbWVbOV07Ci0JaW50IGksIHJldDsKKwlpbnQgaSwgcmM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICoqY2xpc3QgPSAmaXVjdl9jb25ucy5pdWN2X2Nvbm5lY3Rpb25zOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldGl1Y3ZfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjcDsKIAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fRlVOQ1RJT05fXyk7CiAJaWYgKGNvdW50PjkpIHsKQEAgLTE5ODgsODMgKzE5NjYsODIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZm9yIChpPTAsIHA9KGNoYXIgKilidWY7IGk8OCAmJiAqcDsgaSsrLCBwKyspIHsKLQkJaWYgKGlzYWxudW0oKnApIHx8ICgqcCA9PSAnJCcpKQotCQkJdXNlcm5hbWVbaV09IHRvdXBwZXIoKnApOwotCQllbHNlIGlmICgqcCA9PSAnXG4nKSB7CisJZm9yIChpID0gMCwgcCA9IGJ1ZjsgaSA8IDggJiYgKnA7IGkrKywgcCsrKSB7CisJCWlmIChpc2FsbnVtKCpwKSB8fCAqcCA9PSAnJCcpIHsKKwkJCXVzZXJuYW1lW2ldID0gdG91cHBlcigqcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnAgPT0gJ1xuJykKIAkJCS8qIHRyYWlsaW5nIGxmLCBncnIgKi8KIAkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJUFJJTlRfV0FSTigibmV0aXVjdjogSW52YWxpZCBjaGFyYWN0ZXIgaW4gdXNlcm5hbWUhXG4iKTsKLQkJCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLAotCQkJCSJjb25uX3dyaXRlOiBpbnZhbGlkIGNoYXJhY3RlciAlY1xuIiwgKnApOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwkJUFJJTlRfV0FSTigibmV0aXVjdjogSW52YWxpZCBjaGFyYWN0ZXIgaW4gdXNlcm5hbWUhXG4iKTsKKwkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsCisJCQkgICAgICAgImNvbm5fd3JpdGU6IGludmFsaWQgY2hhcmFjdGVyICVjXG4iLCAqcCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQl3aGlsZSAoaTw4KQorCXdoaWxlIChpIDwgOCkKIAkJdXNlcm5hbWVbaSsrXSA9ICcgJzsKIAl1c2VybmFtZVs4XSA9ICdcMCc7CiAKLQlyZWFkX2xvY2tfaXJxc2F2ZSgmaXVjdl9jb25ucy5pdWN2X3J3bG9jaywgZmxhZ3MpOwotCXdoaWxlICgqY2xpc3QpIHsKLQkJaWYgKCFzdHJuY21wKHVzZXJuYW1lLCAoKmNsaXN0KS0+dXNlcmlkLCA5KSkKLQkJCWJyZWFrOwotCQljbGlzdCA9ICYoKCpjbGlzdCktPm5leHQpOworCXJlYWRfbG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJml1Y3ZfY29ubmVjdGlvbl9saXN0LCBsaXN0KSB7CisJCWlmICghc3RybmNtcCh1c2VybmFtZSwgY3AtPnVzZXJpZCwgOSkpIHsKKwkJCXJlYWRfdW5sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKKwkJCVBSSU5UX1dBUk4oIm5ldGl1Y3Y6IENvbm5lY3Rpb24gdG8gJXMgYWxyZWFkeSAiCisJCQkJICAgImV4aXN0c1xuIiwgdXNlcm5hbWUpOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0KIAl9Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmaXVjdl9jb25ucy5pdWN2X3J3bG9jaywgZmxhZ3MpOwotCWlmICgqY2xpc3QpIHsKLQkJUFJJTlRfV0FSTigibmV0aXVjdjogQ29ubmVjdGlvbiB0byAlcyBhbHJlYWR5IGV4aXN0c1xuIiwKLQkJCXVzZXJuYW1lKTsKLQkJcmV0dXJuIC1FRVhJU1Q7Ci0JfQorCXJlYWRfdW5sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKKwogCWRldiA9IG5ldGl1Y3ZfaW5pdF9uZXRkZXZpY2UodXNlcm5hbWUpOwogCWlmICghZGV2KSB7Ci0JCVBSSU5UX1dBUk4oCi0JCSAgICAgICAibmV0aXVjdjogQ291bGQgbm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSAiCi0JCSAgICAgICAiZm9yIHVzZXIgJyVzJ1xuIiwgbmV0aXVjdl9wcmludG5hbWUodXNlcm5hbWUpKTsKKwkJUFJJTlRfV0FSTigibmV0aXVjdjogQ291bGQgbm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlICIKKwkJCSAgICJzdHJ1Y3R1cmUgZm9yIHVzZXIgJyVzJ1xuIiwKKwkJCSAgIG5ldGl1Y3ZfcHJpbnRuYW1lKHVzZXJuYW1lKSk7CiAJCUlVQ1ZfREJGX1RFWFQoc2V0dXAsIDIsICJOVUxMIGZyb20gbmV0aXVjdl9pbml0X25ldGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmICgocmV0ID0gbmV0aXVjdl9yZWdpc3Rlcl9kZXZpY2UoZGV2KSkpIHsKKwlyYyA9IG5ldGl1Y3ZfcmVnaXN0ZXJfZGV2aWNlKGRldik7CisJaWYgKHJjKSB7CiAJCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLAotCQkJInJldCAlZCBmcm9tIG5ldGl1Y3ZfcmVnaXN0ZXJfZGV2aWNlXG4iLCByZXQpOworCQkJInJldCAlZCBmcm9tIG5ldGl1Y3ZfcmVnaXN0ZXJfZGV2aWNlXG4iLCByYyk7CiAJCWdvdG8gb3V0X2ZyZWVfbmRldjsKIAl9CiAKIAkvKiBzeXNmcyBtYWdpYyAqLwotCVNFVF9ORVRERVZfREVWKGRldiwKLQkJCShzdHJ1Y3QgZGV2aWNlKikoKHN0cnVjdCBuZXRpdWN2X3ByaXYqKWRldi0+cHJpdiktPmRldik7CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCBwcml2LT5kZXYpOwogCi0JaWYgKChyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KSkpIHsKLQkJbmV0aXVjdl91bnJlZ2lzdGVyX2RldmljZSgoc3RydWN0IGRldmljZSopCi0JCQkoKHN0cnVjdCBuZXRpdWN2X3ByaXYqKWRldi0+cHJpdiktPmRldik7Ci0JCWdvdG8gb3V0X2ZyZWVfbmRldjsKLQl9CisJcmMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X3VucmVnOwogCiAJUFJJTlRfSU5GTygiJXM6ICclcydcbiIsIGRldi0+bmFtZSwgbmV0aXVjdl9wcmludG5hbWUodXNlcm5hbWUpKTsKIAogCXJldHVybiBjb3VudDsKIAorb3V0X3VucmVnOgorCW5ldGl1Y3ZfdW5yZWdpc3Rlcl9kZXZpY2UocHJpdi0+ZGV2KTsKIG91dF9mcmVlX25kZXY6CiAJUFJJTlRfV0FSTigibmV0aXVjdjogQ291bGQgbm90IHJlZ2lzdGVyICclcydcbiIsIGRldi0+bmFtZSk7CiAJSVVDVl9EQkZfVEVYVChzZXR1cCwgMiwgImNvbm5fd3JpdGU6IGNvdWxkIG5vdCByZWdpc3RlclxuIik7CiAJbmV0aXVjdl9mcmVlX25ldGRldmljZShkZXYpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgRFJJVkVSX0FUVFIoY29ubmVjdGlvbiwgMDIwMCwgTlVMTCwgY29ubl93cml0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90Ci1yZW1vdmVfd3JpdGUgKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcmVtb3ZlX3dyaXRlIChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICoqY2xpc3QgPSAmaXVjdl9jb25ucy5pdWN2X2Nvbm5lY3Rpb25zOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY3A7CiAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogICAgICAgICBzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2OwogICAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXY7CiAgICAgICAgIGNoYXIgbmFtZVtJRk5BTVNJWl07Ci0gICAgICAgIGNoYXIgKnA7CisJY29uc3QgY2hhciAqcDsKICAgICAgICAgaW50IGk7CiAKICAgICAgICAgSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKQEAgLTIwNzIsMzMgKzIwNDksMjcgQEAKICAgICAgICAgaWYgKGNvdW50ID49IElGTkFNU0laKQogICAgICAgICAgICAgICAgIGNvdW50ID0gSUZOQU1TSVogLSAxOzsKIAotICAgICAgICBmb3IgKGk9MCwgcD0oY2hhciAqKWJ1ZjsgaTxjb3VudCAmJiAqcDsgaSsrLCBwKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoKCpwID09ICdcbicpIHx8ICgqcCA9PSAnICcpKSB7CisJZm9yIChpID0gMCwgcCA9IGJ1ZjsgaSA8IGNvdW50ICYmICpwOyBpKyssIHArKykgeworCQlpZiAoKnAgPT0gJ1xuJyB8fCAqcCA9PSAnICcpCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFpbGluZyBsZiwgZ3JyICovCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVtpXT0qcDsKLSAgICAgICAgICAgICAgICB9CisJCW5hbWVbaV0gPSAqcDsKICAgICAgICAgfQogICAgICAgICBuYW1lW2ldID0gJ1wwJzsKIAotCXJlYWRfbG9ja19pcnFzYXZlKCZpdWN2X2Nvbm5zLml1Y3Zfcndsb2NrLCBmbGFncyk7Ci0gICAgICAgIHdoaWxlICgqY2xpc3QpIHsKLSAgICAgICAgICAgICAgICBuZGV2ID0gKCpjbGlzdCktPm5ldGRldjsKLSAgICAgICAgICAgICAgICBwcml2ID0gKHN0cnVjdCBuZXRpdWN2X3ByaXYqKW5kZXYtPnByaXY7CisJcmVhZF9sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXVjdl9jb25uZWN0aW9uX2xpc3QsIGxpc3QpIHsKKwkJbmRldiA9IGNwLT5uZXRkZXY7CisJCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKICAgICAgICAgICAgICAgICBkZXYgPSBwcml2LT5kZXY7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChuYW1lLCBuZGV2LT5uYW1lLCBjb3VudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaXN0ID0gJigoKmNsaXN0KS0+bmV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0JCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2ssIGZsYWdzKTsKKwkJaWYgKHN0cm5jbXAobmFtZSwgbmRldi0+bmFtZSwgY291bnQpKQorCQkJY29udGludWU7CisJCXJlYWRfdW5sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKICAgICAgICAgICAgICAgICBpZiAobmRldi0+ZmxhZ3MgJiAoSUZGX1VQIHwgSUZGX1JVTk5JTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQUklOVF9XQVJOKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV0aXVjdjogbmV0IGRldmljZSAlcyBhY3RpdmUgd2l0aCBwZWVyICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZGV2LT5uYW1lLCBwcml2LT5jb25uLT51c2VyaWQpOworCQkJUFJJTlRfV0FSTigibmV0aXVjdjogbmV0IGRldmljZSAlcyBhY3RpdmUgd2l0aCBwZWVyICIKKwkJCQkgICAiJXNcbiIsIG5kZXYtPm5hbWUsIHByaXYtPmNvbm4tPnVzZXJpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVF9XQVJOKCJuZXRpdWN2OiAlcyBjYW5ub3QgYmUgcmVtb3ZlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRldi0+bmFtZSk7CisJCQkJICAgbmRldi0+bmFtZSk7CiAJCQlJVUNWX0RCRl9URVhUKGRhdGEsIDIsICJyZW1vdmVfd3JpdGU6IHN0aWxsIGFjdGl2ZVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwogICAgICAgICAgICAgICAgIH0KQEAgLTIxMDYsNyArMjA3Nyw3IEBACiAgICAgICAgICAgICAgICAgbmV0aXVjdl91bnJlZ2lzdGVyX2RldmljZShkZXYpOwogICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICAgfQotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJml1Y3ZfY29ubnMuaXVjdl9yd2xvY2ssIGZsYWdzKTsKKwlyZWFkX3VubG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CiAgICAgICAgIFBSSU5UX1dBUk4oIm5ldGl1Y3Y6IG5ldCBkZXZpY2UgJXMgdW5rbm93blxuIiwgbmFtZSk7CiAJSVVDVl9EQkZfVEVYVChkYXRhLCAyLCAicmVtb3ZlX3dyaXRlOiB1bmtub3duIGRldmljZVxuIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMjExNCw2NyArMjA4NSw4NiBAQAogCiBzdGF0aWMgRFJJVkVSX0FUVFIocmVtb3ZlLCAwMjAwLCBOVUxMLCByZW1vdmVfd3JpdGUpOwogCi1zdGF0aWMgdm9pZAotbmV0aXVjdl9iYW5uZXIodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICogbmV0aXVjdl9kcnZfYXR0cnNbXSA9IHsKKwkmZHJpdmVyX2F0dHJfY29ubmVjdGlvbi5hdHRyLAorCSZkcml2ZXJfYXR0cl9yZW1vdmUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbmV0aXVjdl9kcnZfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBuZXRpdWN2X2Rydl9hdHRycywKK307CisKK3N0YXRpYyB2b2lkIG5ldGl1Y3ZfYmFubmVyKHZvaWQpCiB7CiAJUFJJTlRfSU5GTygiTkVUSVVDViBkcml2ZXIgaW5pdGlhbGl6ZWRcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLW5ldGl1Y3ZfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IG5ldGl1Y3ZfZXhpdCh2b2lkKQogeworCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19GVU5DVElPTl9fKTsKLQl3aGlsZSAoaXVjdl9jb25ucy5pdWN2X2Nvbm5lY3Rpb25zKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gaXVjdl9jb25ucy5pdWN2X2Nvbm5lY3Rpb25zLT5uZXRkZXY7Ci0JCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSAoc3RydWN0IG5ldGl1Y3ZfcHJpdiopbmRldi0+cHJpdjsKLQkJc3RydWN0IGRldmljZSAqZGV2ID0gcHJpdi0+ZGV2OworCXdoaWxlICghbGlzdF9lbXB0eSgmaXVjdl9jb25uZWN0aW9uX2xpc3QpKSB7CisJCWNwID0gbGlzdF9lbnRyeShpdWN2X2Nvbm5lY3Rpb25fbGlzdC5uZXh0LAorCQkJCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24sIGxpc3QpOworCQlsaXN0X2RlbCgmY3AtPmxpc3QpOworCQluZGV2ID0gY3AtPm5ldGRldjsKKwkJcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCQlkZXYgPSBwcml2LT5kZXY7CiAKIAkJdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CiAJCW5ldGl1Y3ZfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2KTsKIAl9CiAKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoJm5ldGl1Y3ZfZHJpdmVyLCAmZHJpdmVyX2F0dHJfY29ubmVjdGlvbik7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKCZuZXRpdWN2X2RyaXZlciwgJmRyaXZlcl9hdHRyX3JlbW92ZSk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZuZXRpdWN2X2RyaXZlci5rb2JqLCAmbmV0aXVjdl9kcnZfYXR0cl9ncm91cCk7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJm5ldGl1Y3ZfZHJpdmVyKTsKKwlpdWN2X3VucmVnaXN0ZXIoJm5ldGl1Y3ZfaGFuZGxlciwgMSk7CiAJaXVjdl91bnJlZ2lzdGVyX2RiZl92aWV3cygpOwogCiAJUFJJTlRfSU5GTygiTkVUSVVDViBkcml2ZXIgdW5sb2FkZWRcbiIpOwogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBfX2luaXQKLW5ldGl1Y3ZfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgbmV0aXVjdl9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmM7CiAKLQlyZXQgPSBpdWN2X3JlZ2lzdGVyX2RiZl92aWV3cygpOwotCWlmIChyZXQpIHsKLQkJUFJJTlRfV0FSTigibmV0aXVjdl9pbml0IGZhaWxlZCwgIgotCQkJIml1Y3ZfcmVnaXN0ZXJfZGJmX3ZpZXdzIHJjID0gJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCXJjID0gaXVjdl9yZWdpc3Rlcl9kYmZfdmlld3MoKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXJjID0gaXVjdl9yZWdpc3RlcigmbmV0aXVjdl9oYW5kbGVyLCAxKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2RiZjsKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX0ZVTkNUSU9OX18pOwotCXJldCA9IGRyaXZlcl9yZWdpc3RlcigmbmV0aXVjdl9kcml2ZXIpOwotCWlmIChyZXQpIHsKKwlyYyA9IGRyaXZlcl9yZWdpc3RlcigmbmV0aXVjdl9kcml2ZXIpOworCWlmIChyYykgewogCQlQUklOVF9FUlIoIk5FVElVQ1Y6IGZhaWxlZCB0byByZWdpc3RlciBkcml2ZXIuXG4iKTsKLQkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsICJyZXQgJWQgZnJvbSBkcml2ZXJfcmVnaXN0ZXJcbiIsIHJldCk7Ci0JCWl1Y3ZfdW5yZWdpc3Rlcl9kYmZfdmlld3MoKTsKLQkJcmV0dXJuIHJldDsKKwkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsICJyZXQgJWQgZnJvbSBkcml2ZXJfcmVnaXN0ZXJcbiIsIHJjKTsKKwkJZ290byBvdXRfaXVjdjsKIAl9CiAKLQkvKiBBZGQgZW50cnkgZm9yIHNwZWNpZnlpbmcgY29ubmVjdGlvbnMuICovCi0JcmV0ID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZuZXRpdWN2X2RyaXZlciwgJmRyaXZlcl9hdHRyX2Nvbm5lY3Rpb24pOwotCWlmICghcmV0KSB7Ci0JCXJldCA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmbmV0aXVjdl9kcml2ZXIsICZkcml2ZXJfYXR0cl9yZW1vdmUpOwotCQluZXRpdWN2X2Jhbm5lcigpOwotCQlyd2xvY2tfaW5pdCgmaXVjdl9jb25ucy5pdWN2X3J3bG9jayk7Ci0JfSBlbHNlIHsKLQkJUFJJTlRfRVJSKCJORVRJVUNWOiBmYWlsZWQgdG8gYWRkIGRyaXZlciBhdHRyaWJ1dGUuXG4iKTsKLQkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsICJyZXQgJWQgZnJvbSBkcml2ZXJfY3JlYXRlX2ZpbGVcbiIsIHJldCk7Ci0JCWRyaXZlcl91bnJlZ2lzdGVyKCZuZXRpdWN2X2RyaXZlcik7Ci0JCWl1Y3ZfdW5yZWdpc3Rlcl9kYmZfdmlld3MoKTsKKwlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmbmV0aXVjdl9kcml2ZXIua29iaiwgJm5ldGl1Y3ZfZHJ2X2F0dHJfZ3JvdXApOworCWlmIChyYykgeworCQlQUklOVF9FUlIoIk5FVElVQ1Y6IGZhaWxlZCB0byBhZGQgZHJpdmVyIGF0dHJpYnV0ZXMuXG4iKTsKKwkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsCisJCQkgICAgICAgInJldCAlZCAtIG5ldGl1Y3ZfZHJ2X2F0dHJfZ3JvdXBcbiIsIHJjKTsKKwkJZ290byBvdXRfZHJpdmVyOwogCX0KLQlyZXR1cm4gcmV0OworCW5ldGl1Y3ZfYmFubmVyKCk7CisJcmV0dXJuIHJjOworCitvdXRfZHJpdmVyOgorCWRyaXZlcl91bnJlZ2lzdGVyKCZuZXRpdWN2X2RyaXZlcik7CitvdXRfaXVjdjoKKwlpdWN2X3VucmVnaXN0ZXIoJm5ldGl1Y3ZfaGFuZGxlciwgMSk7CitvdXRfZGJmOgorCWl1Y3ZfdW5yZWdpc3Rlcl9kYmZfdmlld3MoKTsKK291dDoKKwlyZXR1cm4gcmM7CiB9CiAKIG1vZHVsZV9pbml0KG5ldGl1Y3ZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3Ntc2dpdWN2LmMgYi9kcml2ZXJzL3MzOTAvbmV0L3Ntc2dpdWN2LmMKaW5kZXggYjgxNzljMi4uM2NjY2E1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9zbXNnaXVjdi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvc21zZ2l1Y3YuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBJVUNWIHNwZWNpYWwgbWVzc2FnZSBkcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IDIwMDMgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgogICogQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTIzLDEwICsyMywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9pdWN2L2l1Y3YuaD4KICNpbmNsdWRlIDxhc20vY3BjbWQuaD4KICNpbmNsdWRlIDxhc20vZWJjZGljLmg+Ci0KLSNpbmNsdWRlICJpdWN2LmgiCisjaW5jbHVkZSAic21zZ2l1Y3YuaCIKIAogc3RydWN0IHNtc2dfY2FsbGJhY2sgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKQEAgLTM5LDM4ICszOSw0NiBAQAogICAgKCIoQykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYnkgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OICgiTGludXggZm9yIFMvMzkwIElVQ1Ygc3BlY2lhbCBtZXNzYWdlIGRyaXZlciIpOwogCi1zdGF0aWMgaXVjdl9oYW5kbGVfdCBzbXNnX2hhbmRsZTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbXNnX3BhdGhpZDsKK3N0YXRpYyBzdHJ1Y3QgaXVjdl9wYXRoICpzbXNnX3BhdGg7CisKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc21zZ19saXN0X2xvY2spOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc21zZ19saXN0ID0gTElTVF9IRUFEX0lOSVQoc21zZ19saXN0KTsKIAotc3RhdGljIHZvaWQKLXNtc2dfY29ubmVjdGlvbl9jb21wbGV0ZShpdWN2X0Nvbm5lY3Rpb25Db21wbGV0ZSAqZWliLCB2b2lkICpwZ21fZGF0YSkKK3N0YXRpYyBpbnQgc21zZ19wYXRoX3BlbmRpbmcoc3RydWN0IGl1Y3ZfcGF0aCAqLCB1OCBpcHZtaWRbOF0sIHU4IGlwdXNlclsxNl0pOworc3RhdGljIHZvaWQgc21zZ19tZXNzYWdlX3BlbmRpbmcoc3RydWN0IGl1Y3ZfcGF0aCAqLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICopOworCitzdGF0aWMgc3RydWN0IGl1Y3ZfaGFuZGxlciBzbXNnX2hhbmRsZXIgPSB7CisJLnBhdGhfcGVuZGluZwkgPSBzbXNnX3BhdGhfcGVuZGluZywKKwkubWVzc2FnZV9wZW5kaW5nID0gc21zZ19tZXNzYWdlX3BlbmRpbmcsCit9OworCitzdGF0aWMgaW50IHNtc2dfcGF0aF9wZW5kaW5nKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IGlwdm1pZFs4XSwKKwkJCSAgICAgdTggaXB1c2VyWzE2XSkKIHsKKwlpZiAoc3RybmNtcChpcHZtaWQsICIqTVNHICAgICIsIHNpemVvZihpcHZtaWQpKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBQYXRoIHBlbmRpbmcgZnJvbSAqTVNHLiAqLworCXJldHVybiBpdWN2X3BhdGhfYWNjZXB0KHBhdGgsICZzbXNnX2hhbmRsZXIsICJTTVNHSVVDViAgICAgICAgIiwgTlVMTCk7CiB9CiAKLQotc3RhdGljIHZvaWQKLXNtc2dfbWVzc2FnZV9wZW5kaW5nKGl1Y3ZfTWVzc2FnZVBlbmRpbmcgKmVpYiwgdm9pZCAqcGdtX2RhdGEpCitzdGF0aWMgdm9pZCBzbXNnX21lc3NhZ2VfcGVuZGluZyhzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLAorCQkJCSBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2cpCiB7CiAJc3RydWN0IHNtc2dfY2FsbGJhY2sgKmNiOwotCXVuc2lnbmVkIGNoYXIgKm1zZzsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAJdW5zaWduZWQgY2hhciBzZW5kZXJbOV07Ci0JdW5zaWduZWQgc2hvcnQgbGVuOwogCWludCByYywgaTsKIAotCWxlbiA9IGVpYi0+bG4xbXNnMi5pcGJmbG4xZjsKLQltc2cgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9BVE9NSUN8R0ZQX0RNQSk7Ci0JaWYgKCFtc2cpIHsKLQkJaXVjdl9yZWplY3QoZWliLT5pcHBhdGhpZCwgZWliLT5pcG1zZ2lkLCBlaWItPmlwdHJnY2xzKTsKKwlidWZmZXIgPSBrbWFsbG9jKG1zZy0+bGVuZ3RoICsgMSwgR0ZQX0FUT01JQyB8IEdGUF9ETUEpOworCWlmICghYnVmZmVyKSB7CisJCWl1Y3ZfbWVzc2FnZV9yZWplY3QocGF0aCwgbXNnKTsKIAkJcmV0dXJuOwogCX0KLQlyYyA9IGl1Y3ZfcmVjZWl2ZShlaWItPmlwcGF0aGlkLCBlaWItPmlwbXNnaWQsIGVpYi0+aXB0cmdjbHMsCi0JCQkgIG1zZywgbGVuLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlyYyA9IGl1Y3ZfbWVzc2FnZV9yZWNlaXZlKHBhdGgsIG1zZywgMCwgYnVmZmVyLCBtc2ctPmxlbmd0aCwgTlVMTCk7CiAJaWYgKHJjID09IDApIHsKLQkJbXNnW2xlbl0gPSAwOwotCQlFQkNBU0MobXNnLCBsZW4pOwotCQltZW1jcHkoc2VuZGVyLCBtc2csIDgpOworCQlidWZmZXJbbXNnLT5sZW5ndGhdID0gMDsKKwkJRUJDQVNDKGJ1ZmZlciwgbXNnLT5sZW5ndGgpOworCQltZW1jcHkoc2VuZGVyLCBidWZmZXIsIDgpOwogCQlzZW5kZXJbOF0gPSAwOwogCQkvKiBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBzZW5kZXIgbmFtZS4gKi8KIAkJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKQEAgLTgwLDI3ICs4OCwxNyBAQAogCQl9CiAJCXNwaW5fbG9jaygmc21zZ19saXN0X2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNiLCAmc21zZ19saXN0LCBsaXN0KQotCQkJaWYgKHN0cm5jbXAobXNnICsgOCwgY2ItPnByZWZpeCwgY2ItPmxlbikgPT0gMCkgewotCQkJCWNiLT5jYWxsYmFjayhzZW5kZXIsIG1zZyArIDgpOworCQkJaWYgKHN0cm5jbXAoYnVmZmVyICsgOCwgY2ItPnByZWZpeCwgY2ItPmxlbikgPT0gMCkgeworCQkJCWNiLT5jYWxsYmFjayhzZW5kZXIsIGJ1ZmZlciArIDgpOwogCQkJCWJyZWFrOwogCQkJfQogCQlzcGluX3VubG9jaygmc21zZ19saXN0X2xvY2spOwogCX0KLQlrZnJlZShtc2cpOworCWtmcmVlKGJ1ZmZlcik7CiB9CiAKLXN0YXRpYyBpdWN2X2ludGVycnVwdF9vcHNfdCBzbXNnX29wcyA9IHsKLQkuQ29ubmVjdGlvbkNvbXBsZXRlID0gc21zZ19jb25uZWN0aW9uX2NvbXBsZXRlLAotCS5NZXNzYWdlUGVuZGluZyAgICAgPSBzbXNnX21lc3NhZ2VfcGVuZGluZywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzbXNnX2RyaXZlciA9IHsKLQkubmFtZSA9ICJTTVNHSVVDViIsCi0JLmJ1cyAgPSAmaXVjdl9idXMsCi19OwotCi1pbnQKLXNtc2dfcmVnaXN0ZXJfY2FsbGJhY2soY2hhciAqcHJlZml4LCB2b2lkICgqY2FsbGJhY2spKGNoYXIgKmZyb20sIGNoYXIgKnN0cikpCitpbnQgc21zZ19yZWdpc3Rlcl9jYWxsYmFjayhjaGFyICpwcmVmaXgsCisJCQkgICB2b2lkICgqY2FsbGJhY2spKGNoYXIgKmZyb20sIGNoYXIgKnN0cikpCiB7CiAJc3RydWN0IHNtc2dfY2FsbGJhY2sgKmNiOwogCkBAIC0xMTAsMTggKzEwOCwxOCBAQAogCWNiLT5wcmVmaXggPSBwcmVmaXg7CiAJY2ItPmxlbiA9IHN0cmxlbihwcmVmaXgpOwogCWNiLT5jYWxsYmFjayA9IGNhbGxiYWNrOwotCXNwaW5fbG9jaygmc21zZ19saXN0X2xvY2spOworCXNwaW5fbG9ja19iaCgmc21zZ19saXN0X2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmc21zZ19saXN0KTsKLQlzcGluX3VubG9jaygmc21zZ19saXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZzbXNnX2xpc3RfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKLXNtc2dfdW5yZWdpc3Rlcl9jYWxsYmFjayhjaGFyICpwcmVmaXgsIHZvaWQgKCpjYWxsYmFjaykoY2hhciAqZnJvbSwgY2hhciAqc3RyKSkKK3ZvaWQgc21zZ191bnJlZ2lzdGVyX2NhbGxiYWNrKGNoYXIgKnByZWZpeCwKKwkJCSAgICAgIHZvaWQgKCpjYWxsYmFjaykoY2hhciAqZnJvbSwgY2hhciAqc3RyKSkKIHsKIAlzdHJ1Y3Qgc21zZ19jYWxsYmFjayAqY2IsICp0bXA7CiAKLQlzcGluX2xvY2soJnNtc2dfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnNtc2dfbGlzdF9sb2NrKTsKIAljYiA9IE5VTEw7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZzbXNnX2xpc3QsIGxpc3QpCiAJCWlmICh0bXAtPmNhbGxiYWNrID09IGNhbGxiYWNrICYmCkBAIC0xMzAsNTUgKzEyOCw1OCBAQAogCQkJbGlzdF9kZWwoJmNiLT5saXN0KTsKIAkJCWJyZWFrOwogCQl9Ci0Jc3Bpbl91bmxvY2soJnNtc2dfbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmc21zZ19saXN0X2xvY2spOwogCWtmcmVlKGNiKTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0Ci1zbXNnX2V4aXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzbXNnX2RyaXZlciA9IHsKKwkubmFtZSA9ICJTTVNHSVVDViIsCisJLmJ1cyAgPSAmaXVjdl9idXMsCit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgc21zZ19leGl0KHZvaWQpCiB7Ci0JaWYgKHNtc2dfaGFuZGxlID4gMCkgewotCQljcGNtZCgiU0VUIFNNU0cgT0ZGIiwgTlVMTCwgMCwgTlVMTCk7Ci0JCWl1Y3Zfc2V2ZXIoc21zZ19wYXRoaWQsIE5VTEwpOwotCQlpdWN2X3VucmVnaXN0ZXJfcHJvZ3JhbShzbXNnX2hhbmRsZSk7Ci0JCWRyaXZlcl91bnJlZ2lzdGVyKCZzbXNnX2RyaXZlcik7Ci0JfQotCXJldHVybjsKKwljcGNtZCgiU0VUIFNNU0cgSVVDViIsIE5VTEwsIDAsIE5VTEwpOworCWl1Y3ZfdW5yZWdpc3Rlcigmc21zZ19oYW5kbGVyLCAxKTsKKwlkcml2ZXJfdW5yZWdpc3Rlcigmc21zZ19kcml2ZXIpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdAotc21zZ19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBzbXNnX2luaXQodm9pZCkKIHsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBwZ21tYXNrWzI0XSA9IHsKLQkJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLQkJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLQkJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgotCX07CiAJaW50IHJjOwogCiAJcmMgPSBkcml2ZXJfcmVnaXN0ZXIoJnNtc2dfZHJpdmVyKTsKLQlpZiAocmMgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlNNU0dJVUNWOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZHJpdmVyLlxuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0Jc21zZ19oYW5kbGUgPSBpdWN2X3JlZ2lzdGVyX3Byb2dyYW0oIlNNU0dJVUNWICAgICAgICAiLCAiKk1TRyAgICAiLAotCQkJCQkgICAgcGdtbWFzaywgJnNtc2dfb3BzLCBOVUxMKTsKLQlpZiAoIXNtc2dfaGFuZGxlKSB7CisJaWYgKHJjICE9IDApCisJCWdvdG8gb3V0OworCXJjID0gaXVjdl9yZWdpc3Rlcigmc21zZ19oYW5kbGVyLCAxKTsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTTVNHSVVDVjogZmFpbGVkIHRvIHJlZ2lzdGVyIHRvIGl1Y3YiKTsKLQkJZHJpdmVyX3VucmVnaXN0ZXIoJnNtc2dfZHJpdmVyKTsKLQkJcmV0dXJuIC1FSU87CS8qIGJldHRlciBlcnJubyA/ICovCisJCXJjID0gLUVJTzsJLyogYmV0dGVyIGVycm5vID8gKi8KKwkJZ290byBvdXRfZHJpdmVyOwogCX0KLQlyYyA9IGl1Y3ZfY29ubmVjdCAoJnNtc2dfcGF0aGlkLCAyNTUsIE5VTEwsICIqTVNHICAgICIsIE5VTEwsIDAsCi0JCQkgICBOVUxMLCBOVUxMLCBzbXNnX2hhbmRsZSwgTlVMTCk7CisJc21zZ19wYXRoID0gaXVjdl9wYXRoX2FsbG9jKDI1NSwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbXNnX3BhdGgpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWdpc3RlcjsKKwl9CisJcmMgPSBpdWN2X3BhdGhfY29ubmVjdChzbXNnX3BhdGgsICZzbXNnX2hhbmRsZXIsICIqTVNHICAgICIsCisJCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU01TR0lVQ1Y6IGZhaWxlZCB0byBjb25uZWN0IHRvICpNU0ciKTsKLQkJaXVjdl91bnJlZ2lzdGVyX3Byb2dyYW0oc21zZ19oYW5kbGUpOwotCQlkcml2ZXJfdW5yZWdpc3Rlcigmc21zZ19kcml2ZXIpOwotCQlzbXNnX2hhbmRsZSA9IE5VTEw7Ci0JCXJldHVybiAtRUlPOworCQlyYyA9IC1FSU87CS8qIGJldHRlciBlcnJubyA/ICovCisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCWNwY21kKCJTRVQgU01TRyBJVUNWIiwgTlVMTCwgMCwgTlVMTCk7CiAJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCWl1Y3ZfcGF0aF9mcmVlKHNtc2dfcGF0aCk7CitvdXRfcmVnaXN0ZXI6CisJaXVjdl91bnJlZ2lzdGVyKCZzbXNnX2hhbmRsZXIsIDEpOworb3V0X2RyaXZlcjoKKwlkcml2ZXJfdW5yZWdpc3Rlcigmc21zZ19kcml2ZXIpOworb3V0OgorCXJldHVybiByYzsKIH0KIAogbW9kdWxlX2luaXQoc21zZ19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwppbmRleCA0Mzc2ODQwLi44ZjU1ZTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCkBAIC0xMzc1LDcgKzEzNzUsNyBAQAogCX0KIAogCUJVR19PTih0Y3BfbXRhc2stPnhtc3RhdGUgIT0gWE1TVEFURV9JRExFKTsKLQlpZiAobXRhc2stPmhkci0+aXR0ID09IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRykpIHsKKwlpZiAobXRhc2stPmhkci0+aXR0ID09IFJFU0VSVkVEX0lUVCkgewogCQlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAKIAkJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKaW5kZXggZDM3MDQ4Yy4uN2M3NTc3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKQEAgLTExMyw4ICsxMTMsNyBAQAogICAgICAgICBoZHItPm9wY29kZSA9IElTQ1NJX09QX1NDU0lfQ01EOwogICAgICAgICBoZHItPmZsYWdzID0gSVNDU0lfQVRUUl9TSU1QTEU7CiAgICAgICAgIGludF90b19zY3NpbHVuKHNjLT5kZXZpY2UtPmx1biwgKHN0cnVjdCBzY3NpX2x1biAqKWhkci0+bHVuKTsKLSAgICAgICAgaGRyLT5pdHQgPSBjdGFzay0+aXR0IHwgKGNvbm4tPmlkIDw8IElTQ1NJX0NJRF9TSElGVCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5hZ2UgPDwgSVNDU0lfQUdFX1NISUZUKTsKKyAgICAgICAgaGRyLT5pdHQgPSBidWlsZF9pdHQoY3Rhc2stPml0dCwgY29ubi0+aWQsIHNlc3Npb24tPmFnZSk7CiAgICAgICAgIGhkci0+ZGF0YV9sZW5ndGggPSBjcHVfdG9fYmUzMihzYy0+cmVxdWVzdF9idWZmbGVuKTsKICAgICAgICAgaGRyLT5jbWRzbiA9IGNwdV90b19iZTMyKHNlc3Npb24tPmNtZHNuKTsKICAgICAgICAgc2Vzc2lvbi0+Y21kc24rKzsKQEAgLTI3MCw3ICsyNjksNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlzZW5zZWxlbiA9IGJlMTZfdG9fY3B1KCoodWludDE2X3QgKilkYXRhKTsKKwkJc2Vuc2VsZW4gPSBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKWRhdGEpOwogCQlpZiAoZGF0YWxlbiA8IHNlbnNlbGVuKQogCQkJZ290byBpbnZhbGlkX2RhdGFsZW47CiAKQEAgLTMzOCw3ICszMzcsNyBAQAogCiAJCWlmIChudG9oMjQocmVqZWN0LT5kbGVuZ3RoKSA+PSBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpIHsKIAkJCW1lbWNweSgmcmVqZWN0ZWRfcGR1LCBkYXRhLCBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpOwotCQkJaXR0ID0gcmVqZWN0ZWRfcGR1Lml0dCAmIElTQ1NJX0lUVF9NQVNLOworCQkJaXR0ID0gZ2V0X2l0dChyZWplY3RlZF9wZHUuaXR0KTsKIAkJCXByaW50ayhLRVJOX0VSUiAiaXR0IDB4JXggaGFkIHBkdSAob3AgMHgleCkgcmVqZWN0ZWQgIgogCQkJCSJkdWUgdG8gRGF0YURpZ2VzdCBlcnJvci5cbiIsIGl0dCwKIAkJCQlyZWplY3RlZF9wZHUub3Bjb2RlKTsKQEAgLTM2NywxMCArMzY2LDEwIEBACiAJc3RydWN0IGlzY3NpX21nbXRfdGFzayAqbXRhc2s7CiAJdWludDMyX3QgaXR0OwogCi0JaWYgKGhkci0+aXR0ICE9IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRykpCi0JCWl0dCA9IGhkci0+aXR0ICYgSVNDU0lfSVRUX01BU0s7CisJaWYgKGhkci0+aXR0ICE9IFJFU0VSVkVEX0lUVCkKKwkJaXR0ID0gZ2V0X2l0dChoZHItPml0dCk7CiAJZWxzZQotCQlpdHQgPSBoZHItPml0dDsKKwkJaXR0ID0gfjBVOwogCiAJaWYgKGl0dCA8IHNlc3Npb24tPmNtZHNfbWF4KSB7CiAJCWN0YXNrID0gc2Vzc2lvbi0+Y21kc1tpdHRdOwpAQCAtNDQwLDcgKzQzOSw3IEBACiAJCQlpc2NzaV90bWZfcnNwKGNvbm4sIGhkcik7CiAJCQlicmVhazsKIAkJY2FzZSBJU0NTSV9PUF9OT09QX0lOOgotCQkJaWYgKGhkci0+dHR0ICE9IElTQ1NJX1JFU0VSVkVEX1RBRyB8fCBkYXRhbGVuKSB7CisJCQlpZiAoaGRyLT50dHQgIT0gY3B1X3RvX2JlMzIoSVNDU0lfUkVTRVJWRURfVEFHKSB8fCBkYXRhbGVuKSB7CiAJCQkJcmMgPSBJU0NTSV9FUlJfUFJPVE87CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC00NTcsNyArNDU2LDcgQEAKIAkJCXJjID0gSVNDU0lfRVJSX0JBRF9PUENPREU7CiAJCQlicmVhazsKIAkJfQotCX0gZWxzZSBpZiAoaXR0ID09IElTQ1NJX1JFU0VSVkVEX1RBRykgeworCX0gZWxzZSBpZiAoaXR0ID09IH4wVSkgewogCQlyYyA9IGlzY3NpX2NoZWNrX2Fzc2lnbl9jbWRzbihzZXNzaW9uLAogCQkJCQkgICAgIChzdHJ1Y3QgaXNjc2lfbm9waW4qKWhkcik7CiAJCWlmIChyYykKQEAgLTQ3MCw3ICs0NjksNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlpZiAoaGRyLT50dHQgPT0gSVNDU0lfUkVTRVJWRURfVEFHKQorCQkJaWYgKGhkci0+dHR0ID09IGNwdV90b19iZTMyKElTQ1NJX1JFU0VSVkVEX1RBRykpCiAJCQkJYnJlYWs7CiAKIAkJCWlmIChpc2NzaV9yZWN2X3BkdShjb25uLT5jbHNfY29ubiwgaGRyLCBOVUxMLCAwKSkKQEAgLTUxNiwyNCArNTE1LDI0IEBACiAJc3RydWN0IGlzY3NpX2NtZF90YXNrICpjdGFzazsKIAl1aW50MzJfdCBpdHQ7CiAKLQlpZiAoaGRyLT5pdHQgIT0gY3B1X3RvX2JlMzIoSVNDU0lfUkVTRVJWRURfVEFHKSkgewotCQlpZiAoKGhkci0+aXR0ICYgSVNDU0lfQUdFX01BU0spICE9CisJaWYgKGhkci0+aXR0ICE9IFJFU0VSVkVEX0lUVCkgeworCQlpZiAoKChfX2ZvcmNlIHUzMiloZHItPml0dCAmIElTQ1NJX0FHRV9NQVNLKSAhPQogCQkgICAgKHNlc3Npb24tPmFnZSA8PCBJU0NTSV9BR0VfU0hJRlQpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiByZWNlaXZlZCBpdHQgJXggZXhwZWN0ZWQgIgotCQkJCSJzZXNzaW9uIGFnZSAoJXgpXG4iLCBoZHItPml0dCwKKwkJCQkic2Vzc2lvbiBhZ2UgKCV4KVxuIiwgKF9fZm9yY2UgdTMyKWhkci0+aXR0LAogCQkJCXNlc3Npb24tPmFnZSAmIElTQ1NJX0FHRV9NQVNLKTsKIAkJCXJldHVybiBJU0NTSV9FUlJfQkFEX0lUVDsKIAkJfQogCi0JCWlmICgoaGRyLT5pdHQgJiBJU0NTSV9DSURfTUFTSykgIT0KKwkJaWYgKCgoX19mb3JjZSB1MzIpaGRyLT5pdHQgJiBJU0NTSV9DSURfTUFTSykgIT0KIAkJICAgIChjb25uLT5pZCA8PCBJU0NTSV9DSURfU0hJRlQpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiByZWNlaXZlZCBpdHQgJXgsIGV4cGVjdGVkICIKLQkJCQkiQ0lEICgleClcbiIsIGhkci0+aXR0LCBjb25uLT5pZCk7CisJCQkJIkNJRCAoJXgpXG4iLCAoX19mb3JjZSB1MzIpaGRyLT5pdHQsIGNvbm4tPmlkKTsKIAkJCXJldHVybiBJU0NTSV9FUlJfQkFEX0lUVDsKIAkJfQotCQlpdHQgPSBoZHItPml0dCAmIElTQ1NJX0lUVF9NQVNLOworCQlpdHQgPSBnZXRfaXR0KGhkci0+aXR0KTsKIAl9IGVsc2UKLQkJaXR0ID0gaGRyLT5pdHQ7CisJCWl0dCA9IH4wVTsKIAogCWlmIChpdHQgPCBzZXNzaW9uLT5jbWRzX21heCkgewogCQljdGFzayA9IHNlc3Npb24tPmNtZHNbaXR0XTsKQEAgLTg5Niw5ICs4OTUsOCBAQAogCS8qCiAJICogcHJlLWZvcm1hdCBDbWRTTiBmb3Igb3V0Z29pbmcgUERVLgogCSAqLwotCWlmIChoZHItPml0dCAhPSBjcHVfdG9fYmUzMihJU0NTSV9SRVNFUlZFRF9UQUcpKSB7Ci0JCWhkci0+aXR0ID0gbXRhc2stPml0dCB8IChjb25uLT5pZCA8PCBJU0NTSV9DSURfU0hJRlQpIHwKLQkJCSAgIChzZXNzaW9uLT5hZ2UgPDwgSVNDU0lfQUdFX1NISUZUKTsKKwlpZiAoaGRyLT5pdHQgIT0gUkVTRVJWRURfSVRUKSB7CisJCWhkci0+aXR0ID0gYnVpbGRfaXR0KG10YXNrLT5pdHQsIGNvbm4tPmlkLCBzZXNzaW9uLT5hZ2UpOwogCQlub3AtPmNtZHNuID0gY3B1X3RvX2JlMzIoc2Vzc2lvbi0+Y21kc24pOwogCQlpZiAoY29ubi0+Y19zdGFnZSA9PSBJU0NTSV9DT05OX1NUQVJURUQgJiYKIAkJICAgICEoaGRyLT5vcGNvZGUgJiBJU0NTSV9PUF9JTU1FRElBVEUpKQpAQCAtMTA2NCw3ICsxMDYyLDcgQEAKIAogCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CiAJY3Rhc2stPm10YXNrID0gKHN0cnVjdCBpc2NzaV9tZ210X3Rhc2sgKikKLQkJCXNlc3Npb24tPm1nbXRfY21kc1soaGRyLT5pdHQgJiBJU0NTSV9JVFRfTUFTSykgLQorCQkJc2Vzc2lvbi0+bWdtdF9jbWRzW2dldF9pdHQoaGRyLT5pdHQpIC0KIAkJCQkJSVNDU0lfTUdNVF9JVFRfT0ZGU0VUXTsKIAogCWlmIChjb25uLT50bWFib3J0X3N0YXRlID09IFRNQUJPUlRfSU5JVElBTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zc3QuYyBiL2RyaXZlcnMvc2NzaS9vc3N0LmMKaW5kZXggN2QyMzExMC4uYmQ2YmJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL29zc3QuYworKysgYi9kcml2ZXJzL3Njc2kvb3NzdC5jCkBAIC01MjEsMTAgKzUyMSwxMCBAQAogCQlicmVhazsKIAkgIGRlZmF1bHQ6IDsgLyogcHJvYmFibHkgRklMTCAqLwogCX0KLQlhdXgtPmZpbGVtYXJrX2NudCA9IG50b2hsKFNUcC0+ZmlsZW1hcmtfY250KTsKLQlhdXgtPnBoeXNfZm0gPSBudG9obCgweGZmZmZmZmZmKTsKLQlhdXgtPmxhc3RfbWFya19wcG9zID0gbnRvaGwoU1RwLT5sYXN0X21hcmtfcHBvcyk7Ci0JYXV4LT5sYXN0X21hcmtfbGJuICA9IG50b2hsKFNUcC0+bGFzdF9tYXJrX2xibik7CisJYXV4LT5maWxlbWFya19jbnQgPSBodG9ubChTVHAtPmZpbGVtYXJrX2NudCk7CisJYXV4LT5waHlzX2ZtID0gaHRvbmwoMHhmZmZmZmZmZik7CisJYXV4LT5sYXN0X21hcmtfcHBvcyA9IGh0b25sKFNUcC0+bGFzdF9tYXJrX3Bwb3MpOworCWF1eC0+bGFzdF9tYXJrX2xibiAgPSBodG9ubChTVHAtPmxhc3RfbWFya19sYm4pOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zc3QuaCBiL2RyaXZlcnMvc2NzaS9vc3N0LmgKaW5kZXggMWU0MjZmNS4uMmNjN2I1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL29zc3QuaAorKysgYi9kcml2ZXJzL3Njc2kvb3NzdC5oCkBAIC0yODgsMTEgKzI4OCwxMSBAQAogI2Vsc2UKICNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKICNlbmRpZgotICAgICAgICB1MTYgICAgICAgICAgICAgbWF4X3NwZWVkOyAgICAgICAgICAgICAgLyogTWF4aW11bSBzcGVlZCBzdXBwb3J0ZWQgaW4gS0JwcyAqLworICAgICAgICBfX2JlMTYgICAgICAgICAgbWF4X3NwZWVkOyAgICAgICAgICAgICAgLyogTWF4aW11bSBzcGVlZCBzdXBwb3J0ZWQgaW4gS0JwcyAqLwogICAgICAgICB1OCAgICAgICAgICAgICAgcmVzZXJ2ZWQxMCwgcmVzZXJ2ZWQxMTsKLSAgICAgICAgdTE2ICAgICAgICAgICAgIGN0bDsgICAgICAgICAgICAgICAgICAgIC8qIENvbnRpbnVvdXMgVHJhbnNmZXIgTGltaXQgaW4gYmxvY2tzICovCi0gICAgICAgIHUxNiAgICAgICAgICAgICBzcGVlZDsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IFNwZWVkLCBpbiBLQnBzICovCi0gICAgICAgIHUxNiAgICAgICAgICAgICBidWZmZXJfc2l6ZTsgICAgICAgICAgICAvKiBCdWZmZXIgU2l6ZSwgaW4gNTEyIGJ5dGVzICovCisgICAgICAgIF9fYmUxNiAgICAgICAgICBjdGw7ICAgICAgICAgICAgICAgICAgICAvKiBDb250aW51b3VzIFRyYW5zZmVyIExpbWl0IGluIGJsb2NrcyAqLworICAgICAgICBfX2JlMTYgICAgICAgICAgc3BlZWQ7ICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBTcGVlZCwgaW4gS0JwcyAqLworICAgICAgICBfX2JlMTYgICAgICAgICAgYnVmZmVyX3NpemU7ICAgICAgICAgICAgLyogQnVmZmVyIFNpemUsIGluIDUxMiBieXRlcyAqLwogICAgICAgICB1OCAgICAgICAgICAgICAgcmVzZXJ2ZWQxOCwgcmVzZXJ2ZWQxOTsKIH0gb3NzdF9jYXBhYmlsaXRpZXNfcGFnZV90OwogCkBAIC0zNTIsOCArMzUyLDggQEAKIAl1OAkJcmVzZXJ2ZWQyOwogCXU4CQlkZW5zaXR5OwogCXU4CQlyZXNlcnZlZDMscmVzZXJ2ZWQ0OwotCXUxNgkJc2VndHJrOwotCXUxNgkJdHJrczsKKwlfX2JlMTYJCXNlZ3RyazsKKwlfX2JlMTYJCXRya3M7CiAJdTgJCXJlc2VydmVkNSxyZXNlcnZlZDYscmVzZXJ2ZWQ3LHJlc2VydmVkOCxyZXNlcnZlZDkscmVzZXJ2ZWQxMDsKIH0gb3NzdF90YXBlX3BhcmFtdHJfcGFnZV90OwogCkBAIC0zNjksMTggKzM2OSwxOCBAQAogdHlwZWRlZiBzdHJ1Y3Qgb3NfcGFydGl0aW9uX3MgewogICAgICAgICBfX3U4ICAgIHBhcnRpdGlvbl9udW07CiAgICAgICAgIF9fdTggICAgcGFyX2Rlc2NfdmVyOwotICAgICAgICBfX3UxNiAgIHdydF9wYXNzX2NudHI7Ci0gICAgICAgIF9fdTMyICAgZmlyc3RfZnJhbWVfcHBvczsKLSAgICAgICAgX191MzIgICBsYXN0X2ZyYW1lX3Bwb3M7Ci0gICAgICAgIF9fdTMyICAgZW9kX2ZyYW1lX3Bwb3M7CisgICAgICAgIF9fYmUxNiAgd3J0X3Bhc3NfY250cjsKKyAgICAgICAgX19iZTMyICBmaXJzdF9mcmFtZV9wcG9zOworICAgICAgICBfX2JlMzIgIGxhc3RfZnJhbWVfcHBvczsKKyAgICAgICAgX19iZTMyICBlb2RfZnJhbWVfcHBvczsKIH0gb3NfcGFydGl0aW9uX3Q7CiAKIC8qCiAgKiBEQVQgZW50cnkKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3NfZGF0X2VudHJ5X3MgewotICAgICAgICBfX3UzMiAgIGJsa19zejsKLSAgICAgICAgX191MTYgICBibGtfY250OworICAgICAgICBfX2JlMzIgIGJsa19zejsKKyAgICAgICAgX19iZTE2ICBibGtfY250OwogICAgICAgICBfX3U4ICAgIGZsYWdzOwogICAgICAgICBfX3U4ICAgIHJlc2VydmVkOwogfSBvc19kYXRfZW50cnlfdDsKQEAgLTQxMiwyMyArNDEyLDIzIEBACiAgKiBBVVgKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3NfYXV4X3MgewotICAgICAgICBfX3UzMiAgICAgICAgICAgZm9ybWF0X2lkOyAgICAgICAgICAgICAgLyogaGFyZHdhcmUgY29tcGFiaWxpdHkgQVVYIGlzIGJhc2VkIG9uICovCisgICAgICAgIF9fYmUzMiAgICAgICAgICBmb3JtYXRfaWQ7ICAgICAgICAgICAgICAvKiBoYXJkd2FyZSBjb21wYWJpbGl0eSBBVVggaXMgYmFzZWQgb24gKi8KICAgICAgICAgY2hhciAgICAgICAgICAgIGFwcGxpY2F0aW9uX3NpZ1s0XTsgICAgIC8qIGRyaXZlciB1c2VkIHRvIHdyaXRlIHRoaXMgbWVkaWEgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgIGhkd3I7ICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICB1cGRhdGVfZnJhbWVfY250cjsgICAgICAvKiBmb3IgY29uZmlndXJhdGlvbiBmcmFtZSAqLworICAgICAgICBfX2JlMzIgICAgICAgICAgaGR3cjsgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgX19iZTMyICAgICAgICAgIHVwZGF0ZV9mcmFtZV9jbnRyOyAgICAgIC8qIGZvciBjb25maWd1cmF0aW9uIGZyYW1lICovCiAgICAgICAgIF9fdTggICAgICAgICAgICBmcmFtZV90eXBlOwogICAgICAgICBfX3U4ICAgICAgICAgICAgZnJhbWVfdHlwZV9yZXNlcnZlZDsKICAgICAgICAgX191OCAgICAgICAgICAgIHJlc2VydmVkXzE4XzE5WzJdOwogICAgICAgICBvc19wYXJ0aXRpb25fdCAgcGFydGl0aW9uOwogICAgICAgICBfX3U4ICAgICAgICAgICAgcmVzZXJ2ZWRfMzZfNDNbOF07Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBmcmFtZV9zZXFfbnVtOwotICAgICAgICBfX3UzMiAgICAgICAgICAgbG9naWNhbF9ibGtfbnVtX2hpZ2g7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBsb2dpY2FsX2Jsa19udW07CisgICAgICAgIF9fYmUzMiAgICAgICAgICBmcmFtZV9zZXFfbnVtOworICAgICAgICBfX2JlMzIgICAgICAgICAgbG9naWNhbF9ibGtfbnVtX2hpZ2g7CisgICAgICAgIF9fYmUzMiAgICAgICAgICBsb2dpY2FsX2Jsa19udW07CiAgICAgICAgIG9zX2RhdF90ICAgICAgICBkYXQ7CiAgICAgICAgIF9fdTggICAgICAgICAgICByZXNlcnZlZDE4OF8xOTFbNF07Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBmaWxlbWFya19jbnQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBwaHlzX2ZtOwotICAgICAgICBfX3UzMiAgICAgICAgICAgbGFzdF9tYXJrX3Bwb3M7CisgICAgICAgIF9fYmUzMiAgICAgICAgICBmaWxlbWFya19jbnQ7CisgICAgICAgIF9fYmUzMiAgICAgICAgICBwaHlzX2ZtOworICAgICAgICBfX2JlMzIgICAgICAgICAgbGFzdF9tYXJrX3Bwb3M7CiAgICAgICAgIF9fdTggICAgICAgICAgICByZXNlcnZlZDIwNF8yMjNbMjBdOwogCiAgICAgICAgIC8qCkBAIC00MzYsOCArNDM2LDggQEAKICAgICAgICAgICoKICAgICAgICAgICogTGludXggc3BlY2lmaWMgZmllbGRzOgogICAgICAgICAgKi8KLSAgICAgICAgIF9fdTMyICAgICAgICAgIG5leHRfbWFya19wcG9zOyAgICAgICAgIC8qIHdoZW4ga25vd24sIHBvaW50cyB0byBuZXh0IG1hcmtlciAqLwotCSBfX3UzMgkJbGFzdF9tYXJrX2xibjsJCS8qIHN0b3JpbmcgbG9nX2Jsa19udW0gb2YgbGFzdCBtYXJrIGlzIGV4dGVuZHMgQURSIHNwZWMgKi8KKyAgICAgICAgIF9fYmUzMiAgICAgICAgIG5leHRfbWFya19wcG9zOyAgICAgICAgIC8qIHdoZW4ga25vd24sIHBvaW50cyB0byBuZXh0IG1hcmtlciAqLworCSBfX2JlMzIJCWxhc3RfbWFya19sYm47CQkvKiBzdG9yaW5nIGxvZ19ibGtfbnVtIG9mIGxhc3QgbWFyayBpcyBleHRlbmRzIEFEUiBzcGVjICovCiAgICAgICAgICBfX3U4ICAgICAgICAgICBsaW51eF9zcGVjaWZpY1syNF07CiAKICAgICAgICAgX191OCAgICAgICAgICAgIHJlc2VydmVkXzI1Nl81MTFbMjU2XTsKQEAgLTQ1MCwxOSArNDUwLDE5IEBACiAJX191OAkJcmVzZXJ2ZWRfMTsKIAlfX3U4CQlmbV90YWJfZW50X3N6OwogCV9fdTgJCXJlc2VydmVkXzM7Ci0JX191MTYJCWZtX3RhYl9lbnRfY250OworCV9fYmUxNgkJZm1fdGFiX2VudF9jbnQ7CiAJX191OAkJcmVzZXJ2ZWQ2XzE1WzEwXTsKLQlfX3UzMgkJZm1fdGFiX2VudFtPU19GTV9UQUJfTUFYXTsKKwlfX2JlMzIJCWZtX3RhYl9lbnRbT1NfRk1fVEFCX01BWF07CiB9IG9zX2ZtX3RhYl90OwogCiB0eXBlZGVmIHN0cnVjdCBvc19leHRfdHJrX2V5X3MgewogCV9fdTgJCWV0X3BhcnRfbnVtOwogCV9fdTgJCWZtdDsKLQlfX3UxNgkJZm1fdGFiX29mZjsKKwlfX2JlMTYJCWZtX3RhYl9vZmY7CiAJX191OAkJcmVzZXJ2ZWQ0XzdbNF07Ci0JX191MzIJCWxhc3RfaGxiX2hpOwotCV9fdTMyCQlsYXN0X2hsYjsKLQlfX3UzMgkJbGFzdF9wcDsKKwlfX2JlMzIJCWxhc3RfaGxiX2hpOworCV9fYmUzMgkJbGFzdF9obGI7CisJX19iZTMyCQlsYXN0X3BwOwogCV9fdTgJCXJlc2VydmVkMjBfMzFbMTJdOwogfSBvc19leHRfdHJrX2V5X3Q7CiAKQEAgLTQ3OSwxNyArNDc5LDE3IEBACiAgICAgICAgIGNoYXIgICAgICAgICAgICBpZGVudF9zdHJbOF07CiAgICAgICAgIF9fdTggICAgICAgICAgICBtYWpvcl9yZXY7CiAgICAgICAgIF9fdTggICAgICAgICAgICBtaW5vcl9yZXY7Ci0JX191MTYJCWV4dF90cmtfdGJfb2ZmOworCV9fYmUxNgkJZXh0X3Rya190Yl9vZmY7CiAgICAgICAgIF9fdTggICAgICAgICAgICByZXNlcnZlZDEyXzE1WzRdOwogICAgICAgICBfX3U4ICAgICAgICAgICAgcHRfcGFyX251bTsKICAgICAgICAgX191OCAgICAgICAgICAgIHB0X3Jlc2VydmVkMV8zWzNdOwogICAgICAgICBvc19wYXJ0aXRpb25fdCAgcGFydGl0aW9uWzE2XTsKLQlfX3UzMgkJY2ZnX2NvbF93aWR0aDsKLQlfX3UzMgkJZGF0X2NvbF93aWR0aDsKLQlfX3UzMgkJcWZhX2NvbF93aWR0aDsKKwlfX2JlMzIJCWNmZ19jb2xfd2lkdGg7CisJX19iZTMyCQlkYXRfY29sX3dpZHRoOworCV9fYmUzMgkJcWZhX2NvbF93aWR0aDsKIAlfX3U4CQljYXJ0cmlkZ2VbMTZdOwogCV9fdTgJCXJlc2VydmVkMzA0XzUxMVsyMDhdOwotCV9fdTMyCQlvbGRfZmlsZW1hcmtfbGlzdFsxNjY4MC80XTsJCS8qIGluIEFEUiAxLjQgX191OCB0cmFja190YWJsZVsxNjY4MF0gKi8KKwlfX2JlMzIJCW9sZF9maWxlbWFya19saXN0WzE2NjgwLzRdOwkJLyogaW4gQURSIDEuNCBfX3U4IHRyYWNrX3RhYmxlWzE2NjgwXSAqLwogCW9zX2V4dF90cmtfdGJfdAlleHRfdHJhY2tfdGI7CiAJX191OAkJcmVzZXJ2ZWQxNzI3Ml8xNzczNVs0NjRdOwogCW9zX2ZtX3RhYl90CWRhdF9mbV90YWI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC91YXJ0bGl0ZS5jIGIvZHJpdmVycy9zZXJpYWwvdWFydGxpdGUuYwppbmRleCBkYjg2MDdlLi5mNTA1MWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC91YXJ0bGl0ZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3VhcnRsaXRlLmMKQEAgLTI1Niw3ICsyNTYsNyBAQAogewogCXJlbGVhc2VfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBVTElURV9SRUdJT04pOwogCWlvdW5tYXAocG9ydC0+bWVtYmFzZSk7Ci0JcG9ydC0+bWVtYmFzZSA9IDA7CisJcG9ydC0+bWVtYmFzZSA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgdWxpdGVfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC00MzgsNyArNDM4LDcgQEAKIAlwb3J0LT5pb3R5cGUJPSBVUElPX01FTTsKIAlwb3J0LT5pb2Jhc2UJPSAxOyAvKiBtYXJrIHBvcnQgaW4gdXNlICovCiAJcG9ydC0+bWFwYmFzZQk9IHJlcy0+c3RhcnQ7Ci0JcG9ydC0+bWVtYmFzZQk9IDA7CisJcG9ydC0+bWVtYmFzZQk9IE5VTEw7CiAJcG9ydC0+b3BzCT0gJnVsaXRlX29wczsKIAlwb3J0LT5pcnEJPSByZXMyLT5zdGFydDsKIAlwb3J0LT5mbGFncwk9IFVQRl9CT09UX0FVVE9DT05GOwpAQCAtNDYyLDcgKzQ2Miw3IEBACiAJCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZ1bGl0ZV91YXJ0X2RyaXZlciwgcG9ydCk7CiAKIAkvKiBtYXJrIHBvcnQgYXMgZnJlZSAqLwotCXBvcnQtPm1lbWJhc2UgPSAwOworCXBvcnQtPm1lbWJhc2UgPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHMzLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHMzLmMKaW5kZXggMzcxZjE5NC4uNGQ3ODFhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBzMy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wczMuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG1taW8gbWFwcGVkX2FkZHIgJWx4aFxuIiwgX19mdW5jX18sCiAJCV9fTElORV9fLCBkZXYtPm1fcmVnaW9uLT5scGFyX2FkZHIpOwogCi0JcmVzdWx0ID0gcHMzX2FsbG9jX2lvX2lycShkZXYtPmludGVycnVwdF9pZCwgJnZpcnEpOworCXJlc3VsdCA9IHBzM19hbGxvY19pb19pcnEoUFMzX0JJTkRJTkdfQ1BVX0FOWSwgZGV2LT5pbnRlcnJ1cHRfaWQsICZ2aXJxKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHBzM19jb25zdHJ1Y3RfaW9faXJxKCVkKSBmYWlsZWQuXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAppbmRleCBlYzBkYTAzLi40NmZhNTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaApAQCAtNjc3LDEwICs2NzcsMTAgQEAKIHsKICNpZmRlZiBDT05GSUdfVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCiAJcmV0dXJuIGVoY2lfYmlnX2VuZGlhbl9tbWlvKGVoY2kpID8KLQkJcmVhZGxfYmUoKF9fZm9yY2UgdTMyICopcmVncykgOgotCQlyZWFkbCgoX19mb3JjZSB1MzIgKilyZWdzKTsKKwkJcmVhZGxfYmUocmVncykgOgorCQlyZWFkbChyZWdzKTsKICNlbHNlCi0JcmV0dXJuIHJlYWRsKChfX2ZvcmNlIHUzMiAqKXJlZ3MpOworCXJldHVybiByZWFkbChyZWdzKTsKICNlbmRpZgogfQogCkBAIC02ODksMTAgKzY4OSwxMCBAQAogewogI2lmZGVmIENPTkZJR19VU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KIAllaGNpX2JpZ19lbmRpYW5fbW1pbyhlaGNpKSA/Ci0JCXdyaXRlbF9iZSh2YWwsIChfX2ZvcmNlIHUzMiAqKXJlZ3MpIDoKLQkJd3JpdGVsKHZhbCwgKF9fZm9yY2UgdTMyICopcmVncyk7CisJCXdyaXRlbF9iZSh2YWwsIHJlZ3MpIDoKKwkJd3JpdGVsKHZhbCwgcmVncyk7CiAjZWxzZQotCXdyaXRlbCh2YWwsIChfX2ZvcmNlIHUzMiAqKXJlZ3MpOworCXdyaXRlbCh2YWwsIHJlZ3MpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wczMuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wczMuYwppbmRleCA2OWQ5NDhiLi42MjI4M2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHMzLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBzMy5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogbW1pbyBtYXBwZWRfYWRkciAlbHhoXG4iLCBfX2Z1bmNfXywKIAkJX19MSU5FX18sIGRldi0+bV9yZWdpb24tPmxwYXJfYWRkcik7CiAKLQlyZXN1bHQgPSBwczNfYWxsb2NfaW9faXJxKGRldi0+aW50ZXJydXB0X2lkLCAmdmlycSk7CisJcmVzdWx0ID0gcHMzX2FsbG9jX2lvX2lycShQUzNfQklORElOR19DUFVfQU5ZLCBkZXYtPmludGVycnVwdF9pZCwgJnZpcnEpOwogCiAJaWYgKHJlc3VsdCkgewogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcHMzX2NvbnN0cnVjdF9pb19pcnEoJWQpIGZhaWxlZC5cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS5oCmluZGV4IDBkYWZjZGEuLmMyYjVlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS5oCkBAIC01MDcsMTAgKzUwNywxMCBAQAogewogI2lmZGVmIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8KIAlyZXR1cm4gYmlnX2VuZGlhbl9tbWlvKG9oY2kpID8KLQkJcmVhZGxfYmUgKChfX2ZvcmNlIHUzMiAqKXJlZ3MpIDoKLQkJcmVhZGwgKChfX2ZvcmNlIHUzMiAqKXJlZ3MpOworCQlyZWFkbF9iZSAocmVncykgOgorCQlyZWFkbCAocmVncyk7CiAjZWxzZQotCXJldHVybiByZWFkbCAoKF9fZm9yY2UgdTMyICopcmVncyk7CisJcmV0dXJuIHJlYWRsIChyZWdzKTsKICNlbmRpZgogfQogCkBAIC01MTksMTAgKzUxOSwxMCBAQAogewogI2lmZGVmIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8KIAliaWdfZW5kaWFuX21taW8ob2hjaSkgPwotCQl3cml0ZWxfYmUgKHZhbCwgKF9fZm9yY2UgdTMyICopcmVncykgOgotCQl3cml0ZWwgKHZhbCwgKF9fZm9yY2UgdTMyICopcmVncyk7CisJCXdyaXRlbF9iZSAodmFsLCByZWdzKSA6CisJCXdyaXRlbCAodmFsLCByZWdzKTsKICNlbHNlCi0JCXdyaXRlbCAodmFsLCAoX19mb3JjZSB1MzIgKilyZWdzKTsKKwkJd3JpdGVsICh2YWwsIHJlZ3MpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYyBiL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYwppbmRleCBhNmYwZjRkLi4zMWU1ZmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvZ2w2MjBhLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2dsNjIwYS5jCkBAIC03MCwxMiArNzAsMTIgQEAKIAkoKChHTF9NQVhfUEFDS0VUX0xFTiArIDQpICogR0xfTUFYX1RSQU5TTUlUX1BBQ0tFVFMpICsgNCkKIAogc3RydWN0IGdsX3BhY2tldCB7Ci0JdTMyCQlwYWNrZXRfbGVuZ3RoOworCV9fbGUzMgkJcGFja2V0X2xlbmd0aDsKIAljaGFyCQlwYWNrZXRfZGF0YSBbMV07CiB9OwogCiBzdHJ1Y3QgZ2xfaGVhZGVyIHsKLQl1MzIJCQlwYWNrZXRfY291bnQ7CisJX19sZTMyCQkJcGFja2V0X2NvdW50OwogCXN0cnVjdCBnbF9wYWNrZXQJcGFja2V0czsKIH07CiAKQEAgLTg1LDE1ICs4NSwxNCBAQAogCXN0cnVjdCBnbF9wYWNrZXQJKnBhY2tldDsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKmdsX3NrYjsKIAl1MzIJCQlzaXplOworCXUzMgkJCWNvdW50OwogCiAJaGVhZGVyID0gKHN0cnVjdCBnbF9oZWFkZXIgKikgc2tiLT5kYXRhOwogCiAJLy8gZ2V0IHRoZSBwYWNrZXQgY291bnQgb2YgdGhlIHJlY2VpdmVkIHNrYgotCWxlMzJfdG9fY3B1cygmaGVhZGVyLT5wYWNrZXRfY291bnQpOwotCWlmICgoaGVhZGVyLT5wYWNrZXRfY291bnQgPiBHTF9NQVhfVFJBTlNNSVRfUEFDS0VUUykKLQkJCXx8IChoZWFkZXItPnBhY2tldF9jb3VudCA8IDApKSB7Ci0JCWRiZygiZ2VuZWxpbms6IGludmFsaWQgcmVjZWl2ZWQgcGFja2V0IGNvdW50ICVkIiwKLQkJCWhlYWRlci0+cGFja2V0X2NvdW50KTsKKwljb3VudCA9IGxlMzJfdG9fY3B1KGhlYWRlci0+cGFja2V0X2NvdW50KTsKKwlpZiAoY291bnQgPiBHTF9NQVhfVFJBTlNNSVRfUEFDS0VUUykgeworCQlkYmcoImdlbmVsaW5rOiBpbnZhbGlkIHJlY2VpdmVkIHBhY2tldCBjb3VudCAldSIsIGNvdW50KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMDMsNyArMTAyLDcgQEAKIAkvLyBkZWNyZW1lbnQgdGhlIGxlbmd0aCBmb3IgdGhlIHBhY2tldCBjb3VudCBzaXplIDQgYnl0ZXMKIAlza2JfcHVsbChza2IsIDQpOwogCi0Jd2hpbGUgKGhlYWRlci0+cGFja2V0X2NvdW50ID4gMSkgeworCXdoaWxlIChjb3VudCA+IDEpIHsKIAkJLy8gZ2V0IHRoZSBwYWNrZXQgbGVuZ3RoCiAJCXNpemUgPSBsZTMyX3RvX2NwdShwYWNrZXQtPnBhY2tldF9sZW5ndGgpOwogCkBAIC0xMjQsOSArMTIzLDggQEAKIAkJfQogCiAJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgcGFja2V0Ci0JCXBhY2tldCA9IChzdHJ1Y3QgZ2xfcGFja2V0ICopCi0JCQkmcGFja2V0LT5wYWNrZXRfZGF0YSBbc2l6ZV07Ci0JCWhlYWRlci0+cGFja2V0X2NvdW50LS07CisJCXBhY2tldCA9IChzdHJ1Y3QgZ2xfcGFja2V0ICopJnBhY2tldC0+cGFja2V0X2RhdGFbc2l6ZV07CisJCWNvdW50LS07CiAKIAkJLy8gc2hpZnQgdGhlIGRhdGEgcG9pbnRlciB0byB0aGUgbmV4dCBnbF9wYWNrZXQKIAkJc2tiX3B1bGwoc2tiLCBzaXplICsgNCk7CkBAIC0xNDksOCArMTQ3LDggQEAKIAlpbnQJbGVuZ3RoID0gc2tiLT5sZW47CiAJaW50CWhlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CiAJaW50CXRhaWxyb29tID0gc2tiX3RhaWxyb29tKHNrYik7Ci0JdTMyCSpwYWNrZXRfY291bnQ7Ci0JdTMyCSpwYWNrZXRfbGVuOworCV9fbGUzMgkqcGFja2V0X2NvdW50OworCV9fbGUzMgkqcGFja2V0X2xlbjsKIAogCS8vIEZJWE1FOiAgbWFnaWMgbnVtYmVycywgYmxlZWNoCiAJcGFkbGVuID0gKChza2ItPmxlbiArICg0ICsgNCoxKSkgJSA2NCkgPyAwIDogMTsKQEAgLTE3Miw3ICsxNzAsNyBAQAogCX0KIAogCS8vIGF0dGFjaCB0aGUgcGFja2V0IGNvdW50IHRvIHRoZSBoZWFkZXIKLQlwYWNrZXRfY291bnQgPSAodTMyICopIHNrYl9wdXNoKHNrYiwgKDQgKyA0KjEpKTsKKwlwYWNrZXRfY291bnQgPSAoX19sZTMyICopIHNrYl9wdXNoKHNrYiwgKDQgKyA0KjEpKTsKIAlwYWNrZXRfbGVuID0gcGFja2V0X2NvdW50ICsgMTsKIAogCSpwYWNrZXRfY291bnQgPSBjcHVfdG9fbGUzMigxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYwppbmRleCAwNmI0ZmZmLi4zZWMyNDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTAxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jCkBAIC0xNzAsMTMgKzE3MCwxMyBAQAogCQl1bnNpZ25lZCBpbnQgKmRhdGEsIGludCBzaXplKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7Ci0JdTMyICpidWY7CisJX19sZTMyICpidWY7CiAJaW50IHJlc3VsdCwgaSwgbGVuZ3RoOwogCiAJLyogTnVtYmVyIG9mIGludGVnZXJzIHJlcXVpcmVkIHRvIGNvbnRhaW4gdGhlIGFycmF5ICovCiAJbGVuZ3RoID0gKCgoc2l6ZSAtIDEpIHwgMykgKyAxKS80OwogCi0JYnVmID0ga2NhbGxvYyhsZW5ndGgsIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKwlidWYgPSBrY2FsbG9jKGxlbmd0aCwgc2l6ZW9mKF9fbGUzMiksIEdGUF9LRVJORUwpOwogCWlmICghYnVmKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjE2LDEzICsyMTYsMTMgQEAKIAkJdW5zaWduZWQgaW50ICpkYXRhLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwotCXUzMiAqYnVmOworCV9fbGUzMiAqYnVmOwogCWludCByZXN1bHQsIGksIGxlbmd0aDsKIAogCS8qIE51bWJlciBvZiBpbnRlZ2VycyByZXF1aXJlZCB0byBjb250YWluIHRoZSBhcnJheSAqLwogCWxlbmd0aCA9ICgoKHNpemUgLSAxKSB8IDMpICsgMSkvNDsKIAotCWJ1ZiA9IGttYWxsb2MobGVuZ3RoICogc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOworCWJ1ZiA9IGttYWxsb2MobGVuZ3RoICogc2l6ZW9mKF9fbGUzMiksIEdGUF9LRVJORUwpOwogCWlmICghYnVmKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gb3V0IG9mIG1lbW9yeS5cbiIsCiAJCQkJX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb3djb21tcy10Y3AuYyBiL2ZzL2RsbS9sb3djb21tcy10Y3AuYwppbmRleCBmMWVmZDE3Li4wN2UwYTEyIDEwMDY0NAotLS0gYS9mcy9kbG0vbG93Y29tbXMtdGNwLmMKKysrIGIvZnMvZGxtL2xvd2NvbW1zLXRjcC5jCkBAIC0yNjgsMTIgKzI2OCwxMiBAQAogc3RhdGljIGludCByZWNlaXZlX2Zyb21fc29jayhzdHJ1Y3QgY29ubmVjdGlvbiAqY29uKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBtc2doZHIgbXNnOwotCXN0cnVjdCBpb3ZlYyBpb3ZbMl07Ci0JbW1fc2VnbWVudF90IGZzOworCXN0cnVjdCBtc2doZHIgbXNnID0ge307CisJc3RydWN0IGt2ZWMgaW92WzJdOwogCXVuc2lnbmVkIGxlbjsKIAlpbnQgcjsKIAlpbnQgY2FsbF9hZ2Fpbl9zb29uID0gMDsKKwlpbnQgbnZlYzsKIAogCW11dGV4X2xvY2soJmNvbi0+c29ja19tdXRleCk7CiAKQEAgLTI5MywyMSArMjkzLDEzIEBACiAJCWNidWZfaW5pdCgmY29uLT5jYiwgUEFHRV9DQUNIRV9TSVpFKTsKIAl9CiAKLQltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19pb3ZsZW4gPSAxOwotCW1zZy5tc2dfaW92ID0gaW92OwotCW1zZy5tc2dfbmFtZSA9IE5VTEw7Ci0JbXNnLm1zZ19uYW1lbGVuID0gMDsKLQltc2cubXNnX2ZsYWdzID0gMDsKLQogCS8qCiAJICogaW92WzBdIGlzIHRoZSBiaXQgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciBiZXR3ZWVuIHRoZSBjdXJyZW50IGVuZAogCSAqIHBvaW50IChjYi5iYXNlICsgY2IubGVuKSBhbmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgogCSAqLwogCWlvdlswXS5pb3ZfbGVuID0gY29uLT5jYi5iYXNlIC0gY2J1Zl9kYXRhKCZjb24tPmNiKTsKIAlpb3ZbMF0uaW92X2Jhc2UgPSBwYWdlX2FkZHJlc3MoY29uLT5yeF9wYWdlKSArIGNidWZfZGF0YSgmY29uLT5jYik7Ci0JaW92WzFdLmlvdl9sZW4gPSAwOworCW52ZWMgPSAxOwogCiAJLyoKIAkgKiBpb3ZbMV0gaXMgdGhlIGJpdCBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZQpAQCAtMzE3LDE1ICszMDksMTIgQEAKIAkJaW92WzBdLmlvdl9sZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSBjYnVmX2RhdGEoJmNvbi0+Y2IpOwogCQlpb3ZbMV0uaW92X2xlbiA9IGNvbi0+Y2IuYmFzZTsKIAkJaW92WzFdLmlvdl9iYXNlID0gcGFnZV9hZGRyZXNzKGNvbi0+cnhfcGFnZSk7Ci0JCW1zZy5tc2dfaW92bGVuID0gMjsKKwkJbnZlYyA9IDI7CiAJfQogCWxlbiA9IGlvdlswXS5pb3ZfbGVuICsgaW92WzFdLmlvdl9sZW47CiAKLQlmcyA9IGdldF9mcygpOwotCXNldF9mcyhnZXRfZHMoKSk7Ci0JciA9IHJldCA9IHNvY2tfcmVjdm1zZyhjb24tPnNvY2ssICZtc2csIGxlbiwKKwlyID0gcmV0ID0ga2VybmVsX3JlY3Ztc2coY29uLT5zb2NrLCAmbXNnLCBpb3YsIG52ZWMsIGxlbiwKIAkJCSAgICAgICBNU0dfRE9OVFdBSVQgfCBNU0dfTk9TSUdOQUwpOwotCXNldF9mcyhmcyk7CiAKIAlpZiAocmV0IDw9IDApCiAJCWdvdG8gb3V0X2Nsb3NlOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvY3J5cHRvLmMgYi9mcy9lY3J5cHRmcy9jcnlwdG8uYwppbmRleCA3MTk2ZjUwLi5hODZhNTVjIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9jcnlwdG8uYworKysgYi9mcy9lY3J5cHRmcy9jcnlwdG8uYwpAQCAtODI4LDkgKzgyOCw3IEBACiAJCW11dGV4X3VubG9jaygmY3J5cHRfc3RhdC0+Y3NfdGZtX211dGV4KTsKIAkJZ290byBvdXQ7CiAJfQotCWNyeXB0b19ibGtjaXBoZXJfc2V0X2ZsYWdzKGNyeXB0X3N0YXQtPnRmbSwKLQkJCQkgICAoRUNSWVBURlNfREVGQVVMVF9DSEFJTklOR19NT0RFCi0JCQkJICAgIHwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpKTsKKwljcnlwdG9fYmxrY2lwaGVyX3NldF9mbGFncyhjcnlwdF9zdGF0LT50Zm0sIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKTsKIAltdXRleF91bmxvY2soJmNyeXB0X3N0YXQtPmNzX3RmbV9tdXRleCk7CiAJcmMgPSAwOwogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmggYi9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaAppbmRleCBhZmI2NGJkLi4wZjg5NzEwIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaAorKysgYi9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaApAQCAtMTc2LDcgKzE3Niw2IEBACiAjZGVmaW5lIEVDUllQVEZTX0ZJTEVfU0laRV9CWVRFUyA4CiAjZGVmaW5lIEVDUllQVEZTX0RFRkFVTFRfQ0lQSEVSICJhZXMiCiAjZGVmaW5lIEVDUllQVEZTX0RFRkFVTFRfS0VZX0JZVEVTIDE2Ci0jZGVmaW5lIEVDUllQVEZTX0RFRkFVTFRfQ0hBSU5JTkdfTU9ERSBDUllQVE9fVEZNX01PREVfQ0JDCiAjZGVmaW5lIEVDUllQVEZTX0RFRkFVTFRfSEFTSCAibWQ1IgogI2RlZmluZSBFQ1JZUFRGU19UQUdfM19QQUNLRVRfVFlQRSAweDhDCiAjZGVmaW5lIEVDUllQVEZTX1RBR18xMV9QQUNLRVRfVFlQRSAweEVECmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9pby5oIGIvaW5jbHVkZS9hc20tYWxwaGEvaW8uaAppbmRleCA1ZDE1YWYyLi4yNGJkY2M4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2lvLmgKQEAgLTUyNSwxNSArNTI1LDYgQEAKIGV4dGVybiB2b2lkIG91dHNsICh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCk7CiAKIC8qCi0gKiBYWFggLSBXZSBkb24ndCBoYXZlIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21pbygpIHlldCwgc28gd2UgY2hlYXQgaGVyZSBhbmQgCi0gKiBqdXN0IGNvcHkgaXQuIFRoZSBuZXQgY29kZSB3aWxsIHRoZW4gZG8gdGhlIGNoZWNrc3VtIGxhdGVyLiBQcmVzZW50bHkgCi0gKiBvbmx5IHVzZWQgYnkgc29tZSBzaGFyZWQgbWVtb3J5IDgzOTAgRXRoZXJuZXQgY2FyZHMgYW55d2F5LgotICovCi0KLSNkZWZpbmUgZXRoX2lvX2NvcHlfYW5kX3N1bShza2Isc3JjLGxlbix1bnVzZWQpIFwKLSAgbWVtY3B5X2Zyb21pbygoc2tiKS0+ZGF0YSxzcmMsbGVuKQotCi0vKgogICogVGhlIEFscGhhIEplbnNlbiBoYXJkd2FyZSBmb3Igc29tZSByYXRoZXIgc3RyYW5nZSByZWFzb24gcHV0cwogICogdGhlIFJUQyBjbG9jayBhdCAweDE3MCBpbnN0ZWFkIG9mIDB4NzAuIFByb2JhYmx5IGR1ZSB0byBzb21lCiAgKiBtaXNndWlkZWQgaWRlYSBhYm91dCB1c2luZyAweDcwIGZvciBOTUkgc3R1ZmYuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCmluZGV4IDBkNTE3MjYuLmI3YjU0MTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCkBAIC0yMzgsOSArMjM4LDYgQEAKICNkZWZpbmUgbWVtY3B5X2Zyb21pbyhhLGMsbCkJCV9tZW1jcHlfZnJvbWlvKChhKSwoYyksKGwpKQogI2RlZmluZSBtZW1jcHlfdG9pbyhjLGEsbCkJCV9tZW1jcHlfdG9pbygoYyksKGEpLChsKSkKIAotI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKHMsYyxsLGIpIFwKLQkJCQlldGhfY29weV9hbmRfc3VtKChzKSxfX21lbV9wY2koYyksKGwpLChiKSkKLQogc3RhdGljIGlubGluZSBpbnQKIGNoZWNrX3NpZ25hdHVyZShjb25zdCB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmJ1c19hZGRyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsCiAJCWludCBsZW5ndGgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9pby5oCmluZGV4IDI4OGY3NmIxNi4uNWY2MGI0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2lvLmgKQEAgLTE4Miw5ICsxODIsNiBAQAogI2RlZmluZSBtZW1jcHlfZnJvbWlvKGEsYyxsKQlfbWVtY3B5X2Zyb21pbygoYSksX19tZW1fcGNpKGMpLChsKSkKICNkZWZpbmUgbWVtY3B5X3RvaW8oYyxhLGwpCV9tZW1jcHlfdG9pbyhfX21lbV9wY2koYyksKGEpLChsKSkKIAotI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKHMsYyxsLGIpIFwKLQkJCQlldGhfY29weV9hbmRfc3VtKChzKSxfX21lbV9wY2koYyksKGwpLChiKSkKLQogI2VsaWYgIWRlZmluZWQocmVhZGIpCiAKICNkZWZpbmUgcmVhZGIoYykJCQkoX19yZWFkd3JpdGVfYnVnKCJyZWFkYiIpLDApCkBAIC0xOTQsOCArMTkxLDYgQEAKICNkZWZpbmUgd3JpdGV3KHYsYykJCQlfX3JlYWR3cml0ZV9idWcoIndyaXRldyIpCiAjZGVmaW5lIHdyaXRlbCh2LGMpCQkJX19yZWFkd3JpdGVfYnVnKCJ3cml0ZWwiKQogCi0jZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0ocyxjLGwsYikJX19yZWFkd3JpdGVfYnVnKCJldGhfaW9fY29weV9hbmRfc3VtIikKLQogI2RlZmluZSBjaGVja19zaWduYXR1cmUoaW8sc2lnLGxlbikJKDApCiAKICNlbmRpZgkvKiBfX21lbV9wY2kgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2F0MzJhcDcwMDAuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2F0MzJhcDcwMDAuaAppbmRleCBiYTg1ZTA0Li4zOTE0ZDdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9hdDMyYXA3MDAwLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYXQzMmFwNzAwMC5oCkBAIC0yNCwxMCArMjQsMTIgQEAKICNkZWZpbmUgR1BJT19QSU9CX0JBU0UJKEdQSU9fUElPQV9CQVNFICsgMzIpCiAjZGVmaW5lIEdQSU9fUElPQ19CQVNFCShHUElPX1BJT0JfQkFTRSArIDMyKQogI2RlZmluZSBHUElPX1BJT0RfQkFTRQkoR1BJT19QSU9DX0JBU0UgKyAzMikKKyNkZWZpbmUgR1BJT19QSU9FX0JBU0UJKEdQSU9fUElPRF9CQVNFICsgMzIpCiAKICNkZWZpbmUgR1BJT19QSU5fUEEoTikJKEdQSU9fUElPQV9CQVNFICsgKE4pKQogI2RlZmluZSBHUElPX1BJTl9QQihOKQkoR1BJT19QSU9CX0JBU0UgKyAoTikpCiAjZGVmaW5lIEdQSU9fUElOX1BDKE4pCShHUElPX1BJT0NfQkFTRSArIChOKSkKICNkZWZpbmUgR1BJT19QSU5fUEQoTikJKEdQSU9fUElPRF9CQVNFICsgKE4pKQorI2RlZmluZSBHUElPX1BJTl9QRShOKQkoR1BJT19QSU9FX0JBU0UgKyAoTikpCiAKICNlbmRpZiAvKiBfX0FTTV9BUkNIX0FUMzJBUDcwMDBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ncGlvLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiNzU2YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2dwaW8uaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9fQVNNX0FWUjMyX0FSQ0hfR1BJT19ICisjZGVmaW5lIF9fQVNNX0FWUjMyX0FSQ0hfR1BJT19ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworCisvKiBBcmNoLW5ldXRyYWwgR1BJTyBBUEkgKi8KK2ludCBfX211c3RfY2hlY2sgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGludCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCk7Cit2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBpbnQgZ3Bpbyk7CisKK2ludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBpbnQgZ3Bpbyk7CitpbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGludCBncGlvKTsKK2ludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBpbnQgZ3Bpbyk7Cit2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsdWUpOworCitzdGF0aWMgaW5saW5lIGludCBncGlvX3RvX2lycSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlyZXR1cm4gZ3BpbyArIEdQSU9fSVJRX0JBU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpCit7CisJcmV0dXJuIGlycSAtIEdQSU9fSVJRX0JBU0U7Cit9CisKKyNlbmRpZiAvKiBfX0FTTV9BVlIzMl9BUkNIX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvaXJxLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWRmZmFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvaXJxLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfX0FTTV9BVlIzMl9BUkNIX0lSUV9ICisjZGVmaW5lIF9fQVNNX0FWUjMyX0FSQ0hfSVJRX0gKKworI2RlZmluZSBFSU1fSVJRX0JBU0UJTlJfSU5URVJOQUxfSVJRUworI2RlZmluZSBOUl9FSU1fSVJRUwkzMgorCisjZGVmaW5lIEFUMzJfRVhUSU5UKG4pCShFSU1fSVJRX0JBU0UgKyAobikpCisKKyNkZWZpbmUgR1BJT19JUlFfQkFTRQkoRUlNX0lSUV9CQVNFICsgTlJfRUlNX0lSUVMpCisjZGVmaW5lIE5SX0dQSU9fSVJRUwkoNSAqIDMyKQorCisjZGVmaW5lIE5SX0lSUVMJCShHUElPX0lSUV9CQVNFICsgTlJfR1BJT19JUlFTKQorCisjZW5kaWYgLyogX19BU01fQVZSMzJfQVJDSF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvcG9ydG11eC5oIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvcG9ydG11eC5oCmluZGV4IDgzYzY5MDUuLjk5MzA4NzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL3BvcnRtdXguaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9wb3J0bXV4LmgKQEAgLTE1LDEyICsxNSwxNCBAQAogICoKICAqIFRoZSBmb2xsb3dpbmcgZmxhZ3MgZGV0ZXJtaW5lIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBwaW4uCiAgKi8KLSNkZWZpbmUgQVQzMl9HUElPRl9QVUxMVVAJMHgwMDAwMDAwMQkvKiBFbmFibGUgcHVsbC11cCAqLwotI2RlZmluZSBBVDMyX0dQSU9GX09VVFBVVAkweDAwMDAwMDAyCS8qIEVuYWJsZSBvdXRwdXQgZHJpdmVyICovCi0jZGVmaW5lIEFUMzJfR1BJT0ZfSElHSAkJMHgwMDAwMDAwNAkvKiBTZXQgb3V0cHV0IGhpZ2ggKi8KKyNkZWZpbmUgQVQzMl9HUElPRl9QVUxMVVAJMHgwMDAwMDAwMQkvKiAobm90LU9VVCkgRW5hYmxlIHB1bGwtdXAgKi8KKyNkZWZpbmUgQVQzMl9HUElPRl9PVVRQVVQJMHgwMDAwMDAwMgkvKiAoT1VUKSBFbmFibGUgb3V0cHV0IGRyaXZlciAqLworI2RlZmluZSBBVDMyX0dQSU9GX0hJR0gJCTB4MDAwMDAwMDQJLyogKE9VVCkgU2V0IG91dHB1dCBoaWdoICovCisjZGVmaW5lIEFUMzJfR1BJT0ZfREVHTElUQ0gJMHgwMDAwMDAwOAkvKiAoSU4pIEZpbHRlciBnbGl0Y2hlcyAqLwogCiB2b2lkIGF0MzJfc2VsZWN0X3BlcmlwaCh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgcGVyaXBoLAogCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CiB2b2lkIGF0MzJfc2VsZWN0X2dwaW8odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit2b2lkIGF0MzJfcmVzZXJ2ZV9waW4odW5zaWduZWQgaW50IHBpbik7CiAKICNlbmRpZiAvKiBfX0FTTV9BUkNIX1BPUlRNVVhfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tYXZyMzIvY2hlY2tzdW0uaAppbmRleCBhZjlkNTNmLi40ZGRiZmQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2NoZWNrc3VtLmgKQEAgLTM4LDcgKzM4LDcgQEAKICAqCXBhc3NlZCBpbiBhbiBpbmNvcnJlY3Qga2VybmVsIGFkZHJlc3MgdG8gb25lIG9mIHRoZXNlIGZ1bmN0aW9ucy4KICAqCiAgKglJZiB5b3UgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSBwbGVhc2UgZG9uJ3QgZm9yZ2V0IHRoZQotICoJdmVyaWZ5X2FyZWEoKS4KKyAqCWFjY2Vzc19vaygpLgogICovCiBzdGF0aWMgaW5saW5lCiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9kbWEtbWFwcGluZy5oCmluZGV4IDVjMDFlMjcuLjExNTgxM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvZG1hLW1hcHBpbmcuaApAQCAtMzIsNiArMzIsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIGRtYV9tYXBfc2luZ2xlIGNhbid0IGZhaWwgYXMgaXQgaXMgaW1wbGVtZW50ZWQgbm93LgorICovCitzdGF0aWMgaW5saW5lIGludCBkbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcl90IGFkZHIpCit7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogZG1hX2FsbG9jX2NvaGVyZW50IC0gYWxsb2NhdGUgY29uc2lzdGVudCBtZW1vcnkgZm9yIERNQQogICogQGRldjogdmFsaWQgc3RydWN0IGRldmljZSBwb2ludGVyLCBvciBOVUxMIGZvciBJU0EgYW5kIEVJU0EtbGlrZSBkZXZpY2VzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9ncGlvLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllOGNjYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2dwaW8uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19BU01fQVZSMzJfR1BJT19ICisjZGVmaW5lIF9fQVNNX0FWUjMyX0dQSU9fSAorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorCisjZW5kaWYgLyogX19BU01fQVZSMzJfR1BJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9pcnEuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2lycS5oCmluZGV4IGY3ZTcyNTcuLjgzZTY1NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2lycS5oCkBAIC0yLDggKzIsMTIgQEAKICNkZWZpbmUgX19BU01fQVZSMzJfSVJRX0gKIAogI2RlZmluZSBOUl9JTlRFUk5BTF9JUlFTCTY0Ci0jZGVmaW5lIE5SX0VYVEVSTkFMX0lSUVMJNjQKLSNkZWZpbmUgTlJfSVJRUwkJCShOUl9JTlRFUk5BTF9JUlFTICsgTlJfRVhURVJOQUxfSVJRUykKKworI2luY2x1ZGUgPGFzbS9hcmNoL2lycS5oPgorCisjaWZuZGVmIE5SX0lSUVMKKyNkZWZpbmUgTlJfSVJRUwkJCShOUl9JTlRFUk5BTF9JUlFTKQorI2VuZGlmCiAKICNkZWZpbmUgaXJxX2Nhbm9uaWNhbGl6ZShpKQkoaSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvcG9zaXhfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3Bvc2l4X3R5cGVzLmgKaW5kZXggMjgzMWIwMy4uOWUyNTViOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvcG9zaXhfdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9wb3NpeF90eXBlcy5oCkBAIC0yMyw3ICsyMyw3IEBACiB0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF91aWRfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX2dpZF90OwogdHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX3NpemVfdDsKLXR5cGVkZWYgaW50ICAgICAgICAgICAgIF9fa2VybmVsX3NzaXplX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3NzaXplX3Q7CiB0eXBlZGVmIGludCAgICAgICAgICAgICBfX2tlcm5lbF9wdHJkaWZmX3Q7CiB0eXBlZGVmIGxvbmcgICAgICAgICAgICBfX2tlcm5lbF90aW1lX3Q7CiB0eXBlZGVmIGxvbmcgICAgICAgICAgICBfX2tlcm5lbF9zdXNlY29uZHNfdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3VhY2Nlc3MuaAppbmRleCA4MjFkZWI1Li43NGE2NzllOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3VhY2Nlc3MuaApAQCAtNjgsMTIgKzY4LDYgQEAKIAogI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgKGxpa2VseShfX3JhbmdlX29rKGFkZHIsIHNpemUpID09IDApKQogCi1zdGF0aWMgaW5saW5lIGludAotdmVyaWZ5X2FyZWEoaW50IHR5cGUsIGNvbnN0IHZvaWQgX191c2VyICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIGFjY2Vzc19vayh0eXBlLCBhZGRyLCBzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCiAvKiBHZW5lcmljIGFyYml0cmFyeSBzaXplZCBjb3B5LiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBOT1QgY29waWVkICovCiBleHRlcm4gX19rZXJuZWxfc2l6ZV90IF9fY29weV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLAogCQkJCSAgIF9fa2VybmVsX3NpemVfdCBuKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvaW8uaCBiL2luY2x1ZGUvYXNtLWNyaXMvaW8uaAppbmRleCA3MTZjNjliLi5kMTk2ZGQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9pby5oCkBAIC0xMjEsMTEgKzEyMSw2IEBACiAjZGVmaW5lIG1lbWNweV9mcm9taW8oYSxiLGMpCW1lbWNweSgoYSksKHZvaWQgKikoYiksKGMpKQogI2RlZmluZSBtZW1jcHlfdG9pbyhhLGIsYykJbWVtY3B5KCh2b2lkICopKGEpLChiKSwoYykpCiAKLS8qCi0gKiBBZ2FpbiwgQ1JJUyBkb2VzIG5vdCByZXF1aXJlIG1lbSBJTyBzcGVjaWZpYyBmdW5jdGlvbi4KLSAqLwotCi0jZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0oYSxiLGMsZCkJZXRoX2NvcHlfYW5kX3N1bSgoYSksKHZvaWQgX19mb3JjZSAqKShiKSwoYyksKGQpKQogCiAvKiBUaGUgZm9sbG93aW5nIGlzIGp1bmsgbmVlZGVkIGZvciB0aGUgYXJjaC1pbmRlcGVuZGVudCBjb2RlIGJ1dCB3aGljaAogICogd2UgbmV2ZXIgdXNlIGluIHRoZSBDUklTIHBvcnQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvaW8uaCBiL2luY2x1ZGUvYXNtLWkzODYvaW8uaAppbmRleCA4NmZmNWU4Li41OWZlNjE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pby5oCkBAIC0yMTksMTIgKzIxOSw2IEBACiAjZGVmaW5lIF9fSVNBX0lPX2Jhc2UgKChjaGFyIF9faW9tZW0gKikoUEFHRV9PRkZTRVQpKQogCiAvKgotICogQWdhaW4sIGkzODYgZG9lcyBub3QgcmVxdWlyZSBtZW0gSU8gc3BlY2lmaWMgZnVuY3Rpb24uCi0gKi8KLQotI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKGEsYixjLGQpCQlldGhfY29weV9hbmRfc3VtKChhKSwodm9pZCBfX2ZvcmNlICopKGIpLChjKSwoZCkpCi0KLS8qCiAgKglDYWNoZSBtYW5hZ2VtZW50CiAgKgogICoJVGhpcyBuZWVkZWQgZm9yIHR3byBjYXNlcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9pby5oIGIvaW5jbHVkZS9hc20tbWlwcy9pby5oCmluZGV4IDY3ZjA4MTAuLmI2YTJlYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2lvLmgKQEAgLTU1NiwxMiArNTU2LDYgQEAKICNkZWZpbmUgX19JU0FfSU9fYmFzZSAoKGNoYXIgKikoaXNhX3Nsb3Rfb2Zmc2V0KSkKIAogLyoKLSAqIFdlIGRvbid0IGhhdmUgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbWlvKCkgeWV0LCBzbyB3ZSBjaGVhdCBoZXJlIGFuZAotICoganVzdCBjb3B5IGl0LiBUaGUgbmV0IGNvZGUgd2lsbCB0aGVuIGRvIHRoZSBjaGVja3N1bSBsYXRlci4KLSAqLwotI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKHNrYixzcmMsbGVuLHVudXNlZCkgbWVtY3B5X2Zyb21pbygoc2tiKS0+ZGF0YSwoc3JjKSwobGVuKSkKLQotLyoKICAqIFRoZSBjYWNoZXMgb24gc29tZSBhcmNoaXRlY3R1cmVzIGFyZW4ndCBkbWEtY29oZXJlbnQgYW5kIGhhdmUgbmVlZCB0bwogICogaGFuZGxlIHRoaXMgaW4gc29mdHdhcmUuICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygb3BlcmF0aW9ucyB0aGF0CiAgKiBjYW4gYmUgYXBwbGllZCB0byBkbWEgYnVmZmVycy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9pby5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2lvLmgKaW5kZXggYzE5NjNjZS4uY2E0NmU3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2lvLmgKQEAgLTE5MSwxNSArMTkxLDYgQEAKIHZvaWQgbWVtY3B5X2Zyb21pbyh2b2lkICpkc3QsIGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3JjLCBpbnQgY291bnQpOwogdm9pZCBtZW1jcHlfdG9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgY291bnQpOwogCi0vKgotICogWFhYIC0gV2UgZG9uJ3QgaGF2ZSBjc3VtX3BhcnRpYWxfY29weV9mcm9taW8oKSB5ZXQsIHNvIHdlIGNoZWF0IGhlcmUgYW5kIAotICoganVzdCBjb3B5IGl0LiBUaGUgbmV0IGNvZGUgd2lsbCB0aGVuIGRvIHRoZSBjaGVja3N1bSBsYXRlci4gUHJlc2VudGx5IAotICogb25seSB1c2VkIGJ5IHNvbWUgc2hhcmVkIG1lbW9yeSA4MzkwIEV0aGVybmV0IGNhcmRzIGFueXdheS4KLSAqLwotCi0jZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0oc2tiLHNyYyxsZW4sdW51c2VkKSBcCi0gIG1lbWNweV9mcm9taW8oKHNrYiktPmRhdGEsKHNyYyksKGxlbikpCi0KIC8qIFBvcnQtc3BhY2UgSU8gKi8KIAogI2RlZmluZSBpbmJfcCBpbmIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9pby5oIGIvaW5jbHVkZS9hc20tcHBjL2lvLmgKaW5kZXggY2NmMWE5Yi4uOTVkNTkwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2lvLmgKQEAgLTM1OCw4ICszNTgsNiBAQAogfQogI2VuZGlmCiAKLSNkZWZpbmUgZXRoX2lvX2NvcHlfYW5kX3N1bShhLGIsYyxkKQkJZXRoX2NvcHlfYW5kX3N1bSgoYSksKHZvaWQgX19mb3JjZSAqKSh2b2lkIF9faW9tZW0gKikoYiksKGMpLChkKSkKLQogLyoKICAqIE1hcCBpbiBhbiBhcmVhIG9mIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UsIGZvciBhY2Nlc3NpbmcKICAqIEkvTyBkZXZpY2VzIGV0Yy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKaW5kZXggNmVlOWZhZC4uZjVkODRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKQEAgLTI0OCwxMiArMjQ4LDYgQEAKICAqLwogI2RlZmluZSBfX0lTQV9JT19iYXNlICgoY2hhciBfX2lvbWVtICopKFBBR0VfT0ZGU0VUKSkKIAotLyoKLSAqIEFnYWluLCB4ODYtNjQgZG9lcyBub3QgcmVxdWlyZSBtZW0gSU8gc3BlY2lmaWMgZnVuY3Rpb24uCi0gKi8KLQotI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKGEsYixjLGQpCQlldGhfY29weV9hbmRfc3VtKChhKSwodm9pZCAqKShiKSwoYyksKGQpKQotCiAvKiBOb3RoaW5nIHRvIGRvICovCiAKICNkZWZpbmUgZG1hX2NhY2hlX2ludihfc3RhcnQsX3NpemUpCQlkbyB7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NyeXB0by9hbGdhcGkuaCBiL2luY2x1ZGUvY3J5cHRvL2FsZ2FwaS5oCmluZGV4IDU3NDhhZWMuLjRlMDVlOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY3J5cHRvL2FsZ2FwaS5oCisrKyBiL2luY2x1ZGUvY3J5cHRvL2FsZ2FwaS5oCkBAIC0xOCw4ICsxOCw4IEBACiBzdHJ1Y3Qgc2VxX2ZpbGU7CiAKIHN0cnVjdCBjcnlwdG9fdHlwZSB7Ci0JdW5zaWduZWQgaW50ICgqY3R4c2l6ZSkoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7Ci0JaW50ICgqaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisJdW5zaWduZWQgaW50ICgqY3R4c2l6ZSkoc3RydWN0IGNyeXB0b19hbGcgKmFsZywgdTMyIHR5cGUsIHUzMiBtYXNrKTsKKwlpbnQgKCppbml0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogCXZvaWQgKCpleGl0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKIAl2b2lkICgqc2hvdykoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKIH07CkBAIC05Myw3ICs5Myw4IEBACiBpbnQgY3J5cHRvX2luaXRfc3Bhd24oc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcsCiAJCSAgICAgIHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QpOwogdm9pZCBjcnlwdG9fZHJvcF9zcGF3bihzdHJ1Y3QgY3J5cHRvX3NwYXduICpzcGF3bik7Ci1zdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX3NwYXduX3RmbShzdHJ1Y3QgY3J5cHRvX3NwYXduICpzcGF3bik7CitzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX3NwYXduX3RmbShzdHJ1Y3QgY3J5cHRvX3NwYXduICpzcGF3biwgdTMyIHR5cGUsCisJCQkJICAgIHUzMiBtYXNrKTsKIAogc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19nZXRfYXR0cl9hbGcodm9pZCAqcGFyYW0sIHVuc2lnbmVkIGludCBsZW4sCiAJCQkJICAgICAgIHUzMiB0eXBlLCB1MzIgbWFzayk7CkBAIC0xMzIsMTEgKzEzMywyOCBAQAogCXJldHVybiBjcnlwdG9fdGZtX2N0eF9hbGlnbmVkKCZ0Zm0tPmJhc2UpOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fY2lwaGVyICpjcnlwdG9fc3Bhd25fY2lwaGVyKAorCXN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduKQoreworCXUzMiB0eXBlID0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjsKKwl1MzIgbWFzayA9IENSWVBUT19BTEdfVFlQRV9NQVNLOworCisJcmV0dXJuIF9fY3J5cHRvX2NpcGhlcl9jYXN0KGNyeXB0b19zcGF3bl90Zm0oc3Bhd24sIHR5cGUsIG1hc2spKTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgY2lwaGVyX2FsZyAqY3J5cHRvX2NpcGhlcl9hbGcoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKIHsKIAlyZXR1cm4gJmNyeXB0b19jaXBoZXJfdGZtKHRmbSktPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2hhc2ggKmNyeXB0b19zcGF3bl9oYXNoKHN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduKQoreworCXUzMiB0eXBlID0gQ1JZUFRPX0FMR19UWVBFX0hBU0g7CisJdTMyIG1hc2sgPSBDUllQVE9fQUxHX1RZUEVfSEFTSF9NQVNLOworCisJcmV0dXJuIF9fY3J5cHRvX2hhc2hfY2FzdChjcnlwdG9fc3Bhd25fdGZtKHNwYXduLCB0eXBlLCBtYXNrKSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCAqY3J5cHRvX2hhc2hfY3R4X2FsaWduZWQoc3RydWN0IGNyeXB0b19oYXNoICp0Zm0pCiB7CiAJcmV0dXJuIGNyeXB0b190Zm1fY3R4X2FsaWduZWQoJnRmbS0+YmFzZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bWFycC5oIGIvaW5jbHVkZS9saW51eC9hdG1hcnAuaAppbmRleCBlZTEwOGY5Li4yMzFmNGJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0bWFycC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRtYXJwLmgKQEAgLTYsOSArNiw3IEBACiAjaWZuZGVmIF9MSU5VWF9BVE1BUlBfSAogI2RlZmluZSBfTElOVVhfQVRNQVJQX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvYXRtYXBpLmg+CiAjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmggYi9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCmluZGV4IDRhYTkwNDYuLjc3OWFhNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcnlwdG8uaApAQCAtNTEsMTUgKzUxLDkgQEAKIC8qCiAgKiBUcmFuc2Zvcm0gbWFza3MgYW5kIHZhbHVlcyAoZm9yIGNydF9mbGFncykuCiAgKi8KLSNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX01BU0sJCTB4MDAwMDAwZmYKICNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfTUFTSwkJMHgwMDBmZmYwMAogI2RlZmluZSBDUllQVE9fVEZNX1JFU19NQVNLCQkweGZmZjAwMDAwCiAKLSNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0VDQgkJMHgwMDAwMDAwMQotI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0JDCQkweDAwMDAwMDAyCi0jZGVmaW5lIENSWVBUT19URk1fTU9ERV9DRkIJCTB4MDAwMDAwMDQKLSNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NUUgkJMHgwMDAwMDAwOAotCiAjZGVmaW5lIENSWVBUT19URk1fUkVRX1dFQUtfS0VZCQkweDAwMDAwMTAwCiAjZGVmaW5lIENSWVBUT19URk1fUkVRX01BWV9TTEVFUAkweDAwMDAwMjAwCiAjZGVmaW5lIENSWVBUT19URk1fUkVTX1dFQUtfS0VZCQkweDAwMTAwMDAwCkBAIC03MSwxMiArNjUsOCBAQAogLyoKICAqIE1pc2NlbGxhbmVvdXMgc3R1ZmYuCiAgKi8KLSNkZWZpbmUgQ1JZUFRPX1VOU1BFQwkJCTAKICNkZWZpbmUgQ1JZUFRPX01BWF9BTEdfTkFNRQkJNjQKIAotI2RlZmluZSBDUllQVE9fRElSX0VOQ1JZUFQJCTEKLSNkZWZpbmUgQ1JZUFRPX0RJUl9ERUNSWVBUCQkwCi0KIC8qCiAgKiBUaGUgbWFjcm8gQ1JZUFRPX01JTkFMSUdOX0FUVFIgKGFsb25nIHdpdGggdGhlIHZvaWQgKiB0eXBlIGluIHRoZSBhY3R1YWwKICAqIGRlY2xhcmF0aW9uKSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBjcnlwdG9fdGZtIGNvbnRleHQgc3RydWN0dXJlIGlzCkBAIC0xNDgsMTkgKzEzOCw2IEBACiAJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbik7CiAJdm9pZCAoKmNpYV9lbmNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKIAl2b2lkICgqY2lhX2RlY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwotCi0JdW5zaWduZWQgaW50ICgqY2lhX2VuY3J5cHRfZWNiKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCi0JCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKLQl1bnNpZ25lZCBpbnQgKCpjaWFfZGVjcnlwdF9lY2IpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKLQkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKLQkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykgX19kZXByZWNhdGVkOwotCXVuc2lnbmVkIGludCAoKmNpYV9lbmNyeXB0X2NiYykoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAotCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAotCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKSBfX2RlcHJlY2F0ZWQ7Ci0JdW5zaWduZWQgaW50ICgqY2lhX2RlY3J5cHRfY2JjKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCi0JCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCi0JCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKIH07CiAKIHN0cnVjdCBkaWdlc3RfYWxnIHsKQEAgLTI0MywxMSArMjIwLDYgQEAKICNpZmRlZiBDT05GSUdfQ1JZUFRPCiBpbnQgY3J5cHRvX2hhc19hbGcoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYWxnX2F2YWlsYWJsZShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19oYXNfYWxnKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKIHsKIAlyZXR1cm4gMDsKQEAgLTMzOSwxMyArMzExLDE4IEBACiAJdm9pZCAqX19jcnRfY3R4W10gQ1JZUFRPX01JTkFMSUdOX0FUVFI7CiB9OwogCi0jZGVmaW5lIGNyeXB0b19jaXBoZXIgY3J5cHRvX3RmbQotI2RlZmluZSBjcnlwdG9fY29tcCBjcnlwdG9fdGZtCi0KIHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyIHsKIAlzdHJ1Y3QgY3J5cHRvX3RmbSBiYXNlOwogfTsKIAorc3RydWN0IGNyeXB0b19jaXBoZXIgeworCXN0cnVjdCBjcnlwdG9fdGZtIGJhc2U7Cit9OworCitzdHJ1Y3QgY3J5cHRvX2NvbXAgeworCXN0cnVjdCBjcnlwdG9fdGZtIGJhc2U7Cit9OworCiBzdHJ1Y3QgY3J5cHRvX2hhc2ggewogCXN0cnVjdCBjcnlwdG9fdGZtIGJhc2U7CiB9OwpAQCAtMzk1LDQwICszNzIsMTEgQEAKIAlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi0JX19kZXByZWNhdGVkOwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWluX2tleXNpemU7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWF4X2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLQlfX2RlcHJlY2F0ZWQ7Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19tYXhfa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9tYXhfa2V5c2l6ZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19pdnNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkgX19kZXByZWNhdGVkOwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdnNpemU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewogCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2Jsb2Nrc2l6ZTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfZGlnZXN0c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7Ci0JcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9kaWdlc3RzaXplOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKIAlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9hbGlnbm1hc2s7CkBAIC02MzMsNyArNTgxLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2NpcGhlcl90Zm0oc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKIHsKLQlyZXR1cm4gdGZtOworCXJldHVybiAmdGZtLT5iYXNlOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2ZyZWVfY2lwaGVyKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0pCkBAIC04MDksNzYgKzc1Nyw2IEBACiAJcmV0dXJuIGNyeXB0b19oYXNoX2NydChoYXNoKS0+c2V0a2V5KGhhc2gsIGtleSwga2V5bGVuKTsKIH0KIAotc3RhdGljIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKSBfX2RlcHJlY2F0ZWQ7Ci1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOwotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotc3RhdGljIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0JCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpIF9fZGVwcmVjYXRlZDsKLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi1zdGF0aWMgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkJCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JCQkJIHVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKLXN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLQkJCQkgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KSBfX2RlcHJlY2F0ZWQ7Ci1zdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCi17Ci0JQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKLQlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0X2l2KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywgaXYpOwotfQotCi1zdGF0aWMgdm9pZCBjcnlwdG9fY2lwaGVyX3NldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCQkJCSBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKSBfX2RlcHJlY2F0ZWQ7Ci1zdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9zZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7Ci0JbWVtY3B5KHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYsIHNyYywgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgY3J5cHRvX2NpcGhlcl9nZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCQkgdTggKmRzdCwgdW5zaWduZWQgaW50IGxlbikgX19kZXByZWNhdGVkOwotc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfZ2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50IGxlbikKLXsKLQlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwotCW1lbWNweShkc3QsIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYsIGxlbik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19jb21wICpfX2NyeXB0b19jb21wX2Nhc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKIAlyZXR1cm4gKHN0cnVjdCBjcnlwdG9fY29tcCAqKXRmbTsKQEAgLTkwMyw3ICs3ODEsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fY29tcF90Zm0oc3RydWN0IGNyeXB0b19jb21wICp0Zm0pCiB7Ci0JcmV0dXJuIHRmbTsKKwlyZXR1cm4gJnRmbS0+YmFzZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19mcmVlX2NvbXAoc3RydWN0IGNyeXB0b19jb21wICp0Zm0pCkBAIC05MzQsMTQgKzgxMiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCiB7Ci0JcmV0dXJuIGNyeXB0b19jb21wX2NydCh0Zm0pLT5jb3RfY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7CisJcmV0dXJuIGNyeXB0b19jb21wX2NydCh0Zm0pLT5jb3RfY29tcHJlc3MoY3J5cHRvX2NvbXBfdGZtKHRmbSksCisJCQkJCQkgIHNyYywgc2xlbiwgZHN0LCBkbGVuKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NvbXBfZGVjb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX2NvbXAgKnRmbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKIHsKLQlyZXR1cm4gY3J5cHRvX2NvbXBfY3J0KHRmbSktPmNvdF9kZWNvbXByZXNzKHRmbSwgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOworCXJldHVybiBjcnlwdG9fY29tcF9jcnQodGZtKS0+Y290X2RlY29tcHJlc3MoY3J5cHRvX2NvbXBfdGZtKHRmbSksCisJCQkJCQkgICAgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOwogfQogCiAjZW5kaWYJLyogX0xJTlVYX0NSWVBUT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCAwMGMzMTRhLi4wNjM3OTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTcwLDcgKzcwLDcgQEAKICNpZmRlZiBDT05GSUdfTlVNQQogI2RlZmluZSBHRlBfVEhJU05PREUJKF9fR0ZQX1RISVNOT0RFIHwgX19HRlBfTk9XQVJOIHwgX19HRlBfTk9SRVRSWSkKICNlbHNlCi0jZGVmaW5lIEdGUF9USElTTk9ERQkwCisjZGVmaW5lIEdGUF9USElTTk9ERQkoKF9fZm9yY2UgZ2ZwX3QpMCkKICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLWlkLmggYi9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oCmluZGV4IGQzODc3OGYuLjZlN2VjNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtaWQuaApAQCAtMTE1LDYgKzExNSw4IEBACiAjZGVmaW5lIEkyQ19EUklWRVJJRF9LUzAxMjcJODYJLyogU2Ftc3VuZyBrczAxMjcgdmlkZW8gZGVjb2RlciAqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfVExWMzIwQUlDMjNCIDg3CS8qIFRJIFRMVjMyMEFJQzIzQiBhdWRpbyBjb2RlYyAgKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX0lTTDEyMDgJODgJLyogSW50ZXJzaWwgSVNMMTIwOCBSVEMJCSovCisjZGVmaW5lIEkyQ19EUklWRVJJRF9XTTg3MzEJCTg5CS8qIFdvbGZzb24gV004NzMxIGF1ZGlvIGNvZGVjICovCisjZGVmaW5lIEkyQ19EUklWRVJJRF9XTTg3NTAJCTkwCS8qIFdvbGZzb24gV004NzUwIGF1ZGlvIGNvZGVjICovCiAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0kyQ0RFVgk5MDAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0FSUCAgICAgICAgOTAyICAgIC8qIFNNQnVzIEFSUCBDbGllbnQgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oIGIvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAppbmRleCA5OTM5M2VmLi5mM2RlMDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKQEAgLTQxLDYgKzQxLDcgQEAKICNkZWZpbmUgUEFDS0VUX1JYX1JJTkcJCQk1CiAjZGVmaW5lIFBBQ0tFVF9TVEFUSVNUSUNTCQk2CiAjZGVmaW5lIFBBQ0tFVF9DT1BZX1RIUkVTSAkJNworI2RlZmluZSBQQUNLRVRfQVVYREFUQQkJCTgKIAogc3RydWN0IHRwYWNrZXRfc3RhdHMKIHsKQEAgLTQ4LDYgKzQ5LDE1IEBACiAJdW5zaWduZWQgaW50CXRwX2Ryb3BzOwogfTsKIAorc3RydWN0IHRwYWNrZXRfYXV4ZGF0YQoreworCV9fdTMyCQl0cF9zdGF0dXM7CisJX191MzIJCXRwX2xlbjsKKwlfX3UzMgkJdHBfc25hcGxlbjsKKwlfX3UxNgkJdHBfbWFjOworCV9fdTE2CQl0cF9uZXQ7Cit9OworCiBzdHJ1Y3QgdHBhY2tldF9oZHIKIHsKIAl1bnNpZ25lZCBsb25nCXRwX3N0YXR1czsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0LmggYi9pbmNsdWRlL2xpbnV4L25ldC5oCmluZGV4IGYyOGQ4YTIuLjRkYjIxZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXQuaApAQCAtMjQsNyArMjQsNyBAQAogc3RydWN0IHBvbGxfdGFibGVfc3RydWN0Owogc3RydWN0IGlub2RlOwogCi0jZGVmaW5lIE5QUk9UTwkJMzIJCS8qIHNob3VsZCBiZSBlbm91Z2ggZm9yIG5vdy4uCSovCisjZGVmaW5lIE5QUk9UTwkJMzMJCS8qIHNob3VsZCBiZSBlbm91Z2ggZm9yIG5vdy4uCSovCiAKICNkZWZpbmUgU1lTX1NPQ0tFVAkxCQkvKiBzeXNfc29ja2V0KDIpCQkqLwogI2RlZmluZSBTWVNfQklORAkyCQkvKiBzeXNfYmluZCgyKQkJCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCAyZTM3ZjUwLi4xYTUyODU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTU4OSw3ICs1ODksNyBAQAogZXh0ZXJuIGludAkJZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludAkJZGV2X3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50CQlyZWdpc3Rlcl9uZXRkZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50CQl1bnJlZ2lzdGVyX25ldGRldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkCQl1bnJlZ2lzdGVyX25ldGRldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkCQlmcmVlX25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkCQlzeW5jaHJvbml6ZV9uZXQodm9pZCk7CiBleHRlcm4gaW50IAkJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkCmluZGV4IDYzMjgxNzUuLjQzMzk3YTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9LYnVpbGQKQEAgLTMzLDYgKzMzLDcgQEAKIGhlYWRlci15ICs9IHh0X3RjcHVkcC5oCiBoZWFkZXIteSArPSB4dF9TRUNNQVJLLmgKIGhlYWRlci15ICs9IHh0X0NPTk5TRUNNQVJLLmgKK2hlYWRlci15ICs9IHh0X1RDUE1TUy5oCiAKIHVuaWZkZWYteSArPSBuZl9jb25udHJhY2tfY29tbW9uLmgKIHVuaWZkZWYteSArPSBuZl9jb25udHJhY2tfZnRwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zYW5lLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjdkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19TQU5FX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19TQU5FX0gKKy8qIFNBTkUgdHJhY2tpbmcuICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgU0FORV9QT1JUCTY1NjYKKworZW51bSBzYW5lX3N0YXRlIHsKKwlTQU5FX1NUQVRFX05PUk1BTCwKKwlTQU5FX1NUQVRFX1NUQVJUX1JFUVVFU1RFRCwKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGV4aXN0cyBvbmx5IG9uY2UgcGVyIG1hc3RlciAqLworc3RydWN0IG5mX2N0X3NhbmVfbWFzdGVyIHsKKwllbnVtIHNhbmVfc3RhdGUgc3RhdGU7Cit9OworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19TQU5FX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaAppbmRleCAyZjRlOThiLi4wMDdhZjRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RjcC5oCkBAIC0yNyw2ICsyNyw5IEBACiAvKiBUaGlzIHNlbmRlciBzZW50IEZJTiBmaXJzdCAqLwogI2RlZmluZSBJUF9DVF9UQ1BfRkxBR19DTE9TRV9JTklUCQkweDA0CiAKKy8qIEJlIGxpYmVyYWwgaW4gd2luZG93IGNoZWNraW5nICovCisjZGVmaW5lIElQX0NUX1RDUF9GTEFHX0JFX0xJQkVSQUwJCTB4MDgKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogc3RydWN0IGlwX2N0X3RjcF9zdGF0ZSB7CkBAIC0zNCw3ICszNyw2IEBACiAJdV9pbnQzMl90CXRkX21heGVuZDsJLyogbWF4IG9mIGFjayArIG1heCh3aW4sIDEpICovCiAJdV9pbnQzMl90CXRkX21heHdpbjsJLyogbWF4KHdpbikgKi8KIAl1X2ludDhfdAl0ZF9zY2FsZTsJLyogd2luZG93IHNjYWxlIGZhY3RvciAqLwotCXVfaW50OF90CWxvb3NlOwkJLyogdXNlZCB3aGVuIGNvbm5lY3Rpb24gcGlja2VkIHVwIGZyb20gdGhlIG1pZGRsZSAqLwogCXVfaW50OF90CWZsYWdzOwkJLyogcGVyIGRpcmVjdGlvbiBvcHRpb25zICovCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UQ1BNU1MuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RDUE1TUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTI5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UQ1BNU1MuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9YVF9UQ1BNU1NfSAorI2RlZmluZSBfWFRfVENQTVNTX0gKKworc3RydWN0IHh0X3RjcG1zc19pbmZvIHsKKwl1X2ludDE2X3QgbXNzOworfTsKKworI2RlZmluZSBYVF9UQ1BNU1NfQ0xBTVBfUE1UVSAweGZmZmYKKworI2VuZGlmIC8qIF9YVF9UQ1BNU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0LmgKaW5kZXggYmRmNTUzNi4uYmJjYTg5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNkZWZpbmUgSVBfTkFUX1JBTkdFX01BUF9JUFMgMQogI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEIDIKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSA0IC8qIGFkZCByYW5kb21uZXNzIHRvICJwb3J0IiBzZWxlY3Rpb24gKi8KIAogLyogTkFUIHNlcXVlbmNlIG51bWJlciBtb2RpZmljYXRpb25zICovCiBzdHJ1Y3QgaXBfbmF0X3NlcSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaAppbmRleCA5OGQ1NjZjLi45NTI3Mjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKQEAgLTI3MiwyNSArMjcyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiBleHRlcm4gdm9pZCBpcHRfaW5pdCh2b2lkKSBfX2luaXQ7CiAKLSNkZWZpbmUgaXB0X3JlZ2lzdGVyX3RhcmdldCh0Z3QpIAlcCi0oewkodGd0KS0+ZmFtaWx5ID0gQUZfSU5FVDsJXAotIAl4dF9yZWdpc3Rlcl90YXJnZXQodGd0KTsgfSkKLSNkZWZpbmUgaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KHRndCkgeHRfdW5yZWdpc3Rlcl90YXJnZXQodGd0KQotCi0jZGVmaW5lIGlwdF9yZWdpc3Rlcl9tYXRjaChtdGNoKSAJXAotKHsJKG10Y2gpLT5mYW1pbHkgPSBBRl9JTkVUOwlcCi0JeHRfcmVnaXN0ZXJfbWF0Y2gobXRjaCk7IH0pCi0jZGVmaW5lIGlwdF91bnJlZ2lzdGVyX21hdGNoKG10Y2gpIHh0X3VucmVnaXN0ZXJfbWF0Y2gobXRjaCkKLQotLy8jZGVmaW5lIGlwdF9yZWdpc3Rlcl90YWJsZSh0YmwsIHJlcGwpIHh0X3JlZ2lzdGVyX3RhYmxlKEFGX0lORVQsIHRibCwgcmVwbCkKLS8vI2RlZmluZSBpcHRfdW5yZWdpc3Rlcl90YWJsZSh0YmwpIHh0X3VucmVnaXN0ZXJfdGFibGUoQUZfSU5FVCwgdGJsKQotCi1leHRlcm4gaW50IGlwdF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwKK2V4dGVybiBpbnQgaXB0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCB4dF90YWJsZSAqdGFibGUsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X3JlcGxhY2UgKnJlcGwpOwotZXh0ZXJuIHZvaWQgaXB0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IGlwdF90YWJsZSAqdGFibGUpOwotCi0vKiBuZXQvc2NoZWQvaXB0LmM6IEdpbW1lIGFjY2VzcyB0byB5b3VyIHRhcmdldHMhICBHZXRzIHRhcmdldC0+bWUuICovCi1leHRlcm4gc3RydWN0IGlwdF90YXJnZXQgKmlwdF9maW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbik7CitleHRlcm4gdm9pZCBpcHRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKTsKIAogLyogU3RhbmRhcmQgZW50cnkuICovCiBzdHJ1Y3QgaXB0X3N0YW5kYXJkCkBAIC0zMTUsNyArMjk5LDcgQEAKIAkJCQkgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKIAkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgc3RydWN0IGlwdF90YWJsZSAqdGFibGUpOworCQkJCSBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKTsKIAogI2RlZmluZSBJUFRfQUxJR04ocykgWFRfQUxJR04ocykKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVENQTVNTLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UQ1BNU1MuaAppbmRleCBhYWRiMzk1Li43YTg1MGY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UQ1BNU1MuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UQ1BNU1MuaApAQCAtMSwxMCArMSw5IEBACiAjaWZuZGVmIF9JUFRfVENQTVNTX0gKICNkZWZpbmUgX0lQVF9UQ1BNU1NfSAogCi1zdHJ1Y3QgaXB0X3RjcG1zc19pbmZvIHsKLQl1X2ludDE2X3QgbXNzOwotfTsKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfVENQTVNTLmg+CiAKLSNkZWZpbmUgSVBUX1RDUE1TU19DTEFNUF9QTVRVIDB4ZmZmZgorI2RlZmluZSBpcHRfdGNwbXNzX2luZm8JCXh0X3RjcG1zc19pbmZvCisjZGVmaW5lIElQVF9UQ1BNU1NfQ0xBTVBfUE1UVQlYVF9UQ1BNU1NfQ0xBTVBfUE1UVQogCiAjZW5kaWYgLypfSVBUX1RDUE1TU19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKaW5kZXggNGFlZDM0MC4uNjFhYTEwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKQEAgLTEwNCw2ICsxMDQsMjUgQEAKIAl1bnNpZ25lZCBjaGFyIGVsZW1zWzBdOwogfTsKIAorLyogU3RhbmRhcmQgZW50cnkgKi8KK3N0cnVjdCBpcDZ0X3N0YW5kYXJkCit7CisJc3RydWN0IGlwNnRfZW50cnkgZW50cnk7CisJc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0IHRhcmdldDsKK307CisKK3N0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldAoreworCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCB0YXJnZXQ7CisJY2hhciBlcnJvcm5hbWVbSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKK307CisKK3N0cnVjdCBpcDZ0X2Vycm9yCit7CisJc3RydWN0IGlwNnRfZW50cnkgZW50cnk7CisJc3RydWN0IGlwNnRfZXJyb3JfdGFyZ2V0IHRhcmdldDsKK307CisKIC8qCiAgKiBOZXcgSVAgZmlyZXdhbGwgb3B0aW9ucyBmb3IgW2dzXWV0c29ja29wdCBhdCB0aGUgUkFXIElQIGxldmVsLgogICogVW5saWtlIEJTRCBMaW51eCBpbmhlcml0cyBJUCBvcHRpb25zIHNvIHlvdSBkb24ndCBoYXZlIHRvIHVzZQpAQCAtMjg2LDI0ICszMDUsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiBleHRlcm4gdm9pZCBpcDZ0X2luaXQodm9pZCkgX19pbml0OwogCi0jZGVmaW5lIGlwNnRfcmVnaXN0ZXJfdGFyZ2V0KHRndCkgCQlcCi0oewkodGd0KS0+ZmFtaWx5ID0gQUZfSU5FVDY7CQlcCi0gCXh0X3JlZ2lzdGVyX3RhcmdldCh0Z3QpOyB9KQotI2RlZmluZSBpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KHRndCkgeHRfdW5yZWdpc3Rlcl90YXJnZXQodGd0KQotCi0jZGVmaW5lIGlwNnRfcmVnaXN0ZXJfbWF0Y2gobWF0Y2gpCQlcCi0oewkobWF0Y2gpLT5mYW1pbHkgPSBBRl9JTkVUNjsJCVwKLQl4dF9yZWdpc3Rlcl9tYXRjaChtYXRjaCk7IH0pCi0jZGVmaW5lIGlwNnRfdW5yZWdpc3Rlcl9tYXRjaChtYXRjaCkgeHRfdW5yZWdpc3Rlcl9tYXRjaChtYXRjaCkKLQotZXh0ZXJuIGludCBpcDZ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKK2V4dGVybiBpbnQgaXA2dF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X3JlcGxhY2UgKnJlcGwpOwotZXh0ZXJuIHZvaWQgaXA2dF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSk7CitleHRlcm4gdm9pZCBpcDZ0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSk7CiBleHRlcm4gdW5zaWduZWQgaW50IGlwNnRfZG9fdGFibGUoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAogCQkJCSAgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgc3RydWN0IGlwNnRfdGFibGUgKnRhYmxlKTsKKwkJCQkgIHN0cnVjdCB4dF90YWJsZSAqdGFibGUpOwogCiAvKiBDaGVjayBmb3IgYW4gZXh0ZW5zaW9uICovCiBleHRlcm4gaW50IGlwNnRfZXh0X2hkcih1OCBuZXh0aGRyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9taC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21oLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljYTlhNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9taC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX0lQNlRfTUhfSAorI2RlZmluZSBfSVA2VF9NSF9ICisKKy8qIE1IIG1hdGNoaW5nIHN0dWZmICovCitzdHJ1Y3QgaXA2dF9taAoreworCXVfaW50OF90IHR5cGVzWzJdOwkvKiBNSCB0eXBlIHJhbmdlICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7CS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXA2dF9taC4gKi8KKyNkZWZpbmUgSVA2VF9NSF9JTlZfVFlQRQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdHlwZS4gKi8KKyNkZWZpbmUgSVA2VF9NSF9JTlZfTUFTSwkweDAxCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworI2VuZGlmIC8qX0lQNlRfTUhfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaCBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCmluZGV4IGMzZTI1NWIuLjdhOGRjYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCkBAIC03Niw4ICs3Niw2IEBACiAJCQkJdW5zaWduZWQgbG9uZyBpbmRleCk7CiBleHRlcm4gc3RydWN0IHBhZ2UgKiBmaW5kX2xvY2tfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQl1bnNpZ25lZCBsb25nIGluZGV4KTsKLWV4dGVybiBfX2RlcHJlY2F0ZWRfZm9yX21vZHVsZXMgc3RydWN0IHBhZ2UgKiBmaW5kX3RyeWxvY2tfcGFnZSgKLQkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCB1bnNpZ25lZCBsb25nIGluZGV4KTsKIGV4dGVybiBzdHJ1Y3QgcGFnZSAqIGZpbmRfb3JfY3JlYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgZ2ZwX3QgZ2ZwX21hc2spOwogdW5zaWduZWQgZmluZF9nZXRfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3Qgc3RhcnQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IGRlZmRlZWQuLjkyMGQyMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC0yMDczLDYgKzIwNzMsOCBAQAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUEFTRU1JCQkweDE5NTkKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FUVEFOU0lDCQkweDE5NjkKKwogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0pNSUNST04JCTB4MTk3QgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzYwCTB4MjM2MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzYxCTB4MjM2MQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZmtleXYyLmggYi9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaAppbmRleCAyNjViYWZhLi5kOWRiNWY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaApAQCAtMjUxLDcgKzI1MSw4IEBACiAjZGVmaW5lIFNBREJfWF9TUERFWFBJUkUJMjEKICNkZWZpbmUgU0FEQl9YX1NQRERFTEVURTIJMjIKICNkZWZpbmUgU0FEQl9YX05BVF9UX05FV19NQVBQSU5HCTIzCi0jZGVmaW5lIFNBREJfTUFYCQkyMworI2RlZmluZSBTQURCX1hfTUlHUkFURQkJMjQKKyNkZWZpbmUgU0FEQl9NQVgJCTI0CiAKIC8qIFNlY3VyaXR5IEFzc29jaWF0aW9uIGZsYWdzICovCiAjZGVmaW5lIFNBREJfU0FGTEFHU19QRlMJMQpAQCAtMjk3LDYgKzI5OCw3IEBACiAjZGVmaW5lIFNBREJfWF9FQUxHX0JMT1dGSVNIQ0JDCQk3CiAjZGVmaW5lIFNBREJfRUFMR19OVUxMCQkJMTEKICNkZWZpbmUgU0FEQl9YX0VBTEdfQUVTQ0JDCQkxMgorI2RlZmluZSBTQURCX1hfRUFMR19DQU1FTExJQUNCQwkJMjIKICNkZWZpbmUgU0FEQl9FQUxHX01BWCAgICAgICAgICAgICAgICAgICAyNTMgLyogbGFzdCBFQUxHICovCiAvKiBwcml2YXRlIGFsbG9jYXRpb25zIHNob3VsZCB1c2UgMjQ5LTI1NSAoUkZDMjQwNykgKi8KICNkZWZpbmUgU0FEQl9YX0VBTEdfU0VSUEVOVENCQyAgMjUyICAgICAvKiBkcmFmdC1pZXRmLWlwc2VjLWNpcGgtYWVzLWNiYy0wMCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaCBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKaW5kZXggOTJjZDM4ZS4uZmNkMzVhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCkBAIC0xODcsNyArMTg3LDggQEAKICNkZWZpbmUgQUZfTExDCQkyNgkvKiBMaW51eCBMTEMJCQkqLwogI2RlZmluZSBBRl9USVBDCQkzMAkvKiBUSVBDIHNvY2tldHMJCQkqLwogI2RlZmluZSBBRl9CTFVFVE9PVEgJMzEJLyogQmx1ZXRvb3RoIHNvY2tldHMgCQkqLwotI2RlZmluZSBBRl9NQVgJCTMyCS8qIEZvciBub3cuLiAqLworI2RlZmluZSBBRl9JVUNWCQkzMgkvKiBJVUNWIHNvY2tldHMJCQkqLworI2RlZmluZSBBRl9NQVgJCTMzCS8qIEZvciBub3cuLiAqLwogCiAvKiBQcm90b2NvbCBmYW1pbGllcywgc2FtZSBhcyBhZGRyZXNzIGZhbWlsaWVzLiAqLwogI2RlZmluZSBQRl9VTlNQRUMJQUZfVU5TUEVDCkBAIC0yMjAsNiArMjIxLDcgQEAKICNkZWZpbmUgUEZfTExDCQlBRl9MTEMKICNkZWZpbmUgUEZfVElQQwkJQUZfVElQQwogI2RlZmluZSBQRl9CTFVFVE9PVEgJQUZfQkxVRVRPT1RICisjZGVmaW5lIFBGX0lVQ1YJCUFGX0lVQ1YKICNkZWZpbmUgUEZfTUFYCQlBRl9NQVgKIAogLyogTWF4aW11bSBxdWV1ZSBsZW5ndGggc3BlY2lmaWFibGUgYnkgbGlzdGVuLiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmggYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCmluZGV4IDgxNDgwZTYuLjY2NTQxMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaApAQCAtNjk5LDcgKzY5OSw4IEBACiAJTkVUX1gyNV9DQUxMX1JFUVVFU1RfVElNRU9VVD0yLAogCU5FVF9YMjVfUkVTRVRfUkVRVUVTVF9USU1FT1VUPTMsCiAJTkVUX1gyNV9DTEVBUl9SRVFVRVNUX1RJTUVPVVQ9NCwKLQlORVRfWDI1X0FDS19IT0xEX0JBQ0tfVElNRU9VVD01CisJTkVUX1gyNV9BQ0tfSE9MRF9CQUNLX1RJTUVPVVQ9NSwKKwlORVRfWDI1X0ZPUldBUkQ9NgogfTsKIAogLyogL3Byb2Mvc3lzL25ldC90b2tlbi1yaW5nICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RjcC5oIGIvaW5jbHVkZS9saW51eC90Y3AuaAppbmRleCAzY2M3MGQxLi4yOWQzMDg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGNwLmgKQEAgLTMxNiw3ICszMTYsNyBAQAogCXN0cnVjdCB0Y3Bfc2Fja19ibG9jayBkdXBsaWNhdGVfc2Fja1sxXTsgLyogRC1TQUNLIGJsb2NrICovCiAJc3RydWN0IHRjcF9zYWNrX2Jsb2NrIHNlbGVjdGl2ZV9hY2tzWzRdOyAvKiBUaGUgU0FDS1MgdGhlbXNlbHZlcyovCiAKLQlzdHJ1Y3QgdGNwX3NhY2tfYmxvY2sgcmVjdl9zYWNrX2NhY2hlWzRdOworCXN0cnVjdCB0Y3Bfc2Fja19ibG9ja193aXJlIHJlY3Zfc2Fja19jYWNoZVs0XTsKIAogCS8qIGZyb20gU1RDUCwgcmV0cmFucyBxdWV1ZSBoaW50aW5nICovCiAJc3RydWN0IHNrX2J1ZmYqIGxvc3Rfc2tiX2hpbnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oIGIvaW5jbHVkZS9saW51eC93YW5yb3V0ZXIuaAppbmRleCAyY2QwNTAxLi4zYWRkODc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvd2Fucm91dGVyLmgKQEAgLTUxNiw5ICs1MTYsNiBAQAogLyogUHVibGljIGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIGRldmljZSBkcml2ZXJzICovCiBleHRlcm4gaW50IHJlZ2lzdGVyX3dhbl9kZXZpY2Uoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfd2FuX2RldmljZShjaGFyICpuYW1lKTsKLV9fYmUxNiB3YW5yb3V0ZXJfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWludCB3YW5yb3V0ZXJfZW5jYXBzdWxhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgdW5zaWduZWQgc2hvcnQgdHlwZSk7CiAKIC8qIFByb2MgaW50ZXJmYWNlIGZ1bmN0aW9ucy4gVGhlc2UgbXVzdCBub3QgYmUgY2FsbGVkIGJ5IHRoZSBkcml2ZXJzISAqLwogZXh0ZXJuIGludCB3YW5yb3V0ZXJfcHJvY19pbml0KHZvaWQpOwpAQCAtNTI3LDExICs1MjQsNiBAQAogZXh0ZXJuIGludCB3YW5yb3V0ZXJfcHJvY19kZWxldGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldik7CiBleHRlcm4gaW50IHdhbnJvdXRlcl9pb2N0bCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAotZXh0ZXJuIHZvaWQgbG9ja19hZGFwdGVyX2lycShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOwotZXh0ZXJuIHZvaWQgdW5sb2NrX2FkYXB0ZXJfaXJxKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7Ci0KLQotCiAvKiBQdWJsaWMgRGF0YSAqLwogLyogbGlzdCBvZiByZWdpc3RlcmVkIGRldmljZXMgKi8KIGV4dGVybiBzdHJ1Y3Qgd2FuX2RldmljZSAqd2Fucm91dGVyX3JvdXRlcl9kZXZsaXN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC94ZnJtLmggYi9pbmNsdWRlL2xpbnV4L3hmcm0uaAppbmRleCA5NTI5ZWExLi4xNWNhODllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3hmcm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3hmcm0uaApAQCAtMTc4LDYgKzE3OCw5IEBACiAJWEZSTV9NU0dfUkVQT1JULAogI2RlZmluZSBYRlJNX01TR19SRVBPUlQgWEZSTV9NU0dfUkVQT1JUCiAKKwlYRlJNX01TR19NSUdSQVRFLAorI2RlZmluZSBYRlJNX01TR19NSUdSQVRFIFhGUk1fTVNHX01JR1JBVEUKKwogCV9fWEZSTV9NU0dfTUFYCiB9OwogI2RlZmluZSBYRlJNX01TR19NQVggKF9fWEZSTV9NU0dfTUFYIC0gMSkKQEAgLTI1Niw2ICsyNTksNyBAQAogCVhGUk1BX0NPQUREUiwJCS8qIHhmcm1fYWRkcmVzc190ICovCiAJWEZSTUFfTEFTVFVTRUQsCiAJWEZSTUFfUE9MSUNZX1RZUEUsCS8qIHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSAqLworCVhGUk1BX01JR1JBVEUsCiAJX19YRlJNQV9NQVgKIAogI2RlZmluZSBYRlJNQV9NQVggKF9fWEZSTUFfTUFYIC0gMSkKQEAgLTM1MSw2ICszNTUsMTkgQEAKIAlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOwogfTsKIAorc3RydWN0IHhmcm1fdXNlcl9taWdyYXRlIHsKKwl4ZnJtX2FkZHJlc3NfdAkJCW9sZF9kYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJCW9sZF9zYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJCW5ld19kYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJCW5ld19zYWRkcjsKKwlfX3U4CQkJCXByb3RvOworCV9fdTgJCQkJbW9kZTsKKwlfX3UxNgkJCQlyZXNlcnZlZDsKKwlfX3UzMgkJCQlyZXFpZDsKKwlfX3UxNgkJCQlvbGRfZmFtaWx5OworCV9fdTE2CQkJCW5ld19mYW1pbHk7Cit9OworCiAjaWZuZGVmIF9fS0VSTkVMX18KIC8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KICNkZWZpbmUgWEZSTUdSUF9BQ1FVSVJFCQkxCkBAIC0zNzUsNiArMzkyLDggQEAKICNkZWZpbmUgWEZSTU5MR1JQX0FFVkVOVFMJWEZSTU5MR1JQX0FFVkVOVFMKIAlYRlJNTkxHUlBfUkVQT1JULAogI2RlZmluZSBYRlJNTkxHUlBfUkVQT1JUCVhGUk1OTEdSUF9SRVBPUlQKKwlYRlJNTkxHUlBfTUlHUkFURSwKKyNkZWZpbmUgWEZSTU5MR1JQX01JR1JBVEUJWEZSTU5MR1JQX01JR1JBVEUKIAlfX1hGUk1OTEdSUF9NQVgKIH07CiAjZGVmaW5lIFhGUk1OTEdSUF9NQVgJKF9fWEZSTU5MR1JQX01BWCAtIDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2hhc2h0YWJsZXMuaCBiL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCmluZGV4IDM0Y2M3NmUuLmQyN2VlOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oCkBAIC0zNCwxMiArMzQsMTMgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKIC8qIFRoaXMgaXMgZm9yIGFsbCBjb25uZWN0aW9ucyB3aXRoIGEgZnVsbCBpZGVudGl0eSwgbm8gd2lsZGNhcmRzLgotICogTmV3IHNjaGVtZSwgaGFsZiB0aGUgdGFibGUgaXMgZm9yIFRJTUVfV0FJVCwgdGhlIG90aGVyIGhhbGYgaXMKLSAqIGZvciB0aGUgcmVzdC4gIEknbGwgZXhwZXJpbWVudCB3aXRoIGR5bmFtaWMgdGFibGUgZ3Jvd3RoIGxhdGVyLgorICogT25lIGNoYWluIGlzIGRlZGljYXRlZCB0byBUSU1FX1dBSVQgc29ja2V0cy4KKyAqIEknbGwgZXhwZXJpbWVudCB3aXRoIGR5bmFtaWMgdGFibGUgZ3Jvd3RoIGxhdGVyLgogICovCiBzdHJ1Y3QgaW5ldF9laGFzaF9idWNrZXQgewogCXJ3bG9ja190CSAgbG9jazsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCBjaGFpbjsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCB0d2NoYWluOwogfTsKIAogLyogVGhlcmUgYXJlIGEgZmV3IHNpbXBsZSBydWxlcywgd2hpY2ggYWxsb3cgZm9yIGxvY2FsIHBvcnQgcmV1c2UgYnkKQEAgLTk3LDggKzk4LDcgQEAKIAkgKgogCSAqICAgICAgICAgIFRDUF9FU1RBQkxJU0hFRCA8PSBzay0+c2tfc3RhdGUgPCBUQ1BfQ0xPU0UKIAkgKgotCSAqIEZpcnN0IGhhbGYgb2YgdGhlIHRhYmxlIGlzIGZvciBzb2NrZXRzIG5vdCBpbiBUSU1FX1dBSVQsIHNlY29uZCBoYWxmCi0JICogaXMgZm9yIFRJTUVfV0FJVCBzb2NrZXRzIG9ubHkuCisJICogVElNRV9XQUlUIHNvY2tldHMgdXNlIGEgc2VwYXJhdGUgY2hhaW4gKHR3Y2hhaW4pLgogCSAqLwogCXN0cnVjdCBpbmV0X2VoYXNoX2J1Y2tldAkqZWhhc2g7CiAKQEAgLTM2OSw3ICszNjksNyBAQAogCX0KIAogCS8qIE11c3QgY2hlY2sgZm9yIGEgVElNRV9XQUlUJ2VyIGJlZm9yZSBnb2luZyB0byBsaXN0ZW5lciBoYXNoLiAqLwotCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmKGhlYWQgKyBoYXNoaW5mby0+ZWhhc2hfc2l6ZSktPmNoYWluKSB7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZoZWFkLT50d2NoYWluKSB7CiAJCWlmIChJTkVUX1RXX01BVENIKHNrLCBoYXNoLCBhY29va2llLCBzYWRkciwgZGFkZHIsIHBvcnRzLCBkaWYpKQogCQkJZ290byBoaXQ7CiAJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXVjdi9hZl9pdWN2LmggYi9pbmNsdWRlL25ldC9pdWN2L2FmX2l1Y3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQxYWJiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvaXVjdi9hZl9pdWN2LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBJQk0gQ29ycG9yYXRpb24KKyAqIElVQ1YgcHJvdG9jb2wgc3RhY2sgZm9yIExpbnV4IG9uIHpTZXJpZXMKKyAqIFZlcnNpb24gMS4wCisgKiBBdXRob3Iocyk6IEplbm5pZmVyIEh1bnQgPGplbmh1bnRAdXMuaWJtLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FGSVVDVl9ICisjZGVmaW5lIF9fQUZJVUNWX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisjaWZuZGVmIEFGX0lVQ1YKKyNkZWZpbmUgQUZfSVVDVgkJMzIKKyNkZWZpbmUgUEZfSVVDVgkJQUZfSVVDVgorI2VuZGlmCisKKy8qIENvbm5lY3Rpb24gYW5kIHNvY2tldCBzdGF0ZXMgKi8KK2VudW0geworCUlVQ1ZfQ09OTkVDVEVEID0gMSwKKwlJVUNWX09QRU4sCisJSVVDVl9CT1VORCwKKwlJVUNWX0xJU1RFTiwKKwlJVUNWX1NFVkVSRUQsCisJSVVDVl9ESVNDT05OLAorCUlVQ1ZfQ0xPU0VECit9OworCisjZGVmaW5lIElVQ1ZfUVVFVUVMRU5fREVGQVVMVAk2NTUzNQorI2RlZmluZSBJVUNWX0NPTk5fVElNRU9VVAkoSFogKiA0MCkKKyNkZWZpbmUgSVVDVl9ESVNDT05OX1RJTUVPVVQJKEhaICogMikKKyNkZWZpbmUgSVVDVl9DT05OX0lETEVfVElNRU9VVAkoSFogKiA2MCkKKyNkZWZpbmUgSVVDVl9CVUZTSVpFX0RFRkFVTFQJMzI3NjgKKworLyogSVVDViBzb2NrZXQgYWRkcmVzcyAqLworc3RydWN0IHNvY2thZGRyX2l1Y3YgeworCXNhX2ZhbWlseV90CXNpdWN2X2ZhbWlseTsKKwl1bnNpZ25lZCBzaG9ydAlzaXVjdl9wb3J0OwkJLyogUmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBpbnQJc2l1Y3ZfYWRkcjsJCS8qIFJlc2VydmVkICovCisJY2hhcgkJc2l1Y3Zfbm9kZWlkWzhdOwkvKiBSZXNlcnZlZCAqLworCWNoYXIJCXNpdWN2X3VzZXJfaWRbOF07CS8qIEd1ZXN0IFVzZXIgSWQgKi8KKwljaGFyCQlzaXVjdl9uYW1lWzhdOwkJLyogQXBwbGljYXRpb24gTmFtZSAqLworfTsKKworCisvKiBDb21tb24gc29ja2V0IHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIGl1Y3Zfc2soX19zaykgKChzdHJ1Y3QgaXVjdl9zb2NrICopIF9fc2spCisKK3N0cnVjdCBpdWN2X3NvY2sgeworCXN0cnVjdCBzb2NrCQlzazsKKwljaGFyCQkJc3JjX3VzZXJfaWRbOF07CisJY2hhcgkJCXNyY19uYW1lWzhdOworCWNoYXIJCQlkc3RfdXNlcl9pZFs4XTsKKwljaGFyCQkJZHN0X25hbWVbOF07CisJc3RydWN0IGxpc3RfaGVhZAlhY2NlcHRfcTsKKwlzdHJ1Y3Qgc29jawkJKnBhcmVudDsKKwlzdHJ1Y3QgaXVjdl9wYXRoCSpwYXRoOworCXN0cnVjdCBza19idWZmX2hlYWQJc2VuZF9za2JfcTsKKwl1bnNpZ25lZCBpbnQJCXNlbmRfdGFnOworfTsKKworc3RydWN0IGl1Y3Zfc29ja19saXN0IHsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCBoZWFkOworCXJ3bG9ja190CSAgbG9jazsKKwlhdG9taWNfdAkgIGF1dG9iaW5kX25hbWU7Cit9OworCitzdGF0aWMgdm9pZCBpdWN2X3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKTsKK3N0YXRpYyB2b2lkIGl1Y3Zfc29ja19jbGVhbnVwX2xpc3RlbihzdHJ1Y3Qgc29jayAqcGFyZW50KTsKK3N0YXRpYyB2b2lkIGl1Y3Zfc29ja19raWxsKHN0cnVjdCBzb2NrICpzayk7CitzdGF0aWMgdm9pZCBpdWN2X3NvY2tfY2xvc2Uoc3RydWN0IHNvY2sgKnNrKTsKK3N0YXRpYyBpbnQgIGl1Y3Zfc29ja19jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvKTsKK3N0YXRpYyBpbnQgIGl1Y3Zfc29ja19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCWludCBhZGRyX2xlbik7CitzdGF0aWMgaW50ICBpdWN2X3NvY2tfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisJCQkgICAgICBpbnQgYWxlbiwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgIGl1Y3Zfc29ja19saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpOworc3RhdGljIGludCAgaXVjdl9zb2NrX2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrLAorCQkJICAgICBpbnQgZmxhZ3MpOworc3RhdGljIGludCAgaXVjdl9zb2NrX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJICAgICAgaW50ICpsZW4sIGludCBwZWVyKTsKK3N0YXRpYyBpbnQgIGl1Y3Zfc29ja19zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50ICBpdWN2X3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncyk7Cit1bnNpZ25lZCBpbnQgaXVjdl9zb2NrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgcG9sbF90YWJsZSAqd2FpdCk7CitzdGF0aWMgaW50IGl1Y3Zfc29ja19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spOworc3RhdGljIGludCBpdWN2X3NvY2tfc2h1dGRvd24oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGhvdyk7CisKK3ZvaWQgaXVjdl9zb2NrX2xpbmsoc3RydWN0IGl1Y3Zfc29ja19saXN0ICpsLCBzdHJ1Y3Qgc29jayAqcyk7Cit2b2lkIGl1Y3Zfc29ja191bmxpbmsoc3RydWN0IGl1Y3Zfc29ja19saXN0ICpsLCBzdHJ1Y3Qgc29jayAqcyk7CitpbnQgIGl1Y3Zfc29ja193YWl0X3N0YXRlKHN0cnVjdCBzb2NrICpzaywgaW50IHN0YXRlLCBpbnQgc3RhdGUyLAorCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvKTsKK2ludCAgaXVjdl9zb2NrX3dhaXRfY250KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyB0aW1lbyk7Cit2b2lkIGl1Y3ZfYWNjZXB0X2VucXVldWUoc3RydWN0IHNvY2sgKnBhcmVudCwgc3RydWN0IHNvY2sgKnNrKTsKK3ZvaWQgaXVjdl9hY2NlcHRfdW5saW5rKHN0cnVjdCBzb2NrICpzayk7CitzdHJ1Y3Qgc29jayAqaXVjdl9hY2NlcHRfZGVxdWV1ZShzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrKTsKKworI2VuZGlmIC8qIF9fSVVDVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pdWN2L2l1Y3YuaCBiL2luY2x1ZGUvbmV0L2l1Y3YvaXVjdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NmU3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9pdWN2L2l1Y3YuaApAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqICBkcml2ZXJzL3MzOTAvbmV0L2l1Y3YuaAorICogICAgSVVDViBiYXNlIHN1cHBvcnQuCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6QWxhbiBBbHRtYXJrIChBbGFuX0FsdG1hcmtAdXMuaWJtLmNvbSkKKyAqCQlYZW5pYSBUa2F0c2Nob3cgKHhlbmlhQHVzLmlibS5jb20pCisgKiAgICBSZXdyaXR0ZW4gZm9yIGFmX2l1Y3Y6CisgKglNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+CisgKgorICoKKyAqIEZ1bmN0aW9uYWxpdHk6CisgKiBUbyBleHBsb3JlIGFueSBvZiB0aGUgSVVDViBmdW5jdGlvbnMsIG9uZSBtdXN0IGZpcnN0IHJlZ2lzdGVyIHRoZWlyCisgKiBwcm9ncmFtIHVzaW5nIGl1Y3ZfcmVnaXN0ZXIoKS4gT25jZSB5b3VyIHByb2dyYW0gaGFzIHN1Y2Nlc3NmdWxseQorICogY29tcGxldGVkIGEgcmVnaXN0ZXIsIGl0IGNhbiBleHBsb2l0IHRoZSBvdGhlciBmdW5jdGlvbnMuCisgKiBGb3IgZnVydGh1ciByZWZlcmVuY2Ugb24gYWxsIElVQ1YgZnVuY3Rpb25hbGl0eSwgcmVmZXIgdG8gdGhlCisgKiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcyBib29rLCBhbHNvIGF2YWlsYWJsZSBvbiB0aGUgd2ViIHRocnUKKyAqIHd3dy5pYm0uY29tL3MzOTAvdm0vcHVicywgbWFudWFsICMgU0MyNC01NzYwCisgKgorICogRGVmaW5pdGlvbiBvZiBSZXR1cm4gQ29kZXMKKyAqIC0gQWxsIHBvc2l0aXZlIHJldHVybiBjb2RlcyBpbmNsdWRpbmcgemVybyBhcmUgcmVmbGVjdGVkIGJhY2sKKyAqICAgZnJvbSBDUC4gVGhlIGRlZmluaXRpb24gb2YgZWFjaCByZXR1cm4gY29kZSBjYW4gYmUgZm91bmQgaW4KKyAqICAgQ1AgUHJvZ3JhbW1pbmcgU2VydmljZXMgYm9vay4KKyAqIC0gUmV0dXJuIENvZGUgb2Y6CisgKiAgIC1FSU5WQUw6IEludmFsaWQgdmFsdWUKKyAqICAgLUVOT01FTTogc3RvcmFnZSBhbGxvY2F0aW9uIGZhaWxlZAorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgorCisvKgorICogSVVDViBvcHRpb24gZmxhZ3MgdXNhYmxlIGJ5IGRldmljZSBkcml2ZXJzOgorICoKKyAqIElVQ1ZfSVBSTURBVEEgIEluZGljYXRlcyB0aGF0IHlvdXIgcHJvZ3JhbSBjYW4gaGFuZGxlIGEgbWVzc2FnZSBpbiB0aGUKKyAqCQkgIHBhcmFtZXRlciBsaXN0IC8gYSBtZXNzYWdlIGlzIHNlbnQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LgorICoJCSAgVXNlZCBmb3IgaXVjdl9wYXRoX2FjY2VwdCwgaXVjdl9wYXRoX2Nvbm5lY3QsCisgKgkJICBpdWN2X21lc3NhZ2VfcmVwbHksIGl1Y3ZfbWVzc2FnZV9zZW5kLCBpdWN2X21lc3NhZ2Vfc2VuZDJ3YXkuCisgKiBJVUNWX0lQUVVTQ0UJICBJbmRpY2F0ZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVjZWl2ZSBtZXNzYWdlcyBvbiB0aGlzCisgKgkJICBwYXRoIHVudGlsIGFuIGl1Y3ZfcGF0aF9yZXN1bWUgaXMgaXNzdWVkLgorICoJCSAgVXNlZCBmb3IgaXVjdl9wYXRoX2FjY2VwdCwgaXVjdl9wYXRoX2Nvbm5lY3QuCisgKiBJVUNWX0lQQlVGTFNUICBJbmRpY2F0ZXMgdGhhdCBhbiBhZGRyZXNzIGxpc3QgaXMgdXNlZCBmb3IgdGhlIG1lc3NhZ2UgZGF0YS4KKyAqCQkgIFVzZWQgZm9yIGl1Y3ZfbWVzc2FnZV9yZWNlaXZlLCBpdWN2X21lc3NhZ2Vfc2VuZCwKKyAqCQkgIGl1Y3ZfbWVzc2FnZV9zZW5kMndheS4KKyAqIElVQ1ZfSVBQUlRZCSAgU3BlY2lmaWVzIHRoYXQgeW91IHdhbnQgdG8gc2VuZCBwcmlvcml0eSBtZXNzYWdlcy4KKyAqCQkgIFVzZWQgZm9yIGl1Y3ZfcGF0aF9hY2NlcHQsIGl1Y3ZfcGF0aF9jb25uZWN0LAorICoJCSAgaXVjdl9tZXNzYWdlX3JlcGx5LCBpdWN2X21lc3NhZ2Vfc2VuZCwgaXVjdl9tZXNzYWdlX3NlbmQyd2F5LgorICogSVVDVl9JUFNZTkMJICBJbmRpY2F0ZXMgYSBzeW5jaHJvbm91cyBzZW5kIHJlcXVlc3QuCisgKgkJICBVc2VkIGZvciBpdWN2X21lc3NhZ2Vfc2VuZCwgaXVjdl9tZXNzYWdlX3NlbmQyd2F5LgorICogSVVDVl9JUEFOU0xTVCAgSW5kaWNhdGVzIHRoYXQgYW4gYWRkcmVzcyBsaXN0IGlzIHVzZWQgZm9yIHRoZSByZXBseSBkYXRhLgorICoJCSAgVXNlZCBmb3IgaXVjdl9tZXNzYWdlX3JlcGx5LCBpdWN2X21lc3NhZ2Vfc2VuZDJ3YXkuCisgKiBJVUNWX0lQTE9DQUwJICBTcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbiBwYXJ0bmVyIGhhcyB0byBiZSBvbiB0aGUKKyAqCQkgIGxvY2FsIHN5c3RlbS4gSWYgbG9jYWwgaXMgc3BlY2lmaWVkIG5vIHRhcmdldCBjbGFzcyBjYW4gYmUKKyAqCQkgIHNwZWNpZmllZC4KKyAqCQkgIFVzZWQgZm9yIGl1Y3ZfcGF0aF9jb25uZWN0LgorICoKKyAqIEFsbCBmbGFncyBhcmUgZGVmaW5lZCBpbiB0aGUgaW5wdXQgZmllbGQgSVBGTEFHUzEgb2YgZWFjaCBmdW5jdGlvbgorICogYW5kIGNhbiBiZSBmb3VuZCBpbiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcy4KKyAqLworI2RlZmluZSBJVUNWX0lQUk1EQVRBCTB4ODAKKyNkZWZpbmUgSVVDVl9JUFFVU0NFCTB4NDAKKyNkZWZpbmUgSVVDVl9JUEJVRkxTVAkweDQwCisjZGVmaW5lIElVQ1ZfSVBQUlRZCTB4MjAKKyNkZWZpbmUgSVVDVl9JUEFOU0xTVAkweDA4CisjZGVmaW5lIElVQ1ZfSVBTWU5DCTB4MDQKKyNkZWZpbmUgSVVDVl9JUExPQ0FMCTB4MDEKKworLyoKKyAqIGl1Y3ZfYXJyYXkgOiBEZWZpbmVzIGJ1ZmZlciBhcnJheS4KKyAqIEluc2lkZSB0aGUgYXJyYXkgbWF5IGJlIDMxLSBiaXQgYWRkcmVzc2VzIGFuZCAzMS1iaXQgbGVuZ3Rocy4KKyAqIFVzZSBhIHBvaW50ZXIgdG8gYW4gaXVjdl9hcnJheSBhcyB0aGUgYnVmZmVyLCByZXBseSBvciBhbnN3ZXIKKyAqIHBhcmFtZXRlciBvbiBpdWN2X21lc3NhZ2Vfc2VuZCwgaXVjdl9tZXNzYWdlX3NlbmQyd2F5LCBpdWN2X21lc3NhZ2VfcmVjZWl2ZQorICogYW5kIGl1Y3ZfbWVzc2FnZV9yZXBseSBpZiBJVUNWX0lQQlVGTFNUIG9yIElVQ1ZfSVBBTlNMU1QgYXJlIHVzZWQuCisgKi8KK3N0cnVjdCBpdWN2X2FycmF5IHsKKwl1MzIgYWRkcmVzczsKKwl1MzIgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKTsKKworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpdWN2X2J1czsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlICppdWN2X3Jvb3Q7CisKKy8qCisgKiBzdHJ1Y3QgaXVjdl9wYXRoCisgKiBwYXRoaWQ6IDE2IGJpdCBwYXRoIGlkZW50aWZpY2F0aW9uCisgKiBtc2dsaW06IDE2IGJpdCBtZXNzYWdlIGxpbWl0CisgKiBmbGFnczogcHJvcGVydGllcyBvZiB0aGUgcGF0aDogSVBSTURBVEEsIElQUVVTQ0UsIElQUFJUWQorICogaGFuZGxlcjogIGFkZHJlc3Mgb2YgaXVjdiBoYW5kbGVyIHN0cnVjdHVyZQorICogcHJpdmF0ZTogcHJpdmF0ZSBpbmZvcm1hdGlvbiBvZiB0aGUgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIHBhdGgKKyAqIGxpc3Q6IGxpc3RfaGVhZCBmb3IgdGhlIGl1Y3ZfaGFuZGxlciBwYXRoIGxpc3QuCisgKi8KK3N0cnVjdCBpdWN2X3BhdGggeworCXUxNiBwYXRoaWQ7CisJdTE2IG1zZ2xpbTsKKwl1OCAgZmxhZ3M7CisJdm9pZCAqcHJpdmF0ZTsKKwlzdHJ1Y3QgaXVjdl9oYW5kbGVyICpoYW5kbGVyOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qCisgKiBzdHJ1Y3QgaXVjdl9tZXNzYWdlCisgKiBpZDogMzIgYml0IG1lc3NhZ2UgaWQKKyAqIGF1ZGl0OiAzMiBiaXQgZXJyb3IgaW5mb3JtYXRpb24gb2YgcHVyZ2VkIG9yIHJlcGxpZWQgbWVzc2FnZXMKKyAqIGNsYXNzOiAzMiBiaXQgdGFyZ2V0IGNsYXNzIG9mIGEgbWVzc2FnZSAoc291cmNlIGNsYXNzIGZvciByZXBsaWVzKQorICogdGFnOiAzMiBiaXQgdGFnIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZQorICogbGVuZ3RoOiAzMiBiaXQgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIC8gcmVwbHkKKyAqIHJlcGx5X3NpemU6IDMyIGJpdCBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHRoZSByZXBseQorICogcm1tc2c6IDggYnl0ZSBpbmxpbmUgbWVzc2FnZQorICogZmxhZ3M6IG1lc3NhZ2UgcHJvcGVydGllcyAoSVVDVl9JUFBSVFkpCisgKi8KK3N0cnVjdCBpdWN2X21lc3NhZ2UgeworCXUzMiBpZDsKKwl1MzIgYXVkaXQ7CisJdTMyIGNsYXNzOworCXUzMiB0YWc7CisJdTMyIGxlbmd0aDsKKwl1MzIgcmVwbHlfc2l6ZTsKKwl1OCAgcm1tc2dbOF07CisJdTggIGZsYWdzOworfTsKKworLyoKKyAqIHN0cnVjdCBpdWN2X2hhbmRsZXIKKyAqCisgKiBBIHZlY3RvciBvZiBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgSVVDViBpbnRlcnJ1cHRzLiBFYWNoIGZ1bmN0aW9ucyBnZXRzCisgKiBhIHBhcmFtZXRlciBhcmVhIGFzIGRlZmluZWQgYnkgdGhlIENQIFByb2dyYW1taW5nIFNlcnZpY2VzIGFuZCBwcml2YXRlCisgKiBwb2ludGVyIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgb2YgdGhlIGludGVyZmFjZS4KKyAqLworc3RydWN0IGl1Y3ZfaGFuZGxlciB7CisJIC8qCisJICAqIFRoZSBwYXRoX3BlbmRpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFuIGl1Y3YgaW50ZXJydXB0CisJICAqIHR5cGUgMHgwMSBoYXMgYmVlbiByZWNlaXZlZC4gVGhlIGJhc2UgY29kZSBhbGxvY2F0ZXMgYSBwYXRoCisJICAqIHN0cnVjdHVyZSBhbmQgImFza3MiIHRoZSBoYW5kbGVyIGlmIHRoaXMgcGF0aCBiZWxvbmdzIHRvIHRoZQorCSAgKiBoYW5kbGVyLiBUbyBhY2NlcHQgdGhlIHBhdGggdGhlIHBhdGhfcGVuZGluZyBmdW5jdGlvbiBuZWVkcworCSAgKiB0byBjYWxsIGl1Y3ZfcGF0aF9hY2NlcHQgYW5kIHJldHVybiAwLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucworCSAgKiBhIHZhbHVlICE9IDAgdGhlIGl1Y3YgYmFzZSBjb2RlIHdpbGwgY29udGludWUgd2l0aCB0aGUgbmV4dAorCSAgKiBoYW5kbGVyLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIHBhdGhfcGVuZGluZyBmdW5jdGlvbnMgYXJlCisJICAqIGNhbGxlZCBpcyB0aGUgb3JkZXIgb2YgdGhlIHJlZ2lzdHJhdGlvbiBvZiB0aGUgaXVjdiBoYW5kbGVycworCSAgKiB0byB0aGUgYmFzZSBjb2RlLgorCSAgKi8KKwlpbnQgICgqcGF0aF9wZW5kaW5nKShzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdm1pZFs4XSwgdTggaXB1c2VyWzE2XSk7CisJLyoKKwkgKiBUaGUgcGF0aF9jb21wbGV0ZSBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYW4gaXVjdiBpbnRlcnJ1cHQKKwkgKiB0eXBlIDB4MDIgaGFzIGJlZW4gcmVjZWl2ZWQgZm9yIGEgcGF0aCB0aGF0IGhhcyBiZWVuIGVzdGFibGlzaGVkCisJICogZm9yIHRoaXMgaGFuZGxlciB3aXRoIGl1Y3ZfcGF0aF9jb25uZWN0IGFuZCBnb3QgYWNjZXB0ZWQgYnkgdGhlCisJICogcGVlciB3aXRoIGl1Y3ZfcGF0aF9hY2NlcHQuCisJICovCisJdm9pZCAoKnBhdGhfY29tcGxldGUpKHN0cnVjdCBpdWN2X3BhdGggKiwgdTggaXB1c2VyWzE2XSk7CisJIC8qCisJICAqIFRoZSBwYXRoX3NldmVyZWQgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFuIGl1Y3YgaW50ZXJydXB0CisJICAqIHR5cGUgMHgwMyBoYXMgYmVlbiByZWNlaXZlZC4gVGhlIGNvbW11bmljYXRpb24gcGVlciBzaHV0ZG93bgorCSAgKiBoaXMgZW5kIG9mIHRoZSBjb21tdW5pY2F0aW9uIHBhdGguIFRoZSBwYXRoIHN0aWxsIGV4aXN0cyBhbmQKKwkgICogcmVtYWluaW5nIG1lc3NhZ2VzIGNhbiBiZSByZWNlaXZlZCB1bnRpbCBhIGl1Y3ZfcGF0aF9zZXZlcgorCSAgKiBzaHV0cyBkb3duIHRoZSBvdGhlciBlbmQgb2YgdGhlIHBhdGggYXMgd2VsbC4KKwkgICovCisJdm9pZCAoKnBhdGhfc2V2ZXJlZCkoc3RydWN0IGl1Y3ZfcGF0aCAqLCB1OCBpcHVzZXJbMTZdKTsKKwkvKgorCSAqIFRoZSBwYXRoX3F1aWVzY2VkIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhbiBpY3V2IGludGVycnVwdAorCSAqIHR5cGUgMHgwNCBoYXMgYmVlbiByZWNlaXZlZC4gVGhlIGNvbW11bmljYXRpb24gcGVlciBoYXMgcXVpZXNjZWQKKwkgKiB0aGUgcGF0aC4gRGVsaXZlcnkgb2YgbWVzc2FnZXMgaXMgc3RvcHBlZCB1bnRpbCBpdWN2X3BhdGhfcmVzdW1lCisJICogaGFzIGJlZW4gY2FsbGVkLgorCSAqLworCXZvaWQgKCpwYXRoX3F1aWVzY2VkKShzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdXNlclsxNl0pOworCS8qCisJICogVGhlIHBhdGhfcmVzdW1lZCBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYW4gaWN1diBpbnRlcnJ1cHQKKwkgKiB0eXBlIDB4MDUgaGFzIGJlZW4gcmVjZWl2ZWQuIFRoZSBjb21tdW5pY2F0aW9uIHBlZXIgaGFzIHJlc3VtZWQKKwkgKiB0aGUgcGF0aC4KKwkgKi8KKwl2b2lkICgqcGF0aF9yZXN1bWVkKShzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdXNlclsxNl0pOworCS8qCisJICogVGhlIG1lc3NhZ2VfcGVuZGluZyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYW4gaWN1diBpbnRlcnJ1cHQKKwkgKiB0eXBlIDB4MDYgb3IgdHlwZSAweDA3IGhhcyBiZWVuIHJlY2VpdmVkLiBBIG5ldyBtZXNzYWdlIGlzCisJICogYXZhaWxhYmUgYW5kIGNhbiBiZSByZWNlaXZlZCB3aXRoIGl1Y3ZfbWVzc2FnZV9yZWNlaXZlLgorCSAqLworCXZvaWQgKCptZXNzYWdlX3BlbmRpbmcpKHN0cnVjdCBpdWN2X3BhdGggKiwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqKTsKKwkvKgorCSAqIFRoZSBtZXNzYWdlX2NvbXBsZXRlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhbiBpY3V2IGludGVycnVwdAorCSAqIHR5cGUgMHgwOCBvciB0eXBlIDB4MDkgaGFzIGJlZW4gcmVjZWl2ZWQuIEEgbWVzc2FnZSBzZW5kIHdpdGgKKwkgKiBpdWN2X21lc3NhZ2Vfc2VuZDJ3YXkgaGFzIGJlZW4gcmVwbGllZCB0by4gVGhlIHJlcGx5IGNhbiBiZQorCSAqIHJlY2VpdmVkIHdpdGggaXVjdl9tZXNzYWdlX3JlY2VpdmUuCisJICovCisJdm9pZCAoKm1lc3NhZ2VfY29tcGxldGUpKHN0cnVjdCBpdWN2X3BhdGggKiwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqKTsKKworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBhdGhzOworfTsKKworLyoqCisgKiBpdWN2X3JlZ2lzdGVyOgorICogQGhhbmRsZXI6IGFkZHJlc3Mgb2YgaXVjdiBoYW5kbGVyIHN0cnVjdHVyZQorICogQHNtcDogIT0gMCBpbmRpY2F0ZXMgdGhhdCB0aGUgaGFuZGxlciBjYW4gZGVhbCB3aXRoIG91dCBvZiBvcmRlciBtZXNzYWdlcworICoKKyAqIFJlZ2lzdGVycyBhIGRyaXZlciB3aXRoIElVQ1YuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gaWYgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgcGF0aGlkCisgKiB0YWJsZSBmYWlsZWQsIG9yIC1FSU8gaWYgSVVDVl9ERUNMQVJFX0JVRkZFUiBmYWlsZWQgb24gYWxsIGNwdXMuCisgKi8KK2ludCBpdWN2X3JlZ2lzdGVyKHN0cnVjdCBpdWN2X2hhbmRsZXIgKmhhbmRsZXIsIGludCBzbXApOworCisvKioKKyAqIGl1Y3ZfdW5yZWdpc3RlcgorICogQGhhbmRsZXI6ICBhZGRyZXNzIG9mIGl1Y3YgaGFuZGxlciBzdHJ1Y3R1cmUKKyAqIEBzbXA6ICE9IDAgaW5kaWNhdGVzIHRoYXQgdGhlIGhhbmRsZXIgY2FuIGRlYWwgd2l0aCBvdXQgb2Ygb3JkZXIgbWVzc2FnZXMKKyAqCisgKiBVbnJlZ2lzdGVyIGRyaXZlciBmcm9tIElVQ1YuCisgKi8KK3ZvaWQgaXVjdl91bnJlZ2lzdGVyKHN0cnVjdCBpdWN2X2hhbmRsZXIgKmhhbmRsZSwgaW50IHNtcCk7CisKKy8qKgorICogaXVjdl9wYXRoX2FsbG9jCisgKiBAbXNnbGltOiBpbml0aWFsIG1lc3NhZ2UgbGltaXQKKyAqIEBmbGFnczogaW5pdGlhbCBmbGFncworICogQGdmcDoga21hbGxvYyBhbGxvY2F0aW9uIGZsYWcKKyAqCisgKiBBbGxvY2F0ZSBhIG5ldyBwYXRoIHN0cnVjdHVyZSBmb3IgdXNlIHdpdGggaXVjdl9jb25uZWN0LgorICoKKyAqIFJldHVybnMgTlVMTCBpZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIG9yIGEgcG9pbnRlciB0byB0aGUKKyAqIHBhdGggc3RydWN0dXJlLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpdWN2X3BhdGggKml1Y3ZfcGF0aF9hbGxvYyh1MTYgbXNnbGltLCB1OCBmbGFncywgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBpdWN2X3BhdGggKnBhdGg7CisKKwlwYXRoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl1Y3ZfcGF0aCksIGdmcCk7CisJaWYgKHBhdGgpIHsKKwkJcGF0aC0+bXNnbGltID0gbXNnbGltOworCQlwYXRoLT5mbGFncyA9IGZsYWdzOworCX0KKwlyZXR1cm4gcGF0aDsKK30KKworLyoqCisgKiBpdWN2X3BhdGhfZnJlZQorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICoKKyAqIEZyZWVzIGEgcGF0aCBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpdWN2X3BhdGhfZnJlZShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoKQoreworCWtmcmVlKHBhdGgpOworfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9hY2NlcHQKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBoYW5kbGVyOiBhZGRyZXNzIG9mIGl1Y3YgaGFuZGxlciBzdHJ1Y3R1cmUKKyAqIEB1c2VyZGF0YTogMTYgYnl0ZXMgb2YgZGF0YSByZWZsZWN0ZWQgdG8gdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorICogQHByaXZhdGU6IHByaXZhdGUgZGF0YSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzIGZvciB0aGlzIHBhdGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGlzc3VlZCBhZnRlciB0aGUgdXNlciByZWNlaXZlZCBhIGNvbm5lY3Rpb24gcGVuZGluZworICogZXh0ZXJuYWwgaW50ZXJydXB0IGFuZCBub3cgd2lzaGVzIHRvIGNvbXBsZXRlIHRoZSBJVUNWIGNvbW11bmljYXRpb24gcGF0aC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfcGF0aF9hY2NlcHQoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfaGFuZGxlciAqaGFuZGxlciwKKwkJICAgICB1OCB1c2VyZGF0YVsxNl0sIHZvaWQgKnByaXZhdGUpOworCisvKioKKyAqIGl1Y3ZfcGF0aF9jb25uZWN0CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAaGFuZGxlcjogYWRkcmVzcyBvZiBpdWN2IGhhbmRsZXIgc3RydWN0dXJlCisgKiBAdXNlcmlkOiA4LWJ5dGUgdXNlciBpZGVudGlmaWNhdGlvbgorICogQHN5c3RlbTogOC1ieXRlIHRhcmdldCBzeXN0ZW0gaWRlbnRpZmljYXRpb24KKyAqIEB1c2VyZGF0YTogMTYgYnl0ZXMgb2YgZGF0YSByZWZsZWN0ZWQgdG8gdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorICogQHByaXZhdGU6IHByaXZhdGUgZGF0YSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzIGZvciB0aGlzIHBhdGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVzdGFibGlzaGVzIGFuIElVQ1YgcGF0aC4gQWx0aG91Z2ggdGhlIGNvbm5lY3QgbWF5IGNvbXBsZXRlCisgKiBzdWNjZXNzZnVsbHksIHlvdSBhcmUgbm90IGFibGUgdG8gdXNlIHRoZSBwYXRoIHVudGlsIHlvdSByZWNlaXZlIGFuIElVQ1YKKyAqIENvbm5lY3Rpb24gQ29tcGxldGUgZXh0ZXJuYWwgaW50ZXJydXB0LgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9wYXRoX2Nvbm5lY3Qoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfaGFuZGxlciAqaGFuZGxlciwKKwkJICAgICAgdTggdXNlcmlkWzhdLCB1OCBzeXN0ZW1bOF0sIHU4IHVzZXJkYXRhWzE2XSwKKwkJICAgICAgdm9pZCAqcHJpdmF0ZSk7CisKKy8qKgorICogaXVjdl9wYXRoX3F1aWVzY2U6CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAdXNlcmRhdGE6IDE2IGJ5dGVzIG9mIGRhdGEgcmVmbGVjdGVkIHRvIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRlbXBvcmFyaWx5IHN1c3BlbmRzIGluY29taW5nIG1lc3NhZ2VzIG9uIGFuIElVQ1YgcGF0aC4KKyAqIFlvdSBjYW4gbGF0ZXIgcmVhY3RpdmF0ZSB0aGUgcGF0aCBieSBpbnZva2luZyB0aGUgaXVjdl9yZXN1bWUgZnVuY3Rpb24uCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfcGF0aF9xdWllc2NlKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IHVzZXJkYXRhWzE2XSk7CisKKy8qKgorICogaXVjdl9wYXRoX3Jlc3VtZToKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEB1c2VyZGF0YTogMTYgYnl0ZXMgb2YgZGF0YSByZWZsZWN0ZWQgdG8gdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzdW1lcyBpbmNvbWluZyBtZXNzYWdlcyBvbiBhbiBJVUNWIHBhdGggdGhhdCBoYXMKKyAqIGJlZW4gc3RvcHBlZCB3aXRoIGl1Y3ZfcGF0aF9xdWllc2NlLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBDUCBJVUNWIGNhbGwuCisgKi8KK2ludCBpdWN2X3BhdGhfcmVzdW1lKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IHVzZXJkYXRhWzE2XSk7CisKKy8qKgorICogaXVjdl9wYXRoX3NldmVyCisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAdXNlcmRhdGE6IDE2IGJ5dGVzIG9mIGRhdGEgcmVmbGVjdGVkIHRvIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgYW4gSVVDViBwYXRoLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBDUCBJVUNWIGNhbGwuCisgKi8KK2ludCBpdWN2X3BhdGhfc2V2ZXIoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgdTggdXNlcmRhdGFbMTZdKTsKKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcHVyZ2UKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBtc2c6IGFkZHJlc3Mgb2YgaXVjdiBtc2cgc3RydWN0dXJlCisgKiBAc3JjY2xzOiBzb3VyY2UgY2xhc3Mgb2YgbWVzc2FnZQorICoKKyAqIENhbmNlbHMgYSBtZXNzYWdlIHlvdSBoYXZlIHNlbnQuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9wdXJnZShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2csCisJCSAgICAgICB1MzIgc3JjY2xzKTsKKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcmVjZWl2ZQorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQG1zZzogYWRkcmVzcyBvZiBpdWN2IG1zZyBzdHJ1Y3R1cmUKKyAqIEBmbGFnczogZmxhZ3MgdGhhdCBhZmZlY3QgaG93IHRoZSBtZXNzYWdlIGlzIHJlY2VpdmVkIChJVUNWX0lQQlVGTFNUKQorICogQGJ1ZmZlcjogYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciBvciBhZGRyZXNzIG9mIHN0cnVjdCBpdWN2X2FycmF5CisgKiBAc2l6ZTogbGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKiBAcmVzaWR1YWw6CisgKgorICogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBtZXNzYWdlcyB0aGF0IGFyZSBiZWluZyBzZW50IHRvIHlvdSBvdmVyCisgKiBlc3RhYmxpc2hlZCBwYXRocy4gVGhpcyBmdW5jdGlvbiB3aWxsIGRlYWwgd2l0aCBSTURBVEEgbWVzc2FnZXMKKyAqIGVtYmVkZGVkIGluIHN0cnVjdCBpdWN2X21lc3NhZ2UgYXMgd2VsbC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgZnJvbSB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9tZXNzYWdlX3JlY2VpdmUoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnLAorCQkJIHU4IGZsYWdzLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBzaXplX3QgKnJlc2lkdWFsKTsKKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcmVqZWN0CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAbXNnOiBhZGRyZXNzIG9mIGl1Y3YgbXNnIHN0cnVjdHVyZQorICoKKyAqIFRoZSByZWplY3QgZnVuY3Rpb24gcmVmdXNlcyBhIHNwZWNpZmllZCBtZXNzYWdlLiBCZXR3ZWVuIHRoZSB0aW1lIHlvdQorICogYXJlIG5vdGlmaWVkIG9mIGEgbWVzc2FnZSBhbmQgdGhlIHRpbWUgdGhhdCB5b3UgY29tcGxldGUgdGhlIG1lc3NhZ2UsCisgKiB0aGUgbWVzc2FnZSBtYXkgYmUgcmVqZWN0ZWQuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9yZWplY3Qoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnKTsKKworLyoqCisgKiBpdWN2X21lc3NhZ2VfcmVwbHkKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBtc2c6IGFkZHJlc3Mgb2YgaXVjdiBtc2cgc3RydWN0dXJlCisgKiBAZmxhZ3M6IGhvdyB0aGUgcmVwbHkgaXMgc2VudCAoSVVDVl9JUFJNREFUQSwgSVVDVl9JUFBSVFksIElVQ1ZfSVBCVUZMU1QpCisgKiBAcmVwbHk6IGFkZHJlc3Mgb2YgZGF0YSBidWZmZXIgb3IgYWRkcmVzcyBvZiBzdHJ1Y3QgaXVjdl9hcnJheQorICogQHNpemU6IGxlbmd0aCBvZiByZXBseSBkYXRhIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzcG9uZHMgdG8gdGhlIHR3by13YXkgbWVzc2FnZXMgdGhhdCB5b3UgcmVjZWl2ZS4gWW91CisgKiBtdXN0IGlkZW50aWZ5IGNvbXBsZXRlbHkgdGhlIG1lc3NhZ2UgdG8gd2hpY2ggeW91IHdpc2ggdG8gcmVwbHkuIGllLAorICogcGF0aGlkLCBtc2dpZCwgYW5kIHRyZ2Nscy4gUHJtbXNnIHNpZ25pZmllcyB0aGUgZGF0YSBpcyBtb3ZlZCBpbnRvCisgKiB0aGUgcGFyYW1ldGVyIGxpc3QuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9yZXBseShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2csCisJCSAgICAgICB1OCBmbGFncywgdm9pZCAqcmVwbHksIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBpdWN2X21lc3NhZ2Vfc2VuZAorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQG1zZzogYWRkcmVzcyBvZiBpdWN2IG1zZyBzdHJ1Y3R1cmUKKyAqIEBmbGFnczogaG93IHRoZSBtZXNzYWdlIGlzIHNlbnQgKElVQ1ZfSVBSTURBVEEsIElVQ1ZfSVBQUlRZLCBJVUNWX0lQQlVGTFNUKQorICogQHNyY2Nsczogc291cmNlIGNsYXNzIG9mIG1lc3NhZ2UKKyAqIEBidWZmZXI6IGFkZHJlc3Mgb2YgZGF0YSBidWZmZXIgb3IgYWRkcmVzcyBvZiBzdHJ1Y3QgaXVjdl9hcnJheQorICogQHNpemU6IGxlbmd0aCBvZiBzZW5kIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4gRGF0YSB0byBiZQorICogdHJhbnNtaXR0ZWQgaXMgaW4gYSBidWZmZXIgYW5kIHRoaXMgaXMgYSBvbmUtd2F5IG1lc3NhZ2UgYW5kIHRoZQorICogcmVjZWl2ZXIgd2lsbCBub3QgcmVwbHkgdG8gdGhlIG1lc3NhZ2UuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9zZW5kKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZywKKwkJICAgICAgdTggZmxhZ3MsIHUzMiBzcmNjbHMsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisvKioKKyAqIGl1Y3ZfbWVzc2FnZV9zZW5kMndheQorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQG1zZzogYWRkcmVzcyBvZiBpdWN2IG1zZyBzdHJ1Y3R1cmUKKyAqIEBmbGFnczogaG93IHRoZSBtZXNzYWdlIGlzIHNlbnQgYW5kIHRoZSByZXBseSBpcyByZWNlaXZlZAorICoJICAgKElVQ1ZfSVBSTURBVEEsIElVQ1ZfSVBCVUZMU1QsIElVQ1ZfSVBQUlRZLCBJVUNWX0FOU0xTVCkKKyAqIEBzcmNjbHM6IHNvdXJjZSBjbGFzcyBvZiBtZXNzYWdlCisgKiBAYnVmZmVyOiBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIG9yIGFkZHJlc3Mgb2Ygc3RydWN0IGl1Y3ZfYXJyYXkKKyAqIEBzaXplOiBsZW5ndGggb2Ygc2VuZCBidWZmZXIKKyAqIEBhbnNidWY6IGFkZHJlc3Mgb2YgYW5zd2VyIGJ1ZmZlciBvciBhZGRyZXNzIG9mIHN0cnVjdCBpdWN2X2FycmF5CisgKiBAYXNpemU6IHNpemUgb2YgcmVwbHkgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiB0cmFuc21pdHMgZGF0YSB0byBhbm90aGVyIGFwcGxpY2F0aW9uLiBEYXRhIHRvIGJlCisgKiB0cmFuc21pdHRlZCBpcyBpbiBhIGJ1ZmZlci4gVGhlIHJlY2VpdmVyIG9mIHRoZSBzZW5kIGlzIGV4cGVjdGVkIHRvCisgKiByZXBseSB0byB0aGUgbWVzc2FnZSBhbmQgYSBidWZmZXIgaXMgcHJvdmlkZWQgaW50byB3aGljaCBJVUNWIG1vdmVzCisgKiB0aGUgcmVwbHkgdG8gdGhpcyBtZXNzYWdlLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBDUCBJVUNWIGNhbGwuCisgKi8KK2ludCBpdWN2X21lc3NhZ2Vfc2VuZDJ3YXkoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnLAorCQkJICB1OCBmbGFncywgdTMyIHNyY2Nscywgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKKwkJCSAgdm9pZCAqYW5zd2VyLCBzaXplX3QgYXNpemUsIHNpemVfdCAqcmVzaWR1YWwpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IGJkMDFiNDYuLjY4ZWMyNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyMy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5oPgogCiAvKiBwZXIgY29ubnRyYWNrOiBhcHBsaWNhdGlvbiBoZWxwZXIgcHJpdmF0ZSBkYXRhICovCiB1bmlvbiBuZl9jb25udHJhY2tfaGVscCB7CkBAIC01Miw2ICs1Myw3IEBACiAJc3RydWN0IG5mX2N0X2Z0cF9tYXN0ZXIgY3RfZnRwX2luZm87CiAJc3RydWN0IG5mX2N0X3BwdHBfbWFzdGVyIGN0X3BwdHBfaW5mbzsKIAlzdHJ1Y3QgbmZfY3RfaDMyM19tYXN0ZXIgY3RfaDMyM19pbmZvOworCXN0cnVjdCBuZl9jdF9zYW5lX21hc3RlciBjdF9zYW5lX2luZm87CiB9OwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaAppbmRleCA2MWM2MjA2Li5iYzU3ZGQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdC5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNkZWZpbmUgSVBfTkFUX1JBTkdFX01BUF9JUFMgMQogI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEIDIKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSA0CiAKIC8qIE5BVCBzZXF1ZW5jZSBudW1iZXIgbW9kaWZpY2F0aW9ucyAqLwogc3RydWN0IG5mX25hdF9zZXEgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcm91dGUuaCBiL2luY2x1ZGUvbmV0L3JvdXRlLmgKaW5kZXggNDg2ZTM3YS4uMTQ0MGJkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9yb3V0ZS5oCkBAIC0xNDYsNyArMTQ2LDggQEAKIAogc3RhdGljIGlubGluZSBpbnQgaXBfcm91dGVfY29ubmVjdChzdHJ1Y3QgcnRhYmxlICoqcnAsIF9fYmUzMiBkc3QsCiAJCQkJICAgX19iZTMyIHNyYywgdTMyIHRvcywgaW50IG9pZiwgdTggcHJvdG9jb2wsCi0JCQkJICAgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQsIHN0cnVjdCBzb2NrICpzaykKKwkJCQkgICBfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCwgc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5vaWYgPSBvaWYsCiAJCQkgICAgLm5sX3UgPSB7IC5pcDRfdSA9IHsgLmRhZGRyID0gZHN0LApAQCAtMTY4LDcgKzE2OSw3IEBACiAJCSpycCA9IE5VTEw7CiAJfQogCXNlY3VyaXR5X3NrX2NsYXNzaWZ5X2Zsb3coc2ssICZmbCk7Ci0JcmV0dXJuIGlwX3JvdXRlX291dHB1dF9mbG93KHJwLCAmZmwsIHNrLCAwKTsKKwlyZXR1cm4gaXBfcm91dGVfb3V0cHV0X2Zsb3cocnAsICZmbCwgc2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXBfcm91dGVfbmV3cG9ydHMoc3RydWN0IHJ0YWJsZSAqKnJwLCB1OCBwcm90b2NvbCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcC5oIGIvaW5jbHVkZS9uZXQvdGNwLmgKaW5kZXggY2Q4ZmEwYy4uNWM0NzJmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTgwMiw5ICs4MDIsOCBAQAogLyoKICAqIENhbGN1bGF0ZSgvY2hlY2spIFRDUCBjaGVja3N1bQogICovCi1zdGF0aWMgaW5saW5lIF9fc3VtMTYgdGNwX3Y0X2NoZWNrKHN0cnVjdCB0Y3BoZHIgKnRoLCBpbnQgbGVuLAotCQkJICAgICAgIF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAotCQkJICAgICAgIF9fd3N1bSBiYXNlKQorc3RhdGljIGlubGluZSBfX3N1bTE2IHRjcF92NF9jaGVjayhpbnQgbGVuLCBfX2JlMzIgc2FkZHIsCisJCQkJICAgX19iZTMyIGRhZGRyLCBfX3dzdW0gYmFzZSkKIHsKIAlyZXR1cm4gY3N1bV90Y3B1ZHBfbWFnaWMoc2FkZHIsZGFkZHIsbGVuLElQUFJPVE9fVENQLGJhc2UpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQveDI1LmggYi9pbmNsdWRlL25ldC94MjUuaAppbmRleCBlNDdmZTQ0Li5mYzNmMDNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94MjUuaAorKysgYi9pbmNsdWRlL25ldC94MjUuaApAQCAtMTYxLDYgKzE2MSwxNCBAQAogCXVuc2lnbmVkIGxvbmcgCQl2Y19mYWNpbF9tYXNrOwkvKiBpbmNfY2FsbCBmYWNpbGl0aWVzIG1hc2sgKi8KIH07CiAKK3N0cnVjdCB4MjVfZm9yd2FyZCB7CisJc3RydWN0IGxpc3RfaGVhZAlub2RlOworCXVuc2lnbmVkIGludAkJbGNpOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYxOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYyOworCWF0b21pY190CQlyZWZjbnQ7Cit9OworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB4MjVfc29jayAqeDI1X3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIHsKIAlyZXR1cm4gKHN0cnVjdCB4MjVfc29jayAqKXNrOwpAQCAtMTcyLDYgKzE4MCw3IEBACiBleHRlcm4gaW50ICBzeXNjdGxfeDI1X3Jlc2V0X3JlcXVlc3RfdGltZW91dDsKIGV4dGVybiBpbnQgIHN5c2N0bF94MjVfY2xlYXJfcmVxdWVzdF90aW1lb3V0OwogZXh0ZXJuIGludCAgc3lzY3RsX3gyNV9hY2tfaG9sZGJhY2tfdGltZW91dDsKK2V4dGVybiBpbnQgIHN5c2N0bF94MjVfZm9yd2FyZDsKIAogZXh0ZXJuIGludCAgeDI1X2FkZHJfbnRvYSh1bnNpZ25lZCBjaGFyICosIHN0cnVjdCB4MjVfYWRkcmVzcyAqLAogCQkJICBzdHJ1Y3QgeDI1X2FkZHJlc3MgKik7CkBAIC0xOTgsNiArMjA3LDEzIEBACiAJCQkJc3RydWN0IHgyNV9kdGVfZmFjaWxpdGllcyAqKTsKIGV4dGVybiB2b2lkIHgyNV9saW1pdF9mYWNpbGl0aWVzKHN0cnVjdCB4MjVfZmFjaWxpdGllcyAqLCBzdHJ1Y3QgeDI1X25laWdoICopOwogCisvKiB4MjVfZm9yd2FyZC5jICovCitleHRlcm4gdm9pZCB4MjVfY2xlYXJfZm9yd2FyZF9ieV9sY2kodW5zaWduZWQgaW50IGxjaSk7CitleHRlcm4gdm9pZCB4MjVfY2xlYXJfZm9yd2FyZF9ieV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKik7CitleHRlcm4gaW50IHgyNV9mb3J3YXJkX2RhdGEoaW50LCBzdHJ1Y3QgeDI1X25laWdoICosIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIGludCB4MjVfZm9yd2FyZF9jYWxsKHN0cnVjdCB4MjVfYWRkcmVzcyAqLCBzdHJ1Y3QgeDI1X25laWdoICosCisJCQkJc3RydWN0IHNrX2J1ZmYgKiwgaW50KTsKKwogLyogeDI1X2luLmMgKi8KIGV4dGVybiBpbnQgIHgyNV9wcm9jZXNzX3J4X2ZyYW1lKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopOwogZXh0ZXJuIGludCAgeDI1X2JhY2tsb2dfcmN2KHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopOwpAQCAtMjgyLDYgKzI5OCw4IEBACiBleHRlcm4gcndsb2NrX3QgeDI1X2xpc3RfbG9jazsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHgyNV9yb3V0ZV9saXN0OwogZXh0ZXJuIHJ3bG9ja190IHgyNV9yb3V0ZV9saXN0X2xvY2s7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB4MjVfZm9yd2FyZF9saXN0OworZXh0ZXJuIHJ3bG9ja190IHgyNV9mb3J3YXJkX2xpc3RfbG9jazsKIAogZXh0ZXJuIGludCB4MjVfcHJvY19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgeDI1X3Byb2NfZXhpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3hmcm0uaCBiL2luY2x1ZGUvbmV0L3hmcm0uaAppbmRleCBlNDc2NTQxLi4xNjkyNGNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQveGZybS5oCkBAIC0yNTIsMTAgKzI1MiwxMyBAQAogCQkJCQkJeGZybV9hZGRyZXNzX3QgKmRhZGRyLCB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIpOwogCWludAkJCSgqdG1wbF9zb3J0KShzdHJ1Y3QgeGZybV90bXBsICoqZHN0LCBzdHJ1Y3QgeGZybV90bXBsICoqc3JjLCBpbnQgbik7CiAJaW50CQkJKCpzdGF0ZV9zb3J0KShzdHJ1Y3QgeGZybV9zdGF0ZSAqKmRzdCwgc3RydWN0IHhmcm1fc3RhdGUgKipzcmMsIGludCBuKTsKKwlpbnQJCQkoKm91dHB1dCkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB9OwogCiBleHRlcm4gaW50IHhmcm1fc3RhdGVfcmVnaXN0ZXJfYWZpbmZvKHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvKTsKIGV4dGVybiBpbnQgeGZybV9zdGF0ZV91bnJlZ2lzdGVyX2FmaW5mbyhzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbyk7CitleHRlcm4gc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvICp4ZnJtX3N0YXRlX2dldF9hZmluZm8odW5zaWduZWQgc2hvcnQgZmFtaWx5KTsKK2V4dGVybiB2b2lkIHhmcm1fc3RhdGVfcHV0X2FmaW5mbyhzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbyk7CiAKIGV4dGVybiB2b2lkIHhmcm1fc3RhdGVfZGVsZXRlX3R1bm5lbChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCk7CiAKQEAgLTM1OSw2ICszNjIsMTkgQEAKIAlzdHJ1Y3QgeGZybV90bXBsICAgICAgIAl4ZnJtX3ZlY1tYRlJNX01BWF9ERVBUSF07CiB9OwogCitzdHJ1Y3QgeGZybV9taWdyYXRlIHsKKwl4ZnJtX2FkZHJlc3NfdAkJb2xkX2RhZGRyOworCXhmcm1fYWRkcmVzc190CQlvbGRfc2FkZHI7CisJeGZybV9hZGRyZXNzX3QJCW5ld19kYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAkJbmV3X3NhZGRyOworCXU4CQkJcHJvdG87CisJdTgJCQltb2RlOworCXUxNgkJCXJlc2VydmVkOworCXUzMgkJCXJlcWlkOworCXUxNgkJCW9sZF9mYW1pbHk7CisJdTE2CQkJbmV3X2ZhbWlseTsKK307CisKICNkZWZpbmUgWEZSTV9LTV9USU1FT1VUICAgICAgICAgICAgICAgIDMwCiAvKiB3aGljaCBzZXFubyAqLwogI2RlZmluZSBYRlJNX1JFUExBWV9TRVEJCTEKQEAgLTM4NSw2ICs0MDEsNyBAQAogCWludAkJCSgqbmV3X21hcHBpbmcpKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCB4ZnJtX2FkZHJlc3NfdCAqaXBhZGRyLCBfX2JlMTYgc3BvcnQpOwogCWludAkJCSgqbm90aWZ5X3BvbGljeSkoc3RydWN0IHhmcm1fcG9saWN5ICp4LCBpbnQgZGlyLCBzdHJ1Y3Qga21fZXZlbnQgKmMpOwogCWludAkJCSgqcmVwb3J0KSh1OCBwcm90bywgc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgeGZybV9hZGRyZXNzX3QgKmFkZHIpOworCWludAkJCSgqbWlncmF0ZSkoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLCBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX2J1bmRsZXMpOwogfTsKIAogZXh0ZXJuIGludCB4ZnJtX3JlZ2lzdGVyX2ttKHN0cnVjdCB4ZnJtX21nciAqa20pOwpAQCAtOTg1LDYgKzEwMDIsMTYgQEAKIAkJCSAgc3RydWN0IGZsb3dpICpmbCwgaW50IGZhbWlseSwgaW50IHN0cmljdCk7CiBleHRlcm4gdm9pZCB4ZnJtX2luaXRfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogCisjaWZkZWYgQ09ORklHX1hGUk1fTUlHUkFURQorZXh0ZXJuIGludCBrbV9taWdyYXRlKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHU4IGRpciwgdTggdHlwZSwKKwkJICAgICAgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9idW5kbGVzKTsKK2V4dGVybiBzdHJ1Y3QgeGZybV9zdGF0ZSAqIHhmcm1fbWlncmF0ZV9zdGF0ZV9maW5kKHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0pOworZXh0ZXJuIHN0cnVjdCB4ZnJtX3N0YXRlICogeGZybV9zdGF0ZV9taWdyYXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LAorCQkJCQkgICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptKTsKK2V4dGVybiBpbnQgeGZybV9taWdyYXRlKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHU4IGRpciwgdTggdHlwZSwKKwkJCXN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fYnVuZGxlcyk7CisjZW5kaWYKKwogZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IGttX3dhaXRxOwogZXh0ZXJuIGludCBrbV9uZXdfbWFwcGluZyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgX19iZTE2IHNwb3J0KTsKIGV4dGVybiB2b2lkIGttX3BvbGljeV9leHBpcmVkKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sLCBpbnQgZGlyLCBpbnQgaGFyZCwgdTMyIHBpZCk7CkBAIC0xMDUwLDUgKzEwNzcsMjUgQEAKIAkJeGZybV9yZXBsYXlfbm90aWZ5KHgsIFhGUk1fUkVQTEFZX1VQREFURSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfWEZSTV9NSUdSQVRFCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4ZnJtX2FsZ28gKnhmcm1fYWxnb19jbG9uZShzdHJ1Y3QgeGZybV9hbGdvICpvcmlnKQoreworCXJldHVybiAoc3RydWN0IHhmcm1fYWxnbyAqKWttZW1kdXAob3JpZywgc2l6ZW9mKCpvcmlnKSArIG9yaWctPmFsZ19rZXlfbGVuLCBHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhmcm1fc3RhdGVzX3B1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqKnN0YXRlcywgaW50IG4pCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJeGZybV9zdGF0ZV9wdXQoKihzdGF0ZXMgKyBpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnJtX3N0YXRlc19kZWxldGUoc3RydWN0IHhmcm1fc3RhdGUgKipzdGF0ZXMsIGludCBuKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCXhmcm1fc3RhdGVfZGVsZXRlKCooc3RhdGVzICsgaSkpOworfQorI2VuZGlmCiAKICNlbmRpZgkvKiBfTkVUX1hGUk1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2lzY3NpX3Byb3RvLmggYi9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaAppbmRleCAwMmY2ZTRiLi40YTQ0Mjc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaAorKysgYi9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaApAQCAtNDAsNiArNDAsMTQgQEAKIH0KICNkZWZpbmUgemVyb19kYXRhKHApIHtwWzBdPTA7cFsxXT0wO3BbMl09MDt9CiAKKy8qIGluaXRpYXRvciB0YWdzOyBvcGFxdWUgZm9yIHRhcmdldCAqLwordHlwZWRlZiB1aW50MzJfdCBfX2JpdHdpc2VfXyBpdHRfdDsKKy8qIGJlbG93IG1ha2VzIHNlbnNlIG9ubHkgZm9yIGluaXRpYXRvciB0aGF0IGNyZWF0ZWQgdGhpcyB0YWcgKi8KKyNkZWZpbmUgYnVpbGRfaXR0KGl0dCwgaWQsIGFnZSkgKChfX2ZvcmNlIGl0dF90KVwKKwkoKGl0dCkgfCAoKGlkKSA8PCBJU0NTSV9DSURfU0hJRlQpIHwgKChhZ2UpIDw8IElTQ1NJX0FHRV9TSElGVCkpKQorI2RlZmluZSBnZXRfaXR0KGl0dCkgKChfX2ZvcmNlIHVpbnQzMl90KShpdHRfdCkoaXR0KSAmIElTQ1NJX0lUVF9NQVNLKQorI2RlZmluZSBSRVNFUlZFRF9JVFQgKChfX2ZvcmNlIGl0dF90KTB4ZmZmZmZmZmYpCisKIC8qCiAgKiBpU0NTSSBUZW1wbGF0ZSBNZXNzYWdlIEhlYWRlcgogICovCkBAIC01MCw3ICs1OCw3IEBACiAJdWludDhfdAkJaGxlbmd0aDsJLyogQUhTcyB0b3RhbCBsZW5ndGggKi8KIAl1aW50OF90CQlkbGVuZ3RoWzNdOwkvKiBEYXRhIGxlbmd0aCAqLwogCXVpbnQ4X3QJCWx1bls4XTsKLQlfX2JlMzIJCWl0dDsJCS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CQlpdHQ7CQkvKiBJbml0aWF0b3IgVGFzayBUYWcsIG9wYXF1ZSBmb3IgdGFyZ2V0ICovCiAJX19iZTMyCQl0dHQ7CQkvKiBUYXJnZXQgVGFzayBUYWcgKi8KIAlfX2JlMzIJCXN0YXRzbjsKIAlfX2JlMzIJCWV4cF9zdGF0c247CkBAIC0xMTEsNyArMTE5LDcgQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgbHVuWzhdOwotCV9fYmUzMiBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCV9fYmUzMiBkYXRhX2xlbmd0aDsKIAlfX2JlMzIgY21kc247CiAJX19iZTMyIGV4cF9zdGF0c247CkBAIC0xNDgsNyArMTU2LDcgQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgcnN2ZFs4XTsKLQlfX2JlMzIJaXR0OwkvKiBJbml0aWF0b3IgVGFzayBUYWcgKi8KKwlpdHRfdAkgaXR0OwkvKiBJbml0aWF0b3IgVGFzayBUYWcgKi8KIAlfX2JlMzIJcnN2ZDE7CiAJX19iZTMyCXN0YXRzbjsKIAlfX2JlMzIJZXhwX2NtZHNuOwpAQCAtMjA2LDcgKzIxNCw3IEBACiAJdWludDhfdCByc3ZkMzsKIAl1aW50OF90IGRsZW5ndGhbM107CiAJdWludDhfdCBsdW5bOF07Ci0JX19iZTMyCWl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJaXR0X3QJIGl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCiAJX19iZTMyCXR0dDsJLyogVGFyZ2V0IFRyYW5zZmVyIFRhZyAqLwogCV9fYmUzMgljbWRzbjsKIAlfX2JlMzIJZXhwX3N0YXRzbjsKQEAgLTIyMSw3ICsyMjksNyBAQAogCXVpbnQ4X3QgcnN2ZDM7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgbHVuWzhdOwotCV9fYmUzMglpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCV9fYmUzMgl0dHQ7CS8qIFRhcmdldCBUcmFuc2ZlciBUYWcgKi8KIAlfX2JlMzIJc3RhdHNuOwogCV9fYmUzMglleHBfY21kc247CkBAIC0yMzcsOCArMjQ1LDggQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgbHVuWzhdOwotCV9fYmUzMglpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwotCV9fYmUzMglydHQ7CS8qIFJlZmVyZW5jZSBUYXNrIFRhZyAqLworCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CSBydHQ7CS8qIFJlZmVyZW5jZSBUYXNrIFRhZyAqLwogCV9fYmUzMgljbWRzbjsKIAlfX2JlMzIJZXhwX3N0YXRzbjsKIAlfX2JlMzIJcmVmY21kc247CkBAIC0yNjcsOCArMjc1LDggQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgcnN2ZDJbOF07Ci0JX19iZTMyCWl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCi0JX19iZTMyCXJ0dDsJLyogUmVmZXJlbmNlIFRhc2sgVGFnICovCisJaXR0X3QJIGl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJaXR0X3QJIHJ0dDsJLyogUmVmZXJlbmNlIFRhc2sgVGFnICovCiAJX19iZTMyCXN0YXRzbjsKIAlfX2JlMzIJZXhwX2NtZHNuOwogCV9fYmUzMgltYXhfY21kc247CkBAIC0yOTMsNyArMzAxLDcgQEAKIAl1aW50OF90CWhsZW5ndGg7CiAJdWludDhfdAlkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgbHVuWzhdOwotCV9fYmUzMglpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCV9fYmUzMgl0dHQ7CS8qIFRhcmdldCBUcmFuc2ZlciBUYWcgKi8KIAlfX2JlMzIJc3RhdHNuOwogCV9fYmUzMglleHBfY21kc247CkBAIC0zMTEsNyArMzE5LDcgQEAKIAl1aW50OF90IHJzdmQzOwogCXVpbnQ4X3QgZGxlbmd0aFszXTsKIAl1aW50OF90IGx1bls4XTsKLQlfX2JlMzIJaXR0OworCWl0dF90CSBpdHQ7CiAJX19iZTMyCXR0dDsKIAlfX2JlMzIJcnN2ZDQ7CiAJX19iZTMyCWV4cF9zdGF0c247CkBAIC0zMzEsNyArMzM5LDcgQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgbHVuWzhdOwotCV9fYmUzMglpdHQ7CisJaXR0X3QJIGl0dDsKIAlfX2JlMzIJdHR0OwogCV9fYmUzMglzdGF0c247CiAJX19iZTMyCWV4cF9jbWRzbjsKQEAgLTM1NSw3ICszNjMsNyBAQAogCXVpbnQ4X3QgaGxlbmd0aDsKIAl1aW50OF90IGRsZW5ndGhbM107CiAJdWludDhfdCByc3ZkNFs4XTsKLQlfX2JlMzIJaXR0OworCWl0dF90CSBpdHQ7CiAJX19iZTMyCXR0dDsKIAlfX2JlMzIJY21kc247CiAJX19iZTMyCWV4cF9zdGF0c247CkBAIC0zNzMsNyArMzgxLDcgQEAKIAl1aW50OF90IGhsZW5ndGg7CiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgcnN2ZDRbOF07Ci0JX19iZTMyCWl0dDsKKwlpdHRfdAkgaXR0OwogCV9fYmUzMgl0dHQ7CiAJX19iZTMyCXN0YXRzbjsKIAlfX2JlMzIJZXhwX2NtZHNuOwpAQCAtMzkyLDcgKzQwMCw3IEBACiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgaXNpZFs2XTsJLyogSW5pdGlhdG9yIFNlc3Npb24gSUQgKi8KIAlfX2JlMTYJdHNpaDsJLyogVGFyZ2V0IFNlc3Npb24gSGFuZGxlICovCi0JX19iZTMyCWl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJaXR0X3QJIGl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCiAJX19iZTE2CWNpZDsKIAlfX2JlMTYJcnN2ZDM7CiAJX19iZTMyCWNtZHNuOwpAQCAtNDIxLDcgKzQyOSw3IEBACiAJdWludDhfdCBkbGVuZ3RoWzNdOwogCXVpbnQ4X3QgaXNpZFs2XTsJLyogSW5pdGlhdG9yIFNlc3Npb24gSUQgKi8KIAlfX2JlMTYJdHNpaDsJLyogVGFyZ2V0IFNlc3Npb24gSGFuZGxlICovCi0JX19iZTMyCWl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCisJaXR0X3QJIGl0dDsJLyogSW5pdGlhdG9yIFRhc2sgVGFnICovCiAJX19iZTMyCXJzdmQzOwogCV9fYmUzMglzdGF0c247CiAJX19iZTMyCWV4cF9jbWRzbjsKQEAgLTQ3OCw3ICs0ODYsNyBAQAogCXVpbnQ4X3QgaGxlbmd0aDsKIAl1aW50OF90IGRsZW5ndGhbM107CiAJdWludDhfdCByc3ZkMls4XTsKLQlfX2JlMzIJaXR0OwkvKiBJbml0aWF0b3IgVGFzayBUYWcgKi8KKwlpdHRfdAkgaXR0OwkvKiBJbml0aWF0b3IgVGFzayBUYWcgKi8KIAlfX2JlMTYJY2lkOwogCXVpbnQ4X3QgcnN2ZDNbMl07CiAJX19iZTMyCWNtZHNuOwpAQCAtNTA1LDcgKzUxMyw3IEBACiAJdWludDhfdCBobGVuZ3RoOwogCXVpbnQ4X3QgZGxlbmd0aFszXTsKIAl1aW50OF90IHJzdmQzWzhdOwotCV9fYmUzMglpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLworCWl0dF90CSBpdHQ7CS8qIEluaXRpYXRvciBUYXNrIFRhZyAqLwogCV9fYmUzMglyc3ZkNDsKIAlfX2JlMzIJc3RhdHNuOwogCV9fYmUzMglleHBfY21kc247CkBAIC01MjgsNyArNTM2LDcgQEAKIAl1aW50OF90IG9wY29kZTsKIAl1aW50OF90IGZsYWdzOwogCXVpbnQ4X3QgcnN2ZDJbMTRdOwotCV9fYmUzMglpdHQ7CisJaXR0X3QJIGl0dDsKIAlfX2JlMzIJYmVncnVuOwogCV9fYmUzMglydW5sZW5ndGg7CiAJX19iZTMyCWV4cF9zdGF0c247CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FjOTdfY29kZWMuaCBiL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCmluZGV4IDMzNzIwMzkuLjI0NmFjMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCisrKyBiL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCkBAIC0zNzUsNiArMzc1LDcgQEAKICNkZWZpbmUgQUM5N19TQ0FQX0RFVEVDVF9CWV9WRU5ET1IgKDE8PDgpIC8qIHVzZSB2ZW5kb3IgcmVnaXN0ZXJzIGZvciByZWFkIHRlc3RzICovCiAjZGVmaW5lIEFDOTdfU0NBUF9OT19TUERJRgkoMTw8OSkJLyogZG9uJ3QgYnVpbGQgU1BESUYgY29udHJvbHMgKi8KICNkZWZpbmUgQUM5N19TQ0FQX0VBUERfTEVECSgxPDwxMCkJLyogRUFQRCBhcyBtdXRlIExFRCAqLworI2RlZmluZSBBQzk3X1NDQVBfUE9XRVJfU0FWRQkoMTw8MTEpCS8qIGNhcGFibGUgZm9yIGFnZ3Jlc2l2ZSBwb3dlci1zYXZpbmcgKi8KIAogLyogYWM5Ny0+ZmxhZ3MgKi8KICNkZWZpbmUgQUM5N19IQVNfUENfQkVFUAkoMTw8MCkJLyogZm9yY2UgUEMgU3BlYWtlciB1c2FnZSAqLwpAQCAtNDI1LDYgKzQyNiw3IEBACiAKIHN0cnVjdCBzbmRfYWM5N19idXNfb3BzIHsKIAl2b2lkICgqcmVzZXQpIChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpOworCXZvaWQgKCp3YXJtX3Jlc2V0KShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpOwogCXZvaWQgKCp3cml0ZSkgKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpOwogCXVuc2lnbmVkIHNob3J0ICgqcmVhZCkgKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnKTsKIAl2b2lkICgqd2FpdCkgKHN0cnVjdCBzbmRfYWM5NyAqYWM5Nyk7CkBAIC01MDEsNiArNTAzLDcgQEAKIAkJCXVuc2lnbmVkIHNob3J0IGlkWzNdOwkJLy8gY29kZWMgSURzIChsb3dlciAxNi1iaXQgd29yZCkKIAkJCXVuc2lnbmVkIHNob3J0IHBjbXJlZ1szXTsJLy8gUENNIHJlZ2lzdGVycwogCQkJdW5zaWduZWQgc2hvcnQgY29kZWNfY2ZnWzNdOwkvLyBDT0RFQ19DRkcgYml0cworCQkJdW5zaWduZWQgY2hhciBzd2FwX21pY19saW5laW47CS8vIEFEMTk4Ni9BRDE5ODZBIG9ubHkKIAkJfSBhZDE4eHg7CiAJCXVuc2lnbmVkIGludCBkZXZfZmxhZ3M7CQkvKiBkZXZpY2Ugc3BlY2lmaWMgKi8KIAl9IHNwZWM7CkBAIC01MTAsNyArNTEzLDYgQEAKIAogI2lmZGVmIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFCiAJdW5zaWduZWQgaW50IHBvd2VyX3VwOwkvKiBwb3dlciBzdGF0ZXMgKi8KLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcG93ZXJfd29ya3E7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBwb3dlcl93b3JrOwogI2VuZGlmCiAJc3RydWN0IGRldmljZSBkZXY7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FkMTg0OC5oIGIvaW5jbHVkZS9zb3VuZC9hZDE4NDguaAppbmRleCBjOGRlNmY4Li5iMmMzZjAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2FkMTg0OC5oCisrKyBiL2luY2x1ZGUvc291bmQvYWQxODQ4LmgKQEAgLTE4NSw3ICsxODUsNyBAQAogCWludCBpbmRleDsKIAlpbnQgdHlwZTsKIAl1bnNpZ25lZCBsb25nIHByaXZhdGVfdmFsdWU7Ci0JdW5zaWduZWQgaW50ICp0bHY7CisJY29uc3QgdW5zaWduZWQgaW50ICp0bHY7CiB9OwogCiAjZGVmaW5lIEFEMTg0OF9TSU5HTEUoeG5hbWUsIHhpbmRleCwgcmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0KSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FrNDExNC5oIGIvaW5jbHVkZS9zb3VuZC9hazQxMTQuaAppbmRleCAyZWUwNjE2Li5jMTQ5ZDNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2FrNDExNC5oCisrKyBiL2luY2x1ZGUvc291bmQvYWs0MTE0LmgKQEAgLTE4MSw3ICsxODEsNiBAQAogCXVuc2lnbmVkIGxvbmcgY2NyY19lcnJvcnM7CiAJdW5zaWduZWQgY2hhciByY3MwOwogCXVuc2lnbmVkIGNoYXIgcmNzMTsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAl2b2lkICpjaGFuZ2VfY2FsbGJhY2tfcHJpdmF0ZTsKIAl2b2lkICgqY2hhbmdlX2NhbGxiYWNrKShzdHJ1Y3QgYWs0MTE0ICphazQxMTQsIHVuc2lnbmVkIGNoYXIgYzAsIHVuc2lnbmVkIGNoYXIgYzEpOwpAQCAtMTg5LDcgKzE4OCw3IEBACiAKIGludCBzbmRfYWs0MTE0X2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCiAJCSAgICAgIGFrNDExNF9yZWFkX3QgKnJlYWQsIGFrNDExNF93cml0ZV90ICp3cml0ZSwKLQkJICAgICAgdW5zaWduZWQgY2hhciBwZ21bN10sIHVuc2lnbmVkIGNoYXIgdHhjc2JbNV0sCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGdtWzddLCBjb25zdCB1bnNpZ25lZCBjaGFyIHR4Y3NiWzVdLAogCQkgICAgICB2b2lkICpwcml2YXRlX2RhdGEsIHN0cnVjdCBhazQxMTQgKipyX2FrNDExNCk7CiB2b2lkIHNuZF9hazQxMTRfcmVnX3dyaXRlKHN0cnVjdCBhazQxMTQgKmFrNDExNCwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgbWFzaywgdW5zaWduZWQgY2hhciB2YWwpOwogdm9pZCBzbmRfYWs0MTE0X3JlaW5pdChzdHJ1Y3QgYWs0MTE0ICphazQxMTQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hazQxMTcuaCBiL2luY2x1ZGUvc291bmQvYWs0MTE3LmgKaW5kZXggMmI5NmMzMi4uZDY1MGQ1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9hazQxMTcuaAorKysgYi9pbmNsdWRlL3NvdW5kL2FrNDExNy5oCkBAIC0xNzgsNyArMTc4LDcgQEAKIH07CiAKIGludCBzbmRfYWs0MTE3X2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGFrNDExN19yZWFkX3QgKnJlYWQsIGFrNDExN193cml0ZV90ICp3cml0ZSwKLQkJICAgICAgdW5zaWduZWQgY2hhciBwZ21bNV0sIHZvaWQgKnByaXZhdGVfZGF0YSwgc3RydWN0IGFrNDExNyAqKnJfYWs0MTE3KTsKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBwZ21bNV0sIHZvaWQgKnByaXZhdGVfZGF0YSwgc3RydWN0IGFrNDExNyAqKnJfYWs0MTE3KTsKIHZvaWQgc25kX2FrNDExN19yZWdfd3JpdGUoc3RydWN0IGFrNDExNyAqYWs0MTE3LCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciBtYXNrLCB1bnNpZ25lZCBjaGFyIHZhbCk7CiB2b2lkIHNuZF9hazQxMTdfcmVpbml0KHN0cnVjdCBhazQxMTcgKmFrNDExNyk7CiBpbnQgc25kX2FrNDExN19idWlsZChzdHJ1Y3QgYWs0MTE3ICphazQxMTcsIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqY2FwdHVyZV9zdWJzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hazR4eHgtYWRkYS5oIGIvaW5jbHVkZS9zb3VuZC9hazR4eHgtYWRkYS5oCmluZGV4IGQwZGVjYTYuLmFhNDlkZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvYWs0eHh4LWFkZGEuaAorKysgYi9pbmNsdWRlL3NvdW5kL2FrNHh4eC1hZGRhLmgKQEAgLTUwLDYgKzUwLDggQEAKIAljaGFyICpuYW1lOwkJLyogY2FwdHVyZSBnYWluIHZvbHVtZSBsYWJlbCAqLwogCWNoYXIgKnN3aXRjaF9uYW1lOwkvKiBjYXB0dXJlIHN3aXRjaCAqLwogCXVuc2lnbmVkIGludCBudW1fY2hhbm5lbHM7CisJY2hhciAqc2VsZWN0b3JfbmFtZTsJLyogY2FwdHVyZSBzb3VyY2Ugc2VsZWN0IGxhYmVsICovCisJY29uc3QgY2hhciAqKmlucHV0X25hbWVzOyAvKiBjYXB0dXJlIHNvdXJjZSBuYW1lcyAoTlVMTCB0ZXJtaW5hdGVkKSAqLwogfTsKIAogc3RydWN0IHNuZF9ha200eHh4IHsKQEAgLTY5LDggKzcxLDggQEAKIAl9IHR5cGU7CiAKIAkvKiAoYXJyYXkpIGluZm9ybWF0aW9uIG9mIGNvbWJpbmVkIGNvZGVjcyAqLwotCXN0cnVjdCBzbmRfYWttNHh4eF9kYWNfY2hhbm5lbCAqZGFjX2luZm87Ci0Jc3RydWN0IHNuZF9ha200eHh4X2FkY19jaGFubmVsICphZGNfaW5mbzsKKwljb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHhfZGFjX2NoYW5uZWwgKmRhY19pbmZvOworCWNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eF9hZGNfY2hhbm5lbCAqYWRjX2luZm87CiAKIAlzdHJ1Y3Qgc25kX2FrNHh4eF9vcHMgb3BzOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29udHJvbC5oIGIvaW5jbHVkZS9zb3VuZC9jb250cm9sLmgKaW5kZXggMWRlMTQ4Yi4uNzJlNzU5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9jb250cm9sLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb250cm9sLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKIAlzbmRfa2NvbnRyb2xfcHV0X3QgKnB1dDsKIAl1bmlvbiB7CiAJCXNuZF9rY29udHJvbF90bHZfcndfdCAqYzsKLQkJdW5zaWduZWQgaW50ICpwOworCQljb25zdCB1bnNpZ25lZCBpbnQgKnA7CiAJfSB0bHY7CiAJdW5zaWduZWQgbG9uZyBwcml2YXRlX3ZhbHVlOwogfTsKQEAgLTY5LDcgKzY5LDcgQEAKIAlzbmRfa2NvbnRyb2xfcHV0X3QgKnB1dDsKIAl1bmlvbiB7CiAJCXNuZF9rY29udHJvbF90bHZfcndfdCAqYzsKLQkJdW5zaWduZWQgaW50ICpwOworCQljb25zdCB1bnNpZ25lZCBpbnQgKnA7CiAJfSB0bHY7CiAJdW5zaWduZWQgbG9uZyBwcml2YXRlX3ZhbHVlOwogCXZvaWQgKnByaXZhdGVfZGF0YTsKQEAgLTEwOCw3ICsxMDgsNiBAQAogCiB2b2lkIHNuZF9jdGxfbm90aWZ5KHN0cnVjdCBzbmRfY2FyZCAqIGNhcmQsIHVuc2lnbmVkIGludCBtYXNrLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkICogaWQpOwogCi1zdHJ1Y3Qgc25kX2tjb250cm9sICpzbmRfY3RsX25ldyhzdHJ1Y3Qgc25kX2tjb250cm9sICoga2NvbnRyb2wsIHVuc2lnbmVkIGludCBhY2Nlc3MpOwogc3RydWN0IHNuZF9rY29udHJvbCAqc25kX2N0bF9uZXcxKGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICoga2NvbnRyb2xuZXcsIHZvaWQgKiBwcml2YXRlX2RhdGEpOwogdm9pZCBzbmRfY3RsX2ZyZWVfb25lKHN0cnVjdCBzbmRfa2NvbnRyb2wgKiBrY29udHJvbCk7CiBpbnQgc25kX2N0bF9hZGQoc3RydWN0IHNuZF9jYXJkICogY2FyZCwgc3RydWN0IHNuZF9rY29udHJvbCAqIGtjb250cm9sKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29yZS5oIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKaW5kZXggNTIxZjAzNi4uNGI5ZTYwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9jb3JlLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKQEAgLTIxMSw5ICsyMTEsNDAgQEAKIAogdm9pZCBzbmRfcmVxdWVzdF9jYXJkKGludCBjYXJkKTsKIAotaW50IHNuZF9yZWdpc3Rlcl9kZXZpY2UoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldiwKLQkJCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZfb3BzLCB2b2lkICpwcml2YXRlX2RhdGEsCi0JCQljb25zdCBjaGFyICpuYW1lKTsKK2ludCBzbmRfcmVnaXN0ZXJfZGV2aWNlX2Zvcl9kZXYoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKKwkJCQlpbnQgZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZfb3BzLAorCQkJCXZvaWQgKnByaXZhdGVfZGF0YSwKKwkJCQljb25zdCBjaGFyICpuYW1lLAorCQkJCXN0cnVjdCBkZXZpY2UgKmRldmljZSk7CisKKy8qKgorICogc25kX3JlZ2lzdGVyX2RldmljZSAtIFJlZ2lzdGVyIHRoZSBBTFNBIGRldmljZSBmaWxlIGZvciB0aGUgY2FyZAorICogQHR5cGU6IHRoZSBkZXZpY2UgdHlwZSwgU05EUlZfREVWSUNFX1RZUEVfWFhYCisgKiBAY2FyZDogdGhlIGNhcmQgaW5zdGFuY2UKKyAqIEBkZXY6IHRoZSBkZXZpY2UgaW5kZXgKKyAqIEBmX29wczogdGhlIGZpbGUgb3BlcmF0aW9ucworICogQHByaXZhdGVfZGF0YTogdXNlciBwb2ludGVyIGZvciBmX29wcy0+b3BlbigpCisgKiBAbmFtZTogdGhlIGRldmljZSBmaWxlIG5hbWUKKyAqCisgKiBSZWdpc3RlcnMgYW4gQUxTQSBkZXZpY2UgZmlsZSBmb3IgdGhlIGdpdmVuIGNhcmQuCisgKiBUaGUgb3BlcmF0b3JzIGhhdmUgdG8gYmUgc2V0IGluIHJlZyBwYXJhbWV0ZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBjYXJkJ3MgZGV2aWNlIHBvaW50ZXIgdG8gbGluayB0byB0aGUKKyAqIGNvcnJlY3QgJnN0cnVjdCBkZXZpY2UuCisgKgorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW5saW5lIGludCBzbmRfcmVnaXN0ZXJfZGV2aWNlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZl9vcHMsCisJCQkJICAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIHNuZF9yZWdpc3Rlcl9kZXZpY2VfZm9yX2Rldih0eXBlLCBjYXJkLCBkZXYsIGZfb3BzLAorCQkJCQkgICBwcml2YXRlX2RhdGEsIG5hbWUsCisJCQkJCSAgIHNuZF9jYXJkX2dldF9kZXZpY2VfbGluayhjYXJkKSk7Cit9CisKIGludCBzbmRfdW5yZWdpc3Rlcl9kZXZpY2UoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldik7CiB2b2lkICpzbmRfbG9va3VwX21pbm9yX2RhdGEodW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdHlwZSk7CiBpbnQgc25kX2FkZF9kZXZpY2Vfc3lzZnNfZmlsZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2LApAQCAtMzk2LDYgKzQyNywyOSBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2luY2x1ZGUgInR5cGVkZWZzLmgiCisvKiBQQ0kgcXVpcmsgbGlzdCBoZWxwZXIgKi8KK3N0cnVjdCBzbmRfcGNpX3F1aXJrIHsKKwl1bnNpZ25lZCBzaG9ydCBzdWJ2ZW5kb3I7CS8qIFBDSSBzdWJ2ZW5kb3IgSUQgKi8KKwl1bnNpZ25lZCBzaG9ydCBzdWJkZXZpY2U7CS8qIFBDSSBzdWJkZXZpY2UgSUQgKi8KKwlpbnQgdmFsdWU7CQkJLyogdmFsdWUgKi8KKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHX0RFVEVDVAorCWNvbnN0IGNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIHRoZSBkZXZpY2UgKG9wdGlvbmFsKSAqLworI2VuZGlmCit9OworCisjZGVmaW5lIF9TTkRfUENJX1FVSVJLX0lEKHZlbmQsZGV2KSBcCisJLnN1YnZlbmRvciA9ICh2ZW5kKSwgLnN1YmRldmljZSA9IChkZXYpCisjZGVmaW5lIFNORF9QQ0lfUVVJUktfSUQodmVuZCxkZXYpIHtfU05EX1BDSV9RVUlSS19JRCh2ZW5kLCBkZXYpfQorI2lmZGVmIENPTkZJR19TTkRfREVCVUdfREVURUNUCisjZGVmaW5lIFNORF9QQ0lfUVVJUksodmVuZCxkZXYseG5hbWUsdmFsKSBcCisJe19TTkRfUENJX1FVSVJLX0lEKHZlbmQsIGRldiksIC52YWx1ZSA9ICh2YWwpLCAubmFtZSA9ICh4bmFtZSl9CisjZWxzZQorI2RlZmluZSBTTkRfUENJX1FVSVJLKHZlbmQsZGV2LHhuYW1lLHZhbCkgXAorCXtfU05EX1BDSV9RVUlSS19JRCh2ZW5kLCBkZXYpLCAudmFsdWUgPSAodmFsKX0KKyNlbmRpZgorCitjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqCitzbmRfcGNpX3F1aXJrX2xvb2t1cChzdHJ1Y3QgcGNpX2RldiAqcGNpLCBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqbGlzdCk7CisKIAogI2VuZGlmIC8qIF9fU09VTkRfQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2VtdTEwazEuaCBiL2luY2x1ZGUvc291bmQvZW11MTBrMS5oCmluZGV4IDNkM2MxNTEuLmViN2NlOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvZW11MTBrMS5oCisrKyBiL2luY2x1ZGUvc291bmQvZW11MTBrMS5oCkBAIC0xODgsNyArMTg4LDM1IEBACiAjZGVmaW5lIEhDRkdfTEVHQUNZSU5UCQkweDAwMjAwMDAwCS8qIDEgPSBsZWdhY3kgZXZlbnQgY2FwdHVyZWQuIFdyaXRlIDEgdG8gY2xlYXIuCSovCiAJCQkJCQkvKiBOT1RFOiBUaGUgcmVzdCBvZiB0aGUgYml0cyBpbiB0aGlzIHJlZ2lzdGVyCSovCiAJCQkJCQkvKiBfYXJlXyByZWxldmFudCB1bmRlciBMaW51eC4JCQkqLwotI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX01BU0sJMHgwMDA3MDAwMAkvKiBDT0RFQyBmb3JtYXQJCQkJCSovCisjZGVmaW5lIEhDRkdfUFVTSF9CVVRUT05fRU5BQkxFIDB4MDAxMDAwMDAJLyogRW5hYmxlcyBWb2x1bWUgSW5jL0RlYyBhbmQgTXV0ZSBmdW5jdGlvbnMgICAgKi8KKyNkZWZpbmUgSENGR19CQVVEX1JBVEUJCTB4MDAwODAwMDAJLyogMCA9IDQ4a0h6LCAxID0gNDQuMWtIegkJCSovCisjZGVmaW5lIEhDRkdfRVhQQU5ERURfTUVNCTB4MDAwNDAwMDAJLyogMSA9IGFueSAxNk0gb2YgNEcgYWRkciwgMCA9IDMyTSBvZiAyRyBhZGRyCSovCisjZGVmaW5lIEhDRkdfQ09ERUNGT1JNQVRfTUFTSwkweDAwMDMwMDAwCS8qIENPREVDIGZvcm1hdAkJCQkJKi8KKworLyogU3BlY2lmaWMgdG8gQWxpY2UyLCBDQTAxMDIgKi8KKyNkZWZpbmUgSENGR19DT0RFQ0ZPUk1BVF9BQzk3XzEJMHgwMDAwMDAwMAkvKiBBQzk3IENPREVDIGZvcm1hdCAtLSBWZXIgMS4wMwkJKi8KKyNkZWZpbmUgSENGR19DT0RFQ0ZPUk1BVF9BQzk3XzIJMHgwMDAxMDAwMAkvKiBBQzk3IENPREVDIGZvcm1hdCAtLSBWZXIgMi4xCQkJKi8KKyNkZWZpbmUgSENGR19BVVRPTVVURV9BU1lOQwkweDAwMDA4MDAwCS8qIFdoZW4gc2V0LCB0aGUgYXN5bmMgc2FtcGxlIHJhdGUgY29udmVydG9ycwkqLworCQkJCQkJLyogd2lsbCBhdXRvbWF0aWNhbGx5IG11dGUgdGhlaXIgb3V0cHV0IHdoZW4JKi8KKwkJCQkJCS8qIHRoZXkgYXJlIG5vdCByYXRlLWxvY2tlZCB0byB0aGUgZXh0ZXJuYWwJKi8KKwkJCQkJCS8qIGFzeW5jIGF1ZGlvIHNvdXJjZSAgCQkJCSovCisjZGVmaW5lIEhDRkdfQVVUT01VVEVfU1BESUYJMHgwMDAwNDAwMAkvKiBXaGVuIHNldCwgdGhlIGFzeW5jIHNhbXBsZSByYXRlIGNvbnZlcnRvcnMJKi8KKwkJCQkJCS8qIHdpbGwgYXV0b21hdGljYWxseSBtdXRlIHRoZWlyIG91dHB1dCB3aGVuCSovCisJCQkJCQkvKiB0aGUgU1BESUYgVi1iaXQgaW5kaWNhdGVzIGludmFsaWQgYXVkaW8JKi8KKyNkZWZpbmUgSENGR19FTVUzMl9TTEFWRQkweDAwMDAyMDAwCS8qIDAgPSBNYXN0ZXIsIDEgPSBTbGF2ZS4gU2xhdmUgZm9yIEVNVTEwMTAJKi8KKyNkZWZpbmUgSENGR19TTE9XX1JBTVAJCTB4MDAwMDEwMDAJLyogSW5jcmVhc2VzIFNlbmQgU21vb3RoaW5nIHRpbWUgY29uc3RhbnQJKi8KKy8qIDB4MDAwMDA4MDAgbm90IHVzZWQgb24gQWxpY2UyICovCisjZGVmaW5lIEhDRkdfUEhBU0VfVFJBQ0tfTUFTSwkweDAwMDAwNzAwCS8qIFdoZW4gc2V0LCBmb3JjZXMgY29ycmVzcG9uZGluZyBpbnB1dCB0bwkqLworCQkJCQkJLyogcGhhc2UgdHJhY2sgdGhlIHByZXZpb3VzIGlucHV0LgkJKi8KKwkJCQkJCS8qIEkyUzAgY2FuIHBoYXNlIHRyYWNrIHRoZSBsYXN0IFMvUERJRiBpbnB1dAkqLworI2RlZmluZSBIQ0ZHX0kyU19BU1JDX0VOQUJMRQkweDAwMDAwMDcwCS8qIFdoZW4gc2V0LCBlbmFibGVzIGFzeW5jaHJvbm91cyBzYW1wbGUgcmF0ZSAgICovCisJCQkJCQkvKiBjb252ZXJzaW9uIGZvciB0aGUgY29ycmVzcG9uZGluZwkJKi8KKyAJCQkJCQkvKiBJMlMgZm9ybWF0IGlucHV0CQkJCSovCisvKiBSZXN0IG9mIEhDRkcgMHgwMDAwMDAwZiBzYW1lIGFzIGJlbG93LiBMT0NLU09VTkRDQUNIRSBldGMuICAqLworCisKKworLyogT2xkZXIgY2hpcHMgKi8KICNkZWZpbmUgSENGR19DT0RFQ0ZPUk1BVF9BQzk3CTB4MDAwMDAwMDAJLyogQUM5NyBDT0RFQyBmb3JtYXQgLS0gUHJpbWFyeSBPdXRwdXQJCSovCiAjZGVmaW5lIEhDRkdfQ09ERUNGT1JNQVRfSTJTCTB4MDAwMTAwMDAJLyogSTJTIENPREVDIGZvcm1hdCAtLSBTZWNvbmRhcnkgKFJlYXIpIE91dHB1dAkqLwogI2RlZmluZSBIQ0ZHX0dQSU5QVVQwCQkweDAwMDA0MDAwCS8qIEV4dGVybmFsIHBpbjExMgkJCQkqLwpAQCAtNDMyLDYgKzQ2MCw3IEBACiAjZGVmaW5lIEZYUlRfQ0hBTk5FTEMJCTB4MGYwMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgQwkqLwogI2RlZmluZSBGWFJUX0NIQU5ORUxECQkweGYwMDAwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEQJKi8KIAorI2RlZmluZSBBX0hSCQkJMHgwYgkvKiBIaWdoIFJlc29sdXRpb24uIDI0Yml0IHBsYXliYWNrIGZyb20gaG9zdCB0byBEU1AuICovCiAjZGVmaW5lIE1BUEEJCQkweDBjCQkvKiBDYWNoZSBtYXAgQQkJCQkJCSovCiAKICNkZWZpbmUgTUFQQgkJCTB4MGQJCS8qIENhY2hlIG1hcCBCCQkJCQkJKi8KQEAgLTQzOSw2ICs0NjgsOCBAQAogI2RlZmluZSBNQVBfUFRFX01BU0sJCTB4ZmZmZmUwMDAJLyogVGhlIDE5IE1TQnMgb2YgdGhlIFBURSBpbmRleGVkIGJ5IHRoZSBQVEkJCSovCiAjZGVmaW5lIE1BUF9QVElfTUFTSwkJMHgwMDAwMWZmZgkvKiBUaGUgMTMgYml0IGluZGV4IHRvIG9uZSBvZiB0aGUgODE5MiBQVEUgZHdvcmRzICAgICAgCSovCiAKKy8qIDB4MGUsIDB4MGY6IE5vdCB1c2VkICovCisKICNkZWZpbmUgRU5WVk9MCQkJMHgxMAkJLyogVm9sdW1lIGVudmVsb3BlIHJlZ2lzdGVyCQkJCSovCiAjZGVmaW5lIEVOVlZPTF9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2Ygdm9sdW1lIGVudmVsb3BlIHN0YXRlIHZhcmlhYmxlCSovICAKIAkJCQkJCS8qIDB4ODAwMC1uID09IDY2NipuIHVzZWMgZGVsYXkJICAgICAgIAkJCSovCkBAIC01MjcsNyArNTU4LDcgQEAKIAkJCQkJCS8qIE5PVEU6IEFsbCBjaGFubmVscyBjb250YWluIGludGVybmFsIHZhcmlhYmxlczsgZG8JKi8KIAkJCQkJCS8qIG5vdCB3cml0ZSB0byB0aGVzZSBsb2NhdGlvbnMuCQkJKi8KIAotLyogMWYgc29tZXRoaW5nICovCisvKiAweDFmOiBub3QgdXNlZCAqLwogCiAjZGVmaW5lIENEMAkJCTB4MjAJCS8qIENhY2hlIGRhdGEgMCByZWdpc3RlcgkJCQkqLwogI2RlZmluZSBDRDEJCQkweDIxCQkvKiBDYWNoZSBkYXRhIDEgcmVnaXN0ZXIJCQkJKi8KQEAgLTU5Nyw2ICs2MjgsOCBAQAogI2RlZmluZSBGWFdDX1NQRElGTEVGVCAgICAgICAgICAoMTw8MjIpCQkvKiAweDAwNDAwMDAwICovCiAjZGVmaW5lIEZYV0NfU1BESUZSSUdIVCAgICAgICAgICgxPDwyMykJCS8qIDB4MDA4MDAwMDAgKi8KIAorI2RlZmluZSBBX1RCTFNaCWAJCTB4NDMJLyogRWZmZWN0cyBUYW5rIEludGVybmFsIFRhYmxlIFNpemUuIE9ubHkgbG93IGJ5dGUgb3IgcmVnaXN0ZXIgdXNlZCAqLworCiAjZGVmaW5lIFRDQlMJCQkweDQ0CQkvKiBUYW5rIGNhY2hlIGJ1ZmZlciBzaXplIHJlZ2lzdGVyCQkJKi8KICNkZWZpbmUgVENCU19NQVNLCQkweDAwMDAwMDA3CS8qIFRhbmsgY2FjaGUgYnVmZmVyIHNpemUgZmllbGQJCQkJKi8KICNkZWZpbmUgVENCU19CVUZGU0laRV8xNksJMHgwMDAwMDAwMApAQCAtNjE3LDcgKzY1MCw3IEBACiAjZGVmaW5lIEZYQkEJCQkweDQ3CQkvKiBGWCBCdWZmZXIgQWRkcmVzcyAqLwogI2RlZmluZSBGWEJBX01BU0sJCTB4ZmZmZmYwMDAJLyogMjAgYml0IGJhc2UgYWRkcmVzcwkJCQkJKi8KIAotLyogMHg0OCBzb21ldGhpbmcgLSB3b3JkIGFjY2VzcywgZGVmYXVsdHMgdG8gM2YgKi8KKyNkZWZpbmUgQV9IV00JCQkweDQ4CS8qIEhpZ2ggUENJIFdhdGVyIE1hcmsgLSB3b3JkIGFjY2VzcywgZGVmYXVsdHMgdG8gM2YgKi8KIAogI2RlZmluZSBNSUNCUwkJCTB4NDkJCS8qIE1pY3JvcGhvbmUgYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkqLwogCkBAIC02NjEsNiArNjk0LDE4IEBACiAjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNTczNDQJMHgwMDAwMDAxZQogI2RlZmluZSBBRENCU19CVUZTSVpFXzY1NTM2CTB4MDAwMDAwMWYKIAorLyogQ3VycmVudCBTZW5kIEIsIEEgQW1vdW50cyAqLworI2RlZmluZSBBX0NTQkEJCQkweDRjCisKKy8qIEN1cnJlbnQgU2VuZCBELCBDIEFtb3VudHMgKi8KKyNkZWZpbmUgQV9DU0RDCQkJMHg0ZAorCisvKiBDdXJyZW50IFNlbmQgRiwgRSBBbW91bnRzICovCisjZGVmaW5lIEFfQ1NGRQkJCTB4NGUKKworLyogQ3VycmVudCBTZW5kIEgsIEcgQW1vdW50cyAqLworI2RlZmluZSBBX0NTSEcJCQkweDRmCisKIAogI2RlZmluZSBDRENTCQkJMHg1MAkJLyogQ0QtUk9NIGRpZ2l0YWwgY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXIJKi8KIApAQCAtNjY4LDYgKzcxMyw5IEBACiAKICNkZWZpbmUgREJHCQkJMHg1MgkJLyogRE8gTk9UIFBST0dSQU0gVEhJUyBSRUdJU1RFUiEhISBNQVkgREVTVFJPWSBDSElQICovCiAKKy8qIFMvUERJRiBJbnB1dCBDIENoYW5uZWwgU3RhdHVzICovCisjZGVmaW5lIEFfU1BTQwkJCTB4NTIKKwogI2RlZmluZSBSRUc1MwkJCTB4NTMJCS8qIERPIE5PVCBQUk9HUkFNIFRISVMgUkVHSVNURVIhISEgTUFZIERFU1RST1kgQ0hJUCAqLwogCiAjZGVmaW5lIEFfREJHCQkJIDB4NTMKQEAgLTcwOCw2ICs3NTYsOCBAQAogI2RlZmluZSBTUENTX05PVEFVRElPREFUQQkweDAwMDAwMDAyCS8qIDAgPSBEaWdpdGFsIGF1ZGlvLCAxID0gbm90IGF1ZGlvCQkqLwogI2RlZmluZSBTUENTX1BST0ZFU1NJT05BTAkweDAwMDAwMDAxCS8qIDAgPSBDb25zdW1lciAoSUVDLTk1OCksIDEgPSBwcm8gKEFFUzMtMTk5MikJKi8KIAorLyogMHg1NzogTm90IHVzZWQgKi8KKwogLyogVGhlIDMyLWJpdCBDTEl4IGFuZCBTT0x4IHJlZ2lzdGVycyBhbGwgaGF2ZSBvbmUgYml0IHBlciBjaGFubmVsIGNvbnRyb2wvc3RhdHVzICAgICAgCQkqLwogI2RlZmluZSBDTElFTAkJCTB4NTgJCS8qIENoYW5uZWwgbG9vcCBpbnRlcnJ1cHQgZW5hYmxlIGxvdyByZWdpc3RlcgkqLwogCkBAIC03MzMsNiArNzgzLDkgQEAKICNkZWZpbmUgQUM5N1NMT1RfQ05UUgkJMHgxMCAgICAgICAgICAgIC8qIENlbnRlciBlbmFibGUgKi8KICNkZWZpbmUgQUM5N1NMT1RfTEZFCQkweDIwICAgICAgICAgICAgLyogTEZFIGVuYWJsZSAqLwogCisvKiBQQ0IgUmV2aXNpb24gKi8KKyNkZWZpbmUgQV9QQ0IJCQkweDVmCisKIC8vIE5PVEU6IDB4NjAsNjEsNjI6IDY0LWJpdAogI2RlZmluZSBDRFNSQ1MJCQkweDYwCQkvKiBDRC1ST00gU2FtcGxlIFJhdGUgQ29udmVydGVyIHN0YXR1cyByZWdpc3RlcgkqLwogCkBAIC03ODAsOSArODMzLDE4IEBACiAKICNkZWZpbmUgSExJUEgJCQkweDY5CQkvKiBDaGFubmVsIGhhbGYgbG9vcCBpbnRlcnJ1cHQgcGVuZGluZyBoaWdoIHJlZ2lzdGVyCSovCiAKLS8vIDB4NmEsNmIsNmMgdXNlZCBmb3Igc29tZSByZWNvcmRpbmcKLS8vIDB4NmQgdW51c2VkCi0vLyAweDZlLDZmIC0gdGFua3RhYmxlIGJhc2UgLyBvZmZzZXQKKy8qIFMvUERJRiBIb3N0IFJlY29yZCBJbmRleCAoYnlwYXNzZXMgU1JDKSAqLworI2RlZmluZSBBX1NQUkkJCQkweDZhCisvKiBTL1BESUYgSG9zdCBSZWNvcmQgQWRkcmVzcyAqLworI2RlZmluZSBBX1NQUkEJCQkweDZiCisvKiBTL1BESUYgSG9zdCBSZWNvcmQgQ29udHJvbCAqLworI2RlZmluZSBBX1NQUkMJCQkweDZjCisvKiBEZWxheWVkIEludGVycnVwdCBDb3VudGVyICYgRW5hYmxlICovCisjZGVmaW5lIEFfRElDRQkJCTB4NmQKKy8qIFRhbmsgVGFibGUgQmFzZSAqLworI2RlZmluZSBBX1RUQgkJCTB4NmUKKy8qIFRhbmsgRGVsYXkgT2Zmc2V0ICovCisjZGVmaW5lIEFfVERPRgkJCTB4NmYKIAogLyogVGhpcyBpcyB0aGUgTVBVIHBvcnQgb24gdGhlIGNhcmQgKHZpYSB0aGUgZ2FtZSBwb3J0KQkJCQkJCSovCiAjZGVmaW5lIEFfTVVEQVRBMQkJMHg3MApAQCAtODAwLDYgKzg2Miw3IEBACiAjZGVmaW5lIEFfRlhXQzEJCQkweDc0ICAgICAgICAgICAgLyogU2VsZWN0cyAweDdmLTB4NjAgZm9yIEZYIHJlY29yZGluZyAgICAgICAgICAgKi8KICNkZWZpbmUgQV9GWFdDMgkJCTB4NzUJCS8qIFNlbGVjdHMgMHg5Zi0weDgwIGZvciBGWCByZWNvcmRpbmcgICAgICAgICAgICovCiAKKy8qIEV4dGVuZGVkIEhhcmR3YXJlIENvbnRyb2wgKi8KICNkZWZpbmUgQV9TUERJRl9TQU1QTEVSQVRFCTB4NzYJCS8qIFNldCB0aGUgc2FtcGxlIHJhdGUgb2YgU1BESUYgb3V0cHV0CQkqLwogI2RlZmluZSBBX1NBTVBMRV9SQVRFCQkweDc2CQkvKiBWYXJpb3VzIHNhbXBsZSByYXRlIHNldHRpbmdzLiAqLwogI2RlZmluZSBBX1NBTVBMRV9SQVRFX05PVF9VU0VEICAweDBmZmMxMTFlCS8qIEJpdHMgdGhhdCBhcmUgbm90IHVzZWQgYW5kIGNhbm5vdCBiZSBzZXQuIAkqLwpAQCAtODIyLDggKzg4NSwyMCBAQAogI2RlZmluZSBBX1BDTV85NjAwMAkJMHgwMDAwNDAwMAogI2RlZmluZSBBX1BDTV80NDEwMAkJMHgwMDAwODAwMAogCi0vKiAweDc3LDB4NzgsMHg3OSAic29tZXRoaW5nIGkycy1yZWxhdGVkIiAtIGRlZmF1bHQgdG8gMHgwMTA4MDAwMCBvbiBteSBhdWRpZ3kgMiBaUyAtLXJscmV2ZWxsCSovCi0vKiAweDdhLCAweDdiIC0gbG9va3VwIHRhYmxlcyAqLworLyogSTJTMCBTYW1wbGUgUmF0ZSBUcmFja2VyIFN0YXR1cyAqLworI2RlZmluZSBBX1NSVDMJCQkweDc3CisKKy8qIEkyUzEgU2FtcGxlIFJhdGUgVHJhY2tlciBTdGF0dXMgKi8KKyNkZWZpbmUgQV9TUlQ0CQkJMHg3OAorCisvKiBJMlMyIFNhbXBsZSBSYXRlIFRyYWNrZXIgU3RhdHVzICovCisjZGVmaW5lIEFfU1JUNQkJCTB4NzkKKy8qIC0gZGVmYXVsdCB0byAweDAxMDgwMDAwIG9uIG15IGF1ZGlneSAyIFpTIC0tcmxyZXZlbGwJKi8KKworLyogVGFuayBUYWJsZSBETUEgQWRkcmVzcyAqLworI2RlZmluZSBBX1RUREEJCQkweDdhCisvKiBUYW5rIFRhYmxlIERNQSBEYXRhICovCisjZGVmaW5lIEFfVFRERAkJCTB4N2IKIAogI2RlZmluZSBBX0ZYUlQyCQkJMHg3YwogI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEUJCTB4MDAwMDAwM2YJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRQkqLwpAQCAtODQ1LDcgKzkyMCw3IEBACiAjZGVmaW5lIEFfRlhSVF9DSEFOTkVMQwkJMHgwMDNmMDAwMAogI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEQJCTB4M2YwMDAwMDAKIAotCisvKiAweDdmOiBOb3QgdXNlZCAqLwogLyogRWFjaCBGWCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaXMgMzIgYml0cyBpbiBsZW5ndGgsIGFsbCBiaXRzIGFyZSB1c2VkCQkJKi8KICNkZWZpbmUgRlhHUFJFR0JBU0UJCTB4MTAwCQkvKiBGWCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIGJhc2UgICAgICAgCSovCiAjZGVmaW5lIEFfRlhHUFJFR0JBU0UJCTB4NDAwCQkvKiBBdWRpZ3kgR1BScywgMHg0MDAgdG8gMHg1ZmYJCQkqLwpAQCAtODg2LDYgKzk2MSwyOTMgQEAKICNkZWZpbmUgQV9ISVdPUkRfUkVTVUxUX01BU0sJMHgwMDdmZjAwMAogI2RlZmluZSBBX0hJV09SRF9PUEFfTUFTSwkweDAwMDAwN2ZmCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFTVUxMDEwbSBIQU5BIEZQR0EgcmVnaXN0ZXJzCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEVNVV9IQU5BX0RFU1RISQkJMHgwMAkvKiAwMDAweHh4ICAzIGJpdHMgTGluayBEZXN0aW5hdGlvbiAqLworI2RlZmluZSBFTVVfSEFOQV9ERVNUTE8JCTB4MDEJLyogMDB4eHh4eCAgNSBiaXRzICovCisjZGVmaW5lIEVNVV9IQU5BX1NSQ0hJCQkweDAyCS8qIDAwMDB4eHggIDMgYml0cyBMaW5rIFNvdXJjZSAqLworI2RlZmluZSBFTVVfSEFOQV9TUkNMTwkJMHgwMwkvKiAwMHh4eHh4ICA1IGJpdHMgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19QV1IJMHgwNAkvKiAwMDAwMDB4ICAxIGJpdHMgQXVkaW8gRG9jayBwb3dlciAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX1BXUl9PTgkJMHgwMSAvKiBBdWRpbyBEb2NrIHBvd2VyIG9uICovCisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DSwkJMHgwNQkvKiAwMDAweHh4ICAzIGJpdHMgV29yZCBDbG9jayBzb3VyY2Ugc2VsZWN0ICAqLworCQkJCQkvKiBNdXN0IGJlIHdyaXR0ZW4gYWZ0ZXIgcG93ZXIgb24gdG8gcmVzZXQgRExMICovCisJCQkJCS8qIE9uZSBpcyB1bmFibGUgdG8gZGV0ZWN0IHRoZSBBdWRpbyBkb2NrIHdpdGhvdXQgdGhpcyAqLworI2RlZmluZSBFTVVfSEFOQV9XQ0xPQ0tfU1JDX01BU0sJMHgwNworI2RlZmluZSBFTVVfSEFOQV9XQ0xPQ0tfSU5UXzQ4SwkJMHgwMAorI2RlZmluZSBFTVVfSEFOQV9XQ0xPQ0tfSU5UXzQ0XzFLCTB4MDEKKyNkZWZpbmUgRU1VX0hBTkFfV0NMT0NLX0hBTkFfU1BESUZfSU4JMHgwMgorI2RlZmluZSBFTVVfSEFOQV9XQ0xPQ0tfSEFOQV9BREFUX0lOCTB4MDMKKyNkZWZpbmUgRU1VX0hBTkFfV0NMT0NLX1NZTkNfQk5DTgkweDA0CisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DS18yTkRfSEFOQQkweDA1CisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DS19TUkNfUkVTRVJWRUQJMHgwNgorI2RlZmluZSBFTVVfSEFOQV9XQ0xPQ0tfT0ZGCQkweDA3IC8qIEZvciB0ZXN0aW5nLCBmb3JjZXMgZmFsbGJhY2sgdG8gREVGQ0xPQ0sgKi8KKyNkZWZpbmUgRU1VX0hBTkFfV0NMT0NLX01VTFRfTUFTSwkweDE4CisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DS18xWAkJMHgwMAorI2RlZmluZSBFTVVfSEFOQV9XQ0xPQ0tfMlgJCTB4MDgKKyNkZWZpbmUgRU1VX0hBTkFfV0NMT0NLXzRYCQkweDEwCisjZGVmaW5lIEVNVV9IQU5BX1dDTE9DS19NVUxUX1JFU0VSVkVECTB4MTgKKworI2RlZmluZSBFTVVfSEFOQV9ERUZDTE9DSwkweDA2CS8qIDAwMDAwMHggIDEgYml0cyBEZWZhdWx0IFdvcmQgQ2xvY2sgICovCisjZGVmaW5lIEVNVV9IQU5BX0RFRkNMT0NLXzQ4SwkJMHgwMAorI2RlZmluZSBFTVVfSEFOQV9ERUZDTE9DS180NF8xSwkJMHgwMQorCisjZGVmaW5lIEVNVV9IQU5BX1VOTVVURQkJMHgwNwkvKiAwMDAwMDB4ICAxIGJpdHMgTXV0ZSBhbGwgYXVkaW8gb3V0cHV0cyAgKi8KKyNkZWZpbmUgRU1VX01VVEUJCQkweDAwCisjZGVmaW5lIEVNVV9VTk1VVEUJCQkweDAxCisKKyNkZWZpbmUgRU1VX0hBTkFfRlBHQV9DT05GSUcJMHgwOAkvKiAwMDAwMHh4ICAyIGJpdHMgQ29uZmlnIGNvbnRyb2wgb2YgRlBHQXMgICovCisjZGVmaW5lIEVNVV9IQU5BX0ZQR0FfQ09ORklHX0FVRElPRE9DSwkweDAxIC8qIFNldCBpbiBvcmRlciB0byBwcm9ncmFtIEZQR0Egb24gQXVkaW8gRG9jayAqLworI2RlZmluZSBFTVVfSEFOQV9GUEdBX0NPTkZJR19IQU5BCTB4MDIgLyogU2V0IGluIG9yZGVyIHRvIHByb2dyYW0gRlBHQSBvbiBIYW5hICovCisKKyNkZWZpbmUgRU1VX0hBTkFfSVJRX0VOQUJMRQkweDA5CS8qIDAwMHh4eHggIDQgYml0cyBJUlEgRW5hYmxlICAqLworI2RlZmluZSBFTVVfSEFOQV9JUlFfV0NMS19DSEFOR0VECTB4MDEKKyNkZWZpbmUgRU1VX0hBTkFfSVJRX0FEQVQJCTB4MDIKKyNkZWZpbmUgRU1VX0hBTkFfSVJRX0RPQ0sJCTB4MDQKKyNkZWZpbmUgRU1VX0hBTkFfSVJRX0RPQ0tfTE9TVAkJMHgwOAorCisjZGVmaW5lIEVNVV9IQU5BX1NQRElGX01PREUJMHgwYQkvKiAwMHh4eHh4ICA1IGJpdHMgU1BESUYgTU9ERSAgKi8KKyNkZWZpbmUgRU1VX0hBTkFfU1BESUZfTU9ERV9UWF9DT01TVU1FUgkweDAwCisjZGVmaW5lIEVNVV9IQU5BX1NQRElGX01PREVfVFhfUFJPCTB4MDEKKyNkZWZpbmUgRU1VX0hBTkFfU1BESUZfTU9ERV9UWF9OT0NPUFkJMHgwMgorI2RlZmluZSBFTVVfSEFOQV9TUERJRl9NT0RFX1JYX0NPTVNVTUVSCTB4MDAKKyNkZWZpbmUgRU1VX0hBTkFfU1BESUZfTU9ERV9SWF9QUk8JMHgwNAorI2RlZmluZSBFTVVfSEFOQV9TUERJRl9NT0RFX1JYX05PQ09QWQkweDA4CisjZGVmaW5lIEVNVV9IQU5BX1NQRElGX01PREVfUlhfSU5WQUxJRAkweDEwCisKKyNkZWZpbmUgRU1VX0hBTkFfT1BUSUNBTF9UWVBFCTB4MGIJLyogMDAwMDB4eCAgMiBiaXRzIEFEQVQgb3IgU1BESUYgaW4vb3V0ICAqLworI2RlZmluZSBFTVVfSEFOQV9PUFRJQ0FMX0lOX1NQRElGCTB4MDAKKyNkZWZpbmUgRU1VX0hBTkFfT1BUSUNBTF9JTl9BREFUCTB4MDEKKyNkZWZpbmUgRU1VX0hBTkFfT1BUSUNBTF9PVVRfU1BESUYJMHgwMAorI2RlZmluZSBFTVVfSEFOQV9PUFRJQ0FMX09VVF9BREFUCTB4MDIKKworI2RlZmluZSBFTVVfSEFOQV9NSURJX0lOCQkweDBjCS8qIDAwMDAwMHggIDEgYml0ICBDb250cm9sIE1JREkgICovCisjZGVmaW5lIEVNVV9IQU5BX01JRElfSU5fRlJPTV9IQU1PQQkweDAwIC8qIEhBTU9BIE1JREkgaW4gdG8gQWxpY2UgMiBNSURJIEIgKi8KKyNkZWZpbmUgRU1VX0hBTkFfTUlESV9JTl9GUk9NX0RPQ0sJMHgwMSAvKiBBdWRpbyBEb2NrIE1JREkgaW4gdG8gQWxpY2UgMiBNSURJIEIgKi8KKworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfMQkweDBkCS8qIDAwMHh4eHggIDQgYml0ICBBdWRpbyBEb2NrIExFRHMgICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18xX01JREkxCTB4MDEJLyogTUlESSAxIExFRCBvbiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfMV9NSURJMgkweDAyCS8qIE1JREkgMiBMRUQgb24gKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzFfU01QVEVfSU4JMHgwNAkvKiBTTVBURSBJTiBMRUQgb24gKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzFfU01QVEVfT1VUCTB4MDgJLyogU01QVEUgT1VUIExFRCBvbiAqLworCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18yCTB4MGUJLyogMHh4eHh4eCAgNiBiaXQgIEF1ZGlvIERvY2sgTEVEcyAgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzJfNDRLCTB4MDEJLyogNDQuMSBrSHogTEVEIG9uICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18yXzQ4SwkweDAyCS8qIDQ4IGtIeiBMRUQgb24gKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzJfOTZLCTB4MDQJLyogOTYga0h6IExFRCBvbiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfMl8xOTJLCTB4MDgJLyogMTkyIGtIeiBMRUQgb24gKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzJfTE9DSwkweDEwCS8qIExPQ0sgTEVEIG9uICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18yX0VYVAkweDIwCS8qIEVYVCBMRUQgb24gKi8KKworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfMwkweDBmCS8qIDB4eHh4eHggIDYgYml0ICBBdWRpbyBEb2NrIExFRHMgICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18zX0NMSVBfQQkweDAxCS8qIE1pYyBBIENsaXAgTEVEIG9uICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18zX0NMSVBfQgkweDAyCS8qIE1pYyBCIENsaXAgTEVEIG9uICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTEVEU18zX1NJR05BTF9BCTB4MDQJLyogU2lnbmFsIEEgQ2xpcCBMRUQgb24gKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19MRURTXzNfU0lHTkFMX0IJMHgwOAkvKiBTaWduYWwgQiBDbGlwIExFRCBvbiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfM19NQU5VQUxfQ0xJUAkweDEwCS8qIE1hbnVhbCBDbGlwIGRldGVjdGlvbiAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0xFRFNfM19NQU5VQUxfU0lHTkFMCTB4MjAJLyogTWFudWFsIFNpZ25hbCBkZXRlY3Rpb24gKi8KKworI2RlZmluZSBFTVVfSEFOQV9BRENfUEFEUwkweDEwCS8qIDAwMDB4eHggIDMgYml0ICBBdWRpbyBEb2NrIEFEQyAxNGRCIHBhZHMgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19BRENfUEFEMQkweDAxCS8qIDE0ZEIgQXR0ZW51YXRpb24gb24gQXVkaW8gRG9jayBBREMgMSAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0FEQ19QQUQyCTB4MDIJLyogMTRkQiBBdHRlbnVhdGlvbiBvbiBBdWRpbyBEb2NrIEFEQyAyICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfQURDX1BBRDMJMHgwNAkvKiAxNGRCIEF0dGVudWF0aW9uIG9uIEF1ZGlvIERvY2sgQURDIDMgKi8KKyNkZWZpbmUgRU1VX0hBTkFfMDIwMl9BRENfUEFEMQkweDA4CS8qIDE0ZEIgQXR0ZW51YXRpb24gb24gMDIwMiBBREMgMSAqLworCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfTUlTQwkweDExCS8qIDB4eHh4eHggIDYgYml0ICBBdWRpbyBEb2NrIG1pc2MgYml0cyAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0RBQzFfTVVURQkweDAxCS8qIERBQyAxIE11dGUgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19EQUMyX01VVEUJMHgwMgkvKiBEQUMgMiBNdXRlICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfREFDM19NVVRFCTB4MDQJLyogREFDIDMgTXV0ZSAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0RBQzRfTVVURQkweDA4CS8qIERBQyA0IE11dGUgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19QSE9ORVNfMTkyX0RBQzEJMHgwMAkvKiBEQUMgMSBIZWFkcGhvbmVzIHNvdXJjZSBhdCAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19QSE9ORVNfMTkyX0RBQzIJMHgxMAkvKiBEQUMgMiBIZWFkcGhvbmVzIHNvdXJjZSBhdCAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19QSE9ORVNfMTkyX0RBQzMJMHgyMAkvKiBEQUMgMyBIZWFkcGhvbmVzIHNvdXJjZSBhdCAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19QSE9ORVNfMTkyX0RBQzQJMHgzMAkvKiBEQUMgNCBIZWFkcGhvbmVzIHNvdXJjZSBhdCAxOTJrSHogKi8KKworI2RlZmluZSBFTVVfSEFOQV9NSURJX09VVAkweDEyCS8qIDAweHh4eHggIDUgYml0ICBTb3VyY2UgZm9yIGVhY2ggTUlESSBvdXQgcG9ydCAqLworI2RlZmluZSBFTVVfSEFOQV9NSURJX09VVF8wMjAyCTB4MDEgLyogMDIwMiBNSURJIGZyb20gQWxpY2UgMi4gMCA9IEEsIDEgPSBCICovCisjZGVmaW5lIEVNVV9IQU5BX01JRElfT1VUX0RPQ0sxCTB4MDIgLyogQXVkaW8gRG9jayBNSURJMSBmcm9udCwgZnJvbSBBbGljZSAyLiAwID0gQSwgMSA9IEIgKi8KKyNkZWZpbmUgRU1VX0hBTkFfTUlESV9PVVRfRE9DSzIJMHgwNCAvKiBBdWRpbyBEb2NrIE1JREkyIHJlYXIsIGZyb20gQWxpY2UgMi4gMCA9IEEsIDEgPSBCICovCisjZGVmaW5lIEVNVV9IQU5BX01JRElfT1VUX1NZTkMyCTB4MDggLyogU3luYyBjYXJkLiBOb3QgdGhlIGFjdHVhbCBNSURJIG91dCBqYWNrLiAwID0gQSwgMSA9IEIgKi8KKyNkZWZpbmUgRU1VX0hBTkFfTUlESV9PVVRfTE9PUAkweDEwIC8qIDAgPSBiaXRzICgzOjApIG5vcm1hbC4gMSA9IE1JREkgbG9vcGJhY2sgZW5hYmxlZC4gKi8KKworI2RlZmluZSBFTVVfSEFOQV9EQUNfUEFEUwkweDEzCS8qIDAweHh4eHggIDUgYml0ICBEQUMgMTRkQiBhdHRlbnVhdGlvbiBwYWRzICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfREFDX1BBRDEJMHgwMQkvKiAxNGRCIEF0dGVudWF0aW9uIG9uIEF1ZGlvRG9jayBEQUMgMS4gTGVmdCBhbmQgUmlnaHQgKi8KKyNkZWZpbmUgRU1VX0hBTkFfRE9DS19EQUNfUEFEMgkweDAyCS8qIDE0ZEIgQXR0ZW51YXRpb24gb24gQXVkaW9Eb2NrIERBQyAyLiBMZWZ0IGFuZCBSaWdodCAqLworI2RlZmluZSBFTVVfSEFOQV9ET0NLX0RBQ19QQUQzCTB4MDQJLyogMTRkQiBBdHRlbnVhdGlvbiBvbiBBdWRpb0RvY2sgREFDIDMuIExlZnQgYW5kIFJpZ2h0ICovCisjZGVmaW5lIEVNVV9IQU5BX0RPQ0tfREFDX1BBRDQJMHgwOAkvKiAxNGRCIEF0dGVudWF0aW9uIG9uIEF1ZGlvRG9jayBEQUMgNC4gTGVmdCBhbmQgUmlnaHQgKi8KKyNkZWZpbmUgRU1VX0hBTkFfMDIwMl9EQUNfUEFEMQkweDEwCS8qIDE0ZEIgQXR0ZW51YXRpb24gb24gMDIwMiBEQUMgMS4gTGVmdCBhbmQgUmlnaHQgKi8KKworLyogMHgxNCAtIDB4MWYgVW51c2VkIFIvVyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRU1VX0hBTkFfSVJRX1NUQVRVUwkweDIwCS8qIDAwMHh4eHggIDQgYml0cyBJUlEgU3RhdHVzICAqLworI2lmIDAgIC8qIEFscmVhZHkgZGVmaW5lZCBmb3IgcmVnIDB4MDkgSVJRX0VOQUJMRSAqLworI2RlZmluZSBFTVVfSEFOQV9JUlFfV0NMS19DSEFOR0VECTB4MDEKKyNkZWZpbmUgRU1VX0hBTkFfSVJRX0FEQVQJCTB4MDIKKyNkZWZpbmUgRU1VX0hBTkFfSVJRX0RPQ0sJCTB4MDQKKyNkZWZpbmUgRU1VX0hBTkFfSVJRX0RPQ0tfTE9TVAkJMHgwOAorI2VuZGlmCisKKyNkZWZpbmUgRU1VX0hBTkFfT1BUSU9OX0NBUkRTCTB4MjEJLyogMDAweHh4eCAgNCBiaXRzIFByZXNlbmNlIG9mIG9wdGlvbiBjYXJkcyAqLworI2RlZmluZSBFTVVfSEFOQV9PUFRJT05fSEFNT0EJMHgwMQkvKiBIQU1PQSBjYXJkIHByZXNlbnQgKi8KKyNkZWZpbmUgRU1VX0hBTkFfT1BUSU9OX1NZTkMJMHgwMgkvKiBTeW5jIGNhcmQgcHJlc2VudCAqLworI2RlZmluZSBFTVVfSEFOQV9PUFRJT05fRE9DS19PTkxJTkUJMHgwNAkvKiBBdWRpbyBEb2NrIG9ubGluZSBhbmQgRlBHQSBjb25maWd1cmVkICovCisjZGVmaW5lIEVNVV9IQU5BX09QVElPTl9ET0NLX09GRkxJTkUJMHgwOAkvKiBBdWRpbyBEb2NrIG9ubGluZSBhbmQgRlBHQSBub3QgY29uZmlndXJlZCAqLworCisjZGVmaW5lIEVNVV9IQU5BX0lECQkweDIyCS8qIDEwMTAxMDEgIDcgYml0cyBJRCBieXRlICYgMHg3ZiA9IDB4NTUgKi8KKworI2RlZmluZSBFTVVfSEFOQV9NQUpPUl9SRVYJMHgyMwkvKiAwMDAweHh4ICAzIGJpdCAgSGFuYSBGUEdBIE1ham9yIHJldiAqLworI2RlZmluZSBFTVVfSEFOQV9NSU5PUl9SRVYJMHgyNAkvKiAwMDAweHh4ICAzIGJpdCAgSGFuYSBGUEdBIE1pbm9yIHJldiAqLworCisjZGVmaW5lIEVNVV9ET0NLX01BSk9SX1JFVgkweDI1CS8qIDAwMDB4eHggIDMgYml0ICBBdWRpbyBEb2NrIEZQR0EgTWFqb3IgcmV2ICovCisjZGVmaW5lIEVNVV9ET0NLX01JTk9SX1JFVgkweDI2CS8qIDAwMDB4eHggIDMgYml0ICBBdWRpbyBEb2NrIEZQR0EgTWlub3IgcmV2ICovCisKKyNkZWZpbmUgRU1VX0RPQ0tfQk9BUkRfSUQJMHgyNwkvKiAwMDAwMHh4ICAyIGJpdHMgQXVkaW8gRG9jayBJRCBwaW5zICovCisjZGVmaW5lIEVNVV9ET0NLX0JPQVJEX0lEMAkweDAwCS8qIElEIGJpdCAwICovCisjZGVmaW5lIEVNVV9ET0NLX0JPQVJEX0lEMQkweDAzCS8qIElEIGJpdCAxICovCisKKyNkZWZpbmUgRU1VX0hBTkFfV0NfU1BESUZfSEkJMHgyOAkvKiAweHh4eHh4ICA2IGJpdCAgU1BESUYgSU4gV29yZCBjbG9jaywgdXBwZXIgNiBiaXRzICovCisjZGVmaW5lIEVNVV9IQU5BX1dDX1NQRElGX0xPCTB4MjkJLyogMHh4eHh4eCAgNiBiaXQgIFNQRElGIElOIFdvcmQgY2xvY2ssIGxvd2VyIDYgYml0cyAqLworCisjZGVmaW5lIEVNVV9IQU5BX1dDX0FEQVRfSEkJMHgyYQkvKiAweHh4eHh4ICA2IGJpdCAgQURBVCBJTiBXb3JkIGNsb2NrLCB1cHBlciA2IGJpdHMgKi8KKyNkZWZpbmUgRU1VX0hBTkFfV0NfQURBVF9MTwkweDJiCS8qIDB4eHh4eHggIDYgYml0ICBBREFUIElOIFdvcmQgY2xvY2ssIGxvd2VyIDYgYml0cyAqLworCisjZGVmaW5lIEVNVV9IQU5BX1dDX0JOQ19MTwkweDJjCS8qIDB4eHh4eHggIDYgYml0ICBCTkMgSU4gV29yZCBjbG9jaywgbG93ZXIgNiBiaXRzICovCisjZGVmaW5lIEVNVV9IQU5BX1dDX0JOQ19ISQkweDJkCS8qIDB4eHh4eHggIDYgYml0ICBCTkMgSU4gV29yZCBjbG9jaywgdXBwZXIgNiBiaXRzICovCisKKyNkZWZpbmUgRU1VX0hBTkEyX1dDX1NQRElGX0hJCTB4MmUJLyogMHh4eHh4eCAgNiBiaXQgIEhBTkEyIFNQRElGIElOIFdvcmQgY2xvY2ssIHVwcGVyIDYgYml0cyAqLworI2RlZmluZSBFTVVfSEFOQTJfV0NfU1BESUZfTE8JMHgyZgkvKiAweHh4eHh4ICA2IGJpdCAgSEFOQTIgU1BESUYgSU4gV29yZCBjbG9jaywgbG93ZXIgNiBiaXRzICovCisvKiAweDMwIC0gMHgzZiBVbnVzZWQgUmVhZCBvbmx5IHJlZ2lzdGVycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRU1VMTAxMG0gSEFOQSBEZXN0aW5hdGlvbnMJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfMAkweDAwMGYJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfMQkweDAwMDAJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfMgkweDAwMDEJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfMwkweDAwMDIJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfNAkweDAwMDMJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfNQkweDAwMDQJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfNgkweDAwMDUJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfNwkweDAwMDYJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfOAkweDAwMDcJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfOQkweDAwMDgJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfQQkweDAwMDkJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfQgkweDAwMGEJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfQwkweDAwMGIJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfRAkweDAwMGMJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfRQkweDAwMGQJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRTJfRU1VMzJfRgkweDAwMGUJLyogMTYgRU1VMzIgY2hhbm5lbHMgdG8gQWxpY2UyICswIHRvICsweGYgKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzFfTEVGVDEJMHgwMTAwCS8qIEF1ZGlvIERvY2sgREFDMSBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMV9MRUZUMgkweDAxMDEJLyogQXVkaW8gRG9jayBEQUMxIExlZnQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMV9MRUZUMwkweDAxMDIJLyogQXVkaW8gRG9jayBEQUMxIExlZnQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzFfTEVGVDQJMHgwMTAzCS8qIEF1ZGlvIERvY2sgREFDMSBMZWZ0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMxX1JJR0hUMQkweDAxMDQJLyogQXVkaW8gRG9jayBEQUMxIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMV9SSUdIVDIJMHgwMTA1CS8qIEF1ZGlvIERvY2sgREFDMSBSaWdodCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMxX1JJR0hUMwkweDAxMDYJLyogQXVkaW8gRG9jayBEQUMxIFJpZ2h0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMxX1JJR0hUNAkweDAxMDcJLyogQXVkaW8gRG9jayBEQUMxIFJpZ2h0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMyX0xFRlQxCTB4MDEwOAkvKiBBdWRpbyBEb2NrIERBQzIgTGVmdCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzJfTEVGVDIJMHgwMTA5CS8qIEF1ZGlvIERvY2sgREFDMiBMZWZ0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzJfTEVGVDMJMHgwMTBhCS8qIEF1ZGlvIERvY2sgREFDMiBMZWZ0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMyX0xFRlQ0CTB4MDEwYgkvKiBBdWRpbyBEb2NrIERBQzIgTGVmdCwgNHRoIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMl9SSUdIVDEJMHgwMTBjCS8qIEF1ZGlvIERvY2sgREFDMiBSaWdodCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzJfUklHSFQyCTB4MDEwZAkvKiBBdWRpbyBEb2NrIERBQzIgUmlnaHQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMl9SSUdIVDMJMHgwMTBlCS8qIEF1ZGlvIERvY2sgREFDMiBSaWdodCwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDMl9SSUdIVDQJMHgwMTBmCS8qIEF1ZGlvIERvY2sgREFDMiBSaWdodCwgNHRoIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDM19MRUZUMQkweDAxMTAJLyogQXVkaW8gRG9jayBEQUMxIExlZnQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMzX0xFRlQyCTB4MDExMQkvKiBBdWRpbyBEb2NrIERBQzEgTGVmdCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMzX0xFRlQzCTB4MDExMgkvKiBBdWRpbyBEb2NrIERBQzEgTGVmdCwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDM19MRUZUNAkweDAxMTMJLyogQXVkaW8gRG9jayBEQUMxIExlZnQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX1BIT05FU19MRUZUMQkweDAxMTIJLyogQXVkaW8gRG9jayBQSE9ORVMgTGVmdCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX1BIT05FU19MRUZUMgkweDAxMTMJLyogQXVkaW8gRG9jayBQSE9ORVMgTGVmdCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMzX1JJR0hUMQkweDAxMTQJLyogQXVkaW8gRG9jayBEQUMxIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDM19SSUdIVDIJMHgwMTE1CS8qIEF1ZGlvIERvY2sgREFDMSBSaWdodCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMzX1JJR0hUMwkweDAxMTYJLyogQXVkaW8gRG9jayBEQUMxIFJpZ2h0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUMzX1JJR0hUNAkweDAxMTcJLyogQXVkaW8gRG9jayBEQUMxIFJpZ2h0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19QSE9ORVNfUklHSFQxCTB4MDExNgkvKiBBdWRpbyBEb2NrIFBIT05FUyBSaWdodCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX1BIT05FU19SSUdIVDIJMHgwMTE3CS8qIEF1ZGlvIERvY2sgUEhPTkVTIFJpZ2h0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzRfTEVGVDEJMHgwMTE4CS8qIEF1ZGlvIERvY2sgREFDMiBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDNF9MRUZUMgkweDAxMTkJLyogQXVkaW8gRG9jayBEQUMyIExlZnQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDNF9MRUZUMwkweDAxMWEJLyogQXVkaW8gRG9jayBEQUMyIExlZnQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9ET0NLX0RBQzRfTEVGVDQJMHgwMTFiCS8qIEF1ZGlvIERvY2sgREFDMiBMZWZ0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19TUERJRl9MRUZUMQkweDAxMWEJLyogQXVkaW8gRG9jayBTUERJRiBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfU1BESUZfTEVGVDIJMHgwMTFiCS8qIEF1ZGlvIERvY2sgU1BESUYgTGVmdCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUM0X1JJR0hUMQkweDAxMWMJLyogQXVkaW8gRG9jayBEQUMyIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0RPQ0tfREFDNF9SSUdIVDIJMHgwMTFkCS8qIEF1ZGlvIERvY2sgREFDMiBSaWdodCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUM0X1JJR0hUMwkweDAxMWUJLyogQXVkaW8gRG9jayBEQUMyIFJpZ2h0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19EQUM0X1JJR0hUNAkweDAxMWYJLyogQXVkaW8gRG9jayBEQUMyIFJpZ2h0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19TUERJRl9SSUdIVDEJMHgwMTFlCS8qIEF1ZGlvIERvY2sgU1BESUYgUmlnaHQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9EU1RfRE9DS19TUERJRl9SSUdIVDIJMHgwMTFmCS8qIEF1ZGlvIERvY2sgU1BESUYgUmlnaHQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0hBTkFfU1BESUZfTEVGVDEJMHgwMjAwCS8qIEhhbmEgU1BESUYgTGVmdCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX0RTVF9IQU5BX1NQRElGX0xFRlQyCTB4MDIwMgkvKiBIYW5hIFNQRElGIExlZnQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0hBTkFfU1BESUZfUklHSFQxCTB4MDIwMQkvKiBIYW5hIFNQRElGIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0hBTkFfU1BESUZfUklHSFQyCTB4MDIwMwkvKiBIYW5hIFNQRElGIFJpZ2h0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9IQU1PQV9EQUNfTEVGVDEJMHgwMzAwCS8qIEhhbW9hIERBQyBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0hBTU9BX0RBQ19MRUZUMgkweDAzMDIJLyogSGFtb2EgREFDIExlZnQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfRFNUX0hBTU9BX0RBQ19MRUZUMwkweDAzMDQJLyogSGFtb2EgREFDIExlZnQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX0RTVF9IQU1PQV9EQUNfTEVGVDQJMHgwMzA2CS8qIEhhbW9hIERBQyBMZWZ0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfSEFNT0FfREFDX1JJR0hUMQkweDAzMDEJLyogSGFtb2EgREFDIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfRFNUX0hBTU9BX0RBQ19SSUdIVDIJMHgwMzAzCS8qIEhhbW9hIERBQyBSaWdodCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9EU1RfSEFNT0FfREFDX1JJR0hUMwkweDAzMDUJLyogSGFtb2EgREFDIFJpZ2h0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfSEFNT0FfREFDX1JJR0hUNAkweDAzMDcJLyogSGFtb2EgREFDIFJpZ2h0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9EU1RfSEFOQV9BREFUCTB4MDQwMAkvKiBIYW5hIEFEQVQgOCBjaGFubmVsIG91dCArMCB0byArNyAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFX0kyUzBfTEVGVAkJMHgwNTAwCS8qIEFsaWNlMiBJMlMwIExlZnQgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRV9JMlMwX1JJR0hUCTB4MDUwMQkvKiBBbGljZTIgSTJTMCBSaWdodCAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFX0kyUzFfTEVGVAkJMHgwNjAwCS8qIEFsaWNlMiBJMlMxIExlZnQgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRV9JMlMxX1JJR0hUCTB4MDYwMQkvKiBBbGljZTIgSTJTMSBSaWdodCAqLworI2RlZmluZSBFTVVfRFNUX0FMSUNFX0kyUzJfTEVGVAkJMHgwNzAwCS8qIEFsaWNlMiBJMlMyIExlZnQgKi8KKyNkZWZpbmUgRU1VX0RTVF9BTElDRV9JMlMyX1JJR0hUCTB4MDcwMQkvKiBBbGljZTIgSTJTMiBSaWdodCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRU1VMTAxMG0gSEFOQSBTb3VyY2VzCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEVNVV9TUkNfU0lMRU5DRQkJMHgwMDAwCS8qIFNpbGVuY2UgKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX01JQ19BMQkweDAxMDAJLyogQXVkaW8gRG9jayBNaWMgQSwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX01JQ19BMgkweDAxMDEJLyogQXVkaW8gRG9jayBNaWMgQSwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19NSUNfQTMJMHgwMTAyCS8qIEF1ZGlvIERvY2sgTWljIEEsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX01JQ19BNAkweDAxMDMJLyogQXVkaW8gRG9jayBNaWMgQSwgNHRoIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfTUlDX0IxCTB4MDEwNAkvKiBBdWRpbyBEb2NrIE1pYyBCLCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfTUlDX0IyCTB4MDEwNQkvKiBBdWRpbyBEb2NrIE1pYyBCLCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX01JQ19CMwkweDAxMDYJLyogQXVkaW8gRG9jayBNaWMgQiwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfTUlDX0I0CTB4MDEwNwkvKiBBdWRpbyBEb2NrIE1pYyBCLCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMxX0xFRlQxCTB4MDEwOAkvKiBBdWRpbyBEb2NrIEFEQzEgTGVmdCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzFfTEVGVDIJMHgwMTA5CS8qIEF1ZGlvIERvY2sgQURDMSBMZWZ0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzFfTEVGVDMJMHgwMTBhCS8qIEF1ZGlvIERvY2sgQURDMSBMZWZ0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMxX0xFRlQ0CTB4MDEwYgkvKiBBdWRpbyBEb2NrIEFEQzEgTGVmdCwgNHRoIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMV9SSUdIVDEJMHgwMTBjCS8qIEF1ZGlvIERvY2sgQURDMSBSaWdodCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzFfUklHSFQyCTB4MDEwZAkvKiBBdWRpbyBEb2NrIEFEQzEgUmlnaHQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMV9SSUdIVDMJMHgwMTBlCS8qIEF1ZGlvIERvY2sgQURDMSBSaWdodCwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMV9SSUdIVDQJMHgwMTBmCS8qIEF1ZGlvIERvY2sgQURDMSBSaWdodCwgNHRoIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMl9MRUZUMQkweDAxMTAJLyogQXVkaW8gRG9jayBBREMyIExlZnQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMyX0xFRlQyCTB4MDExMQkvKiBBdWRpbyBEb2NrIEFEQzIgTGVmdCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMyX0xFRlQzCTB4MDExMgkvKiBBdWRpbyBEb2NrIEFEQzIgTGVmdCwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDMl9MRUZUNAkweDAxMTMJLyogQXVkaW8gRG9jayBBREMyIExlZnQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzJfUklHSFQxCTB4MDExNAkvKiBBdWRpbyBEb2NrIEFEQzIgUmlnaHQsIDFzdCBvciA0OGtIeiBvbmx5ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMyX1JJR0hUMgkweDAxMTUJLyogQXVkaW8gRG9jayBBREMyIFJpZ2h0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzJfUklHSFQzCTB4MDExNgkvKiBBdWRpbyBEb2NrIEFEQzIgUmlnaHQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzJfUklHSFQ0CTB4MDExNwkvKiBBdWRpbyBEb2NrIEFEQzIgUmlnaHQsIDR0aCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzNfTEVGVDEJMHgwMTE4CS8qIEF1ZGlvIERvY2sgQURDMyBMZWZ0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDM19MRUZUMgkweDAxMTkJLyogQXVkaW8gRG9jayBBREMzIExlZnQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDM19MRUZUMwkweDAxMWEJLyogQXVkaW8gRG9jayBBREMzIExlZnQsIDNyZCBvciAxOTJrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19ET0NLX0FEQzNfTEVGVDQJMHgwMTFiCS8qIEF1ZGlvIERvY2sgQURDMyBMZWZ0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMzX1JJR0hUMQkweDAxMWMJLyogQXVkaW8gRG9jayBBREMzIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfU1JDX0RPQ0tfQURDM19SSUdIVDIJMHgwMTFkCS8qIEF1ZGlvIERvY2sgQURDMyBSaWdodCwgMm5kIG9yIDk2a0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMzX1JJR0hUMwkweDAxMWUJLyogQXVkaW8gRG9jayBBREMzIFJpZ2h0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfRE9DS19BREMzX1JJR0hUNAkweDAxMWYJLyogQXVkaW8gRG9jayBBREMzIFJpZ2h0LCA0dGggb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfSEFNT0FfQURDX0xFRlQxCTB4MDIwMAkvKiBIYW1vYSBBREMgTGVmdCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX1NSQ19IQU1PQV9BRENfTEVGVDIJMHgwMjAyCS8qIEhhbW9hIEFEQyBMZWZ0LCAybmQgb3IgOTZrSHogKi8KKyNkZWZpbmUgRU1VX1NSQ19IQU1PQV9BRENfTEVGVDMJMHgwMjA0CS8qIEhhbW9hIEFEQyBMZWZ0LCAzcmQgb3IgMTkya0h6ICovCisjZGVmaW5lIEVNVV9TUkNfSEFNT0FfQURDX0xFRlQ0CTB4MDIwNgkvKiBIYW1vYSBBREMgTGVmdCwgNHRoIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0hBTU9BX0FEQ19SSUdIVDEJMHgwMjAxCS8qIEhhbW9hIEFEQyBSaWdodCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX1NSQ19IQU1PQV9BRENfUklHSFQyCTB4MDIwMwkvKiBIYW1vYSBBREMgUmlnaHQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0hBTU9BX0FEQ19SSUdIVDMJMHgwMjA1CS8qIEhhbW9hIEFEQyBSaWdodCwgM3JkIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0hBTU9BX0FEQ19SSUdIVDQJMHgwMjA3CS8qIEhhbW9hIEFEQyBSaWdodCwgNHRoIG9yIDE5MmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0FMSUNFX0VNVTMyQQkJMHgwMzAwCS8qIEFsaWNlMiBFTVUzMmEgMTYgb3V0cHV0cy4gKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfU1JDX0FMSUNFX0VNVTMyQgkJMHgwMzEwCS8qIEFsaWNlMiBFTVUzMmIgMTYgb3V0cHV0cy4gKzAgdG8gKzB4ZiAqLworI2RlZmluZSBFTVVfU1JDX0hBTkFfQURBVAkweDA0MDAJLyogSGFuYSBBREFUIDggY2hhbm5lbCBpbiArMCB0byArNyAqLworI2RlZmluZSBFTVVfU1JDX0hBTkFfU1BESUZfTEVGVDEJMHgwNTAwCS8qIEhhbmEgU1BESUYgTGVmdCwgMXN0IG9yIDQ4a0h6IG9ubHkgKi8KKyNkZWZpbmUgRU1VX1NSQ19IQU5BX1NQRElGX0xFRlQyCTB4MDUwMgkvKiBIYW5hIFNQRElGIExlZnQsIDJuZCBvciA5NmtIeiAqLworI2RlZmluZSBFTVVfU1JDX0hBTkFfU1BESUZfUklHSFQxCTB4MDUwMQkvKiBIYW5hIFNQRElGIFJpZ2h0LCAxc3Qgb3IgNDhrSHogb25seSAqLworI2RlZmluZSBFTVVfU1JDX0hBTkFfU1BESUZfUklHSFQyCTB4MDUwMwkvKiBIYW5hIFNQRElGIFJpZ2h0LCAybmQgb3IgOTZrSHogKi8KKy8qIDB4NjAwIGFuZCAweDcwMCBubyB1c2VkICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gU1RSVUNUVVJFUyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0xMDYzLDcgKzE0MjUsNyBAQAogCXVuc2lnbmVkIGNoYXIgc3BkaWZfYnVnOyAgICAvKiBIYXMgU3BkaWYgcGhhc2luZyBidWcgKi8KIAl1bnNpZ25lZCBjaGFyIGFjOTdfY2hpcDsgICAgLyogSGFzIGFuIEFDOTcgY2hpcDogMSA9IG1hbmRhdG9yeSwgMiA9IG9wdGlvbmFsICovCiAJdW5zaWduZWQgY2hhciBlY2FyZDsgICAgICAgIC8qIEFQUyBFRVBST00gKi8KLQl1bnNpZ25lZCBjaGFyIGVtdTEyMTJtOyAgICAgLyogRU1VIDEyMTJtIGNhcmQgKi8KKwl1bnNpZ25lZCBjaGFyIGVtdTEwMTA7ICAgICAvKiBFTVUgMTAxMG0gY2FyZCAqLwogCXVuc2lnbmVkIGNoYXIgc3BpX2RhYzsgICAgICAvKiBTUEkgaW50ZXJmYWNlIGZvciBEQUMgKi8KIAl1bnNpZ25lZCBjaGFyIGkyY19hZGM7ICAgICAgLyogSTJDIGludGVyZmFjZSBmb3IgQURDICovCiAJdW5zaWduZWQgY2hhciBhZGNfMTM2MXQ7ICAgIC8qIFVzZSBQaGlsaXBzIDEzNjFUIEFEQyAqLwpAQCAtMTA3Miw2ICsxNDM0LDE0IEBACiAJY29uc3QgY2hhciAqaWQ7CQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAtIGNhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQgKi8KIH07CiAKK3N0cnVjdCBzbmRfZW11MTAxMCB7CisJdW5zaWduZWQgaW50IG91dHB1dF9zb3VyY2VbNjRdOworCXVuc2lnbmVkIGludCBpbnB1dF9zb3VyY2VbNjRdOworCXVuc2lnbmVkIGludCBhZGNfcGFkczsgLyogYml0IG1hc2sgKi8KKwl1bnNpZ25lZCBpbnQgZGFjX3BhZHM7IC8qIGJpdCBtYXNrICovCisJdW5zaWduZWQgaW50IGludGVybmFsX2Nsb2NrOyAvKiA0NDEwMCBvciA0ODAwMCAqLworfTsKKwogc3RydWN0IHNuZF9lbXUxMGsxIHsKIAlpbnQgaXJxOwogCkBAIC0xMDc5LDYgKzE0NDksNyBAQAogCXVuc2lnbmVkIGludCB0b3NfbGluazogMSwJCS8qIHRvcyBsaW5rIGRldGVjdGVkICovCiAJCXJlYXJfYWM5NzogMSwJCQkvKiByZWFyIGNoYW5uZWxzIGFyZSBvbiBBQyc5NyAqLwogCQllbmFibGVfaXI6IDE7CisJdW5zaWduZWQgaW50IHN1cHBvcnRfdGx2IDoxOwogCS8qIENvbnRhaW5zIHByb2ZpbGUgb2YgY2FyZCBjYXBhYmlsaXRpZXMgKi8KIAljb25zdCBzdHJ1Y3Qgc25kX2VtdV9jaGlwX2RldGFpbHMgKmNhcmRfY2FwYWJpbGl0aWVzOwogCXVuc2lnbmVkIGludCBhdWRpZ3k7CQkJLyogaXMgQXVkaWd5PyAqLwpAQCAtMTEwNCw2ICsxNDc1LDggQEAKIAlzcGlubG9ja190IG1lbWJsa19sb2NrOwogCiAJdW5zaWduZWQgaW50IHNwZGlmX2JpdHNbM107CQkvKiBzL3BkaWYgb3V0IHNldHVwICovCisJdW5zaWduZWQgaW50IGkyY19jYXB0dXJlX3NvdXJjZTsKKwl1OCBpMmNfY2FwdHVyZV92b2x1bWVbNF1bMl07CiAKIAlzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwIGZ4ODAxMDsJCS8qIEZYODAxMCBpbmZvICovCiAJaW50IGdwcl9iYXNlOwpAQCAtMTEzMiw2ICsxNTA1LDcgQEAKIAlpbnQgcDE2dl9kZXZpY2Vfb2Zmc2V0OwogCXUzMiBwMTZ2X2NhcHR1cmVfc291cmNlOwogCXUzMiBwMTZ2X2NhcHR1cmVfY2hhbm5lbDsKKyAgICAgICAgc3RydWN0IHNuZF9lbXUxMDEwIGVtdTEwMTA7CiAJc3RydWN0IHNuZF9lbXUxMGsxX3BjbV9taXhlciBwY21fbWl4ZXJbMzJdOwogCXN0cnVjdCBzbmRfZW11MTBrMV9wY21fbWl4ZXIgZWZ4X3BjbV9taXhlcltOVU1fRUZYX1BMQVlCQUNLXTsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGxfc2VuZF9yb3V0aW5nOwpAQCAtMTIwOCw2ICsxNTgyLDEwIEBACiB1bnNpZ25lZCBpbnQgc25kX2VtdTEwazFfcHRyMjBfcmVhZChzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCBjaG4pOwogdm9pZCBzbmRfZW11MTBrMV9wdHIyMF93cml0ZShzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IGNobiwgdW5zaWduZWQgaW50IGRhdGEpOwogaW50IHNuZF9lbXUxMGsxX3NwaV93cml0ZShzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIHVuc2lnbmVkIGludCBkYXRhKTsKK2ludCBzbmRfZW11MTBrMV9pMmNfd3JpdGUoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsIHUzMiByZWcsIHUzMiB2YWx1ZSk7CitpbnQgc25kX2VtdTEwMTBfZnBnYV93cml0ZShzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIGludCByZWcsIGludCB2YWx1ZSk7CitpbnQgc25kX2VtdTEwMTBfZnBnYV9yZWFkKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgaW50IHJlZywgaW50ICp2YWx1ZSk7CitpbnQgc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoc3RydWN0IHNuZF9lbXUxMGsxICogZW11LCBpbnQgZHN0LCBpbnQgc3JjKTsKIHVuc2lnbmVkIGludCBzbmRfZW11MTBrMV9lZnhfcmVhZChzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwgdW5zaWduZWQgaW50IHBjKTsKIHZvaWQgc25kX2VtdTEwazFfaW50cl9lbmFibGUoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsIHVuc2lnbmVkIGludCBpbnRyZW5iKTsKIHZvaWQgc25kX2VtdTEwazFfaW50cl9kaXNhYmxlKHN0cnVjdCBzbmRfZW11MTBrMSAqZW11LCB1bnNpZ25lZCBpbnQgaW50cmVuYik7CkBAIC0xNTI0LDExICsxOTAyLDIwIEBACiAJdW5zaWduZWQgaW50IHZhbHVlWzMyXTsJCS8qIGluaXRpYWwgdmFsdWVzICovCiAJdW5zaWduZWQgaW50IG1pbjsJCS8qIG1pbmltdW0gcmFuZ2UgKi8KIAl1bnNpZ25lZCBpbnQgbWF4OwkJLyogbWF4aW11bSByYW5nZSAqLwotCXVuaW9uIHsKLQkJc25kX2tjb250cm9sX3Rsdl9yd190ICpjOwotCQl1bnNpZ25lZCBpbnQgKnA7Ci0JfSB0bHY7CiAJdW5zaWduZWQgaW50IHRyYW5zbGF0aW9uOwkvKiB0cmFuc2xhdGlvbiB0eXBlIChFTVUxMEsxX0dQUl9UUkFOU0xBVElPTiopICovCisJY29uc3QgdW5zaWduZWQgaW50ICp0bHY7Cit9OworCisvKiBvbGQgQUJJIHdpdGhvdXQgVExWIHN1cHBvcnQgKi8KK3N0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9vbGRfZ3ByIHsKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkOworCXVuc2lnbmVkIGludCB2Y291bnQ7CisJdW5zaWduZWQgaW50IGNvdW50OworCXVuc2lnbmVkIHNob3J0IGdwclszMl07CisJdW5zaWduZWQgaW50IHZhbHVlWzMyXTsKKwl1bnNpZ25lZCBpbnQgbWluOworCXVuc2lnbmVkIGludCBtYXg7CisJdW5zaWduZWQgaW50IHRyYW5zbGF0aW9uOwogfTsKIAogc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb2RlIHsKQEAgLTE1NzksNiArMTk2Niw4IEBACiAJdW5zaWduZWQgaW50IHJlczI7CQkvKiByZXNlcnZlZCAqLwogfTsKIAorI2RlZmluZSBTTkRSVl9FTVUxMEsxX1ZFUlNJT04JCVNORFJWX1BST1RPQ09MX1ZFUlNJT04oMSwgMCwgMSkKKwogI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0lORk8JX0lPUiAoJ0gnLCAweDEwLCBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2luZm8pCiAjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfQ09ERV9QT0tFCV9JT1cgKCdIJywgMHgxMSwgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb2RlKQogI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0NPREVfUEVFSwlfSU9XUignSCcsIDB4MTIsIHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29kZSkKQEAgLTE1ODcsNiArMTk3Niw3IEBACiAjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfVFJBTV9QRUVLCV9JT1dSKCdIJywgMHgyMiwgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF90cmFtKQogI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1BDTV9QT0tFCV9JT1cgKCdIJywgMHgzMCwgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9wY21fcmVjKQogI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1BDTV9QRUVLCV9JT1dSKCdIJywgMHgzMSwgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9wY21fcmVjKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1BWRVJTSU9OCV9JT1IgKCdIJywgMHg0MCwgaW50KQogI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1NUT1AJX0lPICAoJ0gnLCAweDgwKQogI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0NPTlRJTlVFCV9JTyAgKCdIJywgMHg4MSkKICNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9aRVJPX1RSQU1fQ09VTlRFUiBfSU8gKCdIJywgMHg4MikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcGNtLmggYi9pbmNsdWRlL3NvdW5kL3BjbS5oCmluZGV4IDJmNjQ1ZGYuLmVlNmJjMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcGNtLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9wY20uaApAQCAtNTYsNiArNTYsOCBAQAogCXNpemVfdCBmaWZvX3NpemU7CQkvKiBmaWZvIHNpemUgaW4gYnl0ZXMgKi8KIH07CiAKK3N0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbTsKKwogc3RydWN0IHNuZF9wY21fb3BzIHsKIAlpbnQgKCpvcGVuKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CiAJaW50ICgqY2xvc2UpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKQEAgLTM4NCw2ICszODYsNyBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqcHJvY19zd19wYXJhbXNfZW50cnk7CiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpwcm9jX3N0YXR1c19lbnRyeTsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnByb2NfcHJlYWxsb2NfZW50cnk7CisJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpwcm9jX3ByZWFsbG9jX21heF9lbnRyeTsKICNlbmRpZgogCS8qIG1pc2MgZmxhZ3MgKi8KIAl1bnNpZ25lZCBpbnQgaHdfb3BlbmVkOiAxOwpAQCAtNDI3LDYgKzQzMCw3IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OwogCXZvaWQgKnByaXZhdGVfZGF0YTsKIAl2b2lkICgqcHJpdmF0ZV9mcmVlKSAoc3RydWN0IHNuZF9wY20gKnBjbSk7CisJc3RydWN0IGRldmljZSAqZGV2OyAvKiBhY3R1YWwgaHcgZGV2aWNlIHRoaXMgYmVsb25ncyB0byAqLwogI2lmIGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TU19NT0RVTEUpCiAJc3RydWN0IHNuZF9wY21fb3NzIG9zczsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9wdDIyNTguaCBiL2luY2x1ZGUvc291bmQvcHQyMjU4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwZjgxMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvcHQyMjU4LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqICAgQUxTQSBEcml2ZXIgZm9yIHRoZSBQVDIyNTggdm9sdW1lIGNvbnRyb2xsZXIuCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDA2ICBKb2NoZW4gVm9zcyA8dm9zc0BzZWVodWhuLmRlPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworI2lmbmRlZiBfX1NPVU5EX1BUMjI1OF9ICisjZGVmaW5lIF9fU09VTkRfUFQyMjU4X0gKKworc3RydWN0IHNuZF9wdDIyNTggeworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX2kyY19idXMgKmkyY19idXM7CisJc3RydWN0IHNuZF9pMmNfZGV2aWNlICppMmNfZGV2OworCisJdW5zaWduZWQgY2hhciB2b2x1bWVbNl07CisJaW50IG11dGU7Cit9OworCitleHRlcm4gaW50IHNuZF9wdDIyNThfcmVzZXQoc3RydWN0IHNuZF9wdDIyNTggKnB0KTsKK2V4dGVybiBpbnQgc25kX3B0MjI1OF9idWlsZF9jb250cm9scyhzdHJ1Y3Qgc25kX3B0MjI1OCAqcHQpOworCisjZW5kaWYgLyogX19TT1VORF9QVDIyNThfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zYjE2X2NzcC5oIGIvaW5jbHVkZS9zb3VuZC9zYjE2X2NzcC5oCmluZGV4IGNhZjZmZTIuLjczNmVhYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2IxNl9jc3AuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NiMTZfY3NwLmgKQEAgLTExNCw5ICsxMTQsMjEgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSAic2IuaCIKICNpbmNsdWRlICJod2RlcC5oIgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKIHN0cnVjdCBzbmRfc2JfY3NwOwogCisvKiBpbmRpY2VzIGZvciB0aGUga25vd24gQ1NQIHByb2dyYW1zICovCitlbnVtIHsKKwlDU1BfUFJPR1JBTV9NVUxBVywKKwlDU1BfUFJPR1JBTV9BTEFXLAorCUNTUF9QUk9HUkFNX0FEUENNX0lOSVQsCisJQ1NQX1BST0dSQU1fQURQQ01fUExBWUJBQ0ssCisJQ1NQX1BST0dSQU1fQURQQ01fQ0FQVFVSRSwKKworCUNTUF9QUk9HUkFNX0NPVU5UCit9OworCiAvKgogICogQ1NQIG9wZXJhdG9ycwogICovCkBAIC0xNTksNiArMTcxLDggQEAKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICpxc291bmRfc3BhY2U7CiAKIAlzdHJ1Y3QgbXV0ZXggYWNjZXNzX211dGV4OwkvKiBsb2NraW5nICovCisKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmNzcF9wcm9ncmFtc1tDU1BfUFJPR1JBTV9DT1VOVF07CiB9OwogCiBpbnQgc25kX3NiX2NzcF9uZXcoc3RydWN0IHNuZF9zYiAqY2hpcCwgaW50IGRldmljZSwgc3RydWN0IHNuZF9od2RlcCAqKiByaHdkZXApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zbmRfd2F2ZWZyb250LmggYi9pbmNsdWRlL3NvdW5kL3NuZF93YXZlZnJvbnQuaAppbmRleCAwYjllNWRlLi45Njg4ZDRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NuZF93YXZlZnJvbnQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NuZF93YXZlZnJvbnQuaApAQCAtODUsNiArODUsNyBAQAogCWNoYXIgaHdfdmVyc2lvblsyXTsgICAgICAgICAgICAgICAgLyogbWFqb3IgPSBbMF0sIG1pbm9yID0gWzFdICovCiAJY2hhciBpc3JhdzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZWVkcyBNb3Rvcm9sYSBtaWNyb2NvZGUgKi8KIAljaGFyIGhhc19meDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhcyBGWCBwcm9jZXNzb3IgKFRyb3BleispICovCisJY2hhciBmeF9pbml0aWFsaXplZDsgICAgICAgICAgICAgICAvKiBGWCdzIHJlZ2lzdGVyIHBhZ2VzIGluaXRpYWxpemVkICovCiAJY2hhciBwcm9nX3N0YXR1c1tXRl9NQVhfUFJPR1JBTV07ICAvKiBXRl9TTE9UXyogKi8KIAljaGFyIHBhdGNoX3N0YXR1c1tXRl9NQVhfUEFUQ0hdOyAgIC8qIFdGX1NMT1RfKiAqLwogCWNoYXIgc2FtcGxlX3N0YXR1c1tXRl9NQVhfU0FNUExFXTsgLyogV0ZfU1RfKiB8IFdGX1NMT1RfKiAqLwpAQCAtOTQsNiArOTUsNyBAQAogCXNwaW5sb2NrX3QgaXJxX2xvY2s7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgaW50ZXJydXB0X3NsZWVwZXI7IAogCXNuZF93YXZlZnJvbnRfbWlkaV90IG1pZGk7ICAgICAgICAgLyogSUNTMjExNSBNSURJIGludGVyZmFjZSAqLworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIH07CiAKIHN0cnVjdCBfc25kX3dhdmVmcm9udF9jYXJkIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaCBiL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjFhZThlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogbGludXgvc291bmQvc29jLWRhcG0uaCAtLSBBTFNBIFNvQyBEeW5hbWljIEF1ZGlvIFBvd2VyIE1hbmFnZW1lbnQKKyAqCisgKiBBdXRob3I6CQlMaWFtIEdpcmR3b29kCisgKiBDcmVhdGVkOgkJQXVnIDExdGggMjAwNQorICogQ29weXJpZ2h0OglXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MuIFBMQy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9TTkRfU09DX0RBUE1fSAorI2RlZmluZSBfX0xJTlVYX1NORF9TT0NfREFQTV9ICisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworLyogd2lkZ2V0IGhhcyBubyBQTSByZWdpc3RlciBiaXQgKi8KKyNkZWZpbmUgU05EX1NPQ19OT1BNCS0xCisKKy8qCisgKiBTb0MgZHluYW1pYyBhdWRpbyBwb3dlciBtYW5hZ21lbnQKKyAqCisgKiBXZSBjYW4gaGF2ZSB1cHRvIDQgcG93ZXIgZG9tYWlucworICogCTEuIENvZGVjIGRvbWFpbiAtIFZSRUYsIFZNSUQKKyAqICAgICBVc3VhbGx5IGNvbnRyb2xsZWQgYXQgY29kZWMgcHJvYmUvcmVtb3ZlLCBhbHRob3VnaCBjYW4gYmUgc2V0CisgKiAgICAgYXQgc3RyZWFtIHRpbWUgaWYgcG93ZXIgaXMgbm90IG5lZWRlZCBmb3Igc2lkZXRvbmUsIGV0Yy4KKyAqICAyLiBQbGF0Zm9ybS9NYWNoaW5lIGRvbWFpbiAtIHBoeXNpY2FsbHkgY29ubmVjdGVkIGlucHV0cyBhbmQgb3V0cHV0cworICogICAgIElzIHBsYXRmb3JtL21hY2hpbmUgYW5kIHVzZXIgYWN0aW9uIHNwZWNpZmljLCBpcyBzZXQgaW4gdGhlIG1hY2hpbmUKKyAqICAgICBkcml2ZXIgYW5kIGJ5IHVzZXJzcGFjZSBlLmcgd2hlbiBIUCBhcmUgaW5zZXJ0ZWQKKyAqICAzLiBQYXRoIGRvbWFpbiAtIEludGVybmFsIGNvZGVjIHBhdGggbWl4ZXJzCisgKiAgICAgQXJlIGF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gbWl4ZXIgYW5kIG11eCBzZXR0aW5ncyBhcmUKKyAqICAgICBjaGFuZ2VkIGJ5IHRoZSB1c2VyLgorICogIDQuIFN0cmVhbSBkb21haW4gLSBEQUMncyBhbmQgQURDJ3MuCisgKiAgICAgRW5hYmxlZCB3aGVuIHN0cmVhbSBwbGF5YmFjay9jYXB0dXJlIGlzIHN0YXJ0ZWQuCisgKi8KKworLyogY29kZWMgZG9tYWluICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9WTUlEKHduYW1lKSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV92bWlkLCAubmFtZSA9IHduYW1lLCAua2NvbnRyb2xzID0gTlVMTCwgXAorCS5udW1fa2NvbnRyb2xzID0gMH0KKworLyogcGxhdGZvcm0gZG9tYWluICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9JTlBVVCh3bmFtZSkgXAorewkuaWQgPSBzbmRfc29jX2RhcG1faW5wdXQsIC5uYW1lID0gd25hbWUsIC5rY29udHJvbHMgPSBOVUxMLCBcCisJLm51bV9rY29udHJvbHMgPSAwfQorI2RlZmluZSBTTkRfU09DX0RBUE1fT1VUUFVUKHduYW1lKSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9vdXRwdXQsIC5uYW1lID0gd25hbWUsIC5rY29udHJvbHMgPSBOVUxMLCBcCisJLm51bV9rY29udHJvbHMgPSAwfQorI2RlZmluZSBTTkRfU09DX0RBUE1fTUlDKHduYW1lLCB3ZXZlbnQpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX21pYywgLm5hbWUgPSB3bmFtZSwgLmtjb250cm9scyA9IE5VTEwsIFwKKwkubnVtX2tjb250cm9scyA9IDAsIC5ldmVudCA9IHdldmVudCwgXAorCS5ldmVudF9mbGFncyA9IFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EfQorI2RlZmluZSBTTkRfU09DX0RBUE1fSFAod25hbWUsIHdldmVudCkgXAorewkuaWQgPSBzbmRfc29jX2RhcG1faHAsIC5uYW1lID0gd25hbWUsIC5rY29udHJvbHMgPSBOVUxMLCBcCisJLm51bV9rY29udHJvbHMgPSAwLCAuZXZlbnQgPSB3ZXZlbnQsIFwKKwkuZXZlbnRfZmxhZ3MgPSBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRH0KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1NQSyh3bmFtZSwgd2V2ZW50KSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9zcGssIC5uYW1lID0gd25hbWUsIC5rY29udHJvbHMgPSBOVUxMLCBcCisJLm51bV9rY29udHJvbHMgPSAwLCAuZXZlbnQgPSB3ZXZlbnQsIFwKKwkuZXZlbnRfZmxhZ3MgPSBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRH0KKyNkZWZpbmUgU05EX1NPQ19EQVBNX0xJTkUod25hbWUsIHdldmVudCkgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fbGluZSwgLm5hbWUgPSB3bmFtZSwgLmtjb250cm9scyA9IE5VTEwsIFwKKwkubnVtX2tjb250cm9scyA9IDAsIC5ldmVudCA9IHdldmVudCwgXAorCS5ldmVudF9mbGFncyA9IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EfQorCisvKiBwYXRoIGRvbWFpbiAqLworI2RlZmluZSBTTkRfU09DX0RBUE1fUEdBKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsXAorCSB3Y29udHJvbHMsIHduY29udHJvbHMpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX3BnYSwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAorCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IHduY29udHJvbHN9CisjZGVmaW5lIFNORF9TT0NfREFQTV9NSVhFUih3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCBcCisJIHdjb250cm9scywgd25jb250cm9scylcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9taXhlciwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAorCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IHduY29udHJvbHN9CisjZGVmaW5lIFNORF9TT0NfREFQTV9NSUNCSUFTKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX21pY2JpYXMsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKKwkuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IE5VTEwsIC5udW1fa2NvbnRyb2xzID0gMH0KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1NXSVRDSCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX3N3aXRjaCwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAorCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDF9CisjZGVmaW5lIFNORF9TT0NfREFQTV9NVVgod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2NvbnRyb2xzKSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9tdXgsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKKwkuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IHdjb250cm9scywgLm51bV9rY29udHJvbHMgPSAxfQorCisvKiBwYXRoIGRvbWFpbiB3aXRoIGV2ZW50IC0gZXZlbnQgaGFuZGxlciBtdXN0IHJldHVybiAwIGZvciBzdWNjZXNzICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QR0FfRSh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMsIFwKKwl3bmNvbnRyb2xzLCB3ZXZlbnQsIHdmbGFncykgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fcGdhLCAubmFtZSA9IHduYW1lLCAucmVnID0gd3JlZywgLnNoaWZ0ID0gd3NoaWZ0LCBcCisJLmludmVydCA9IHdpbnZlcnQsIC5rY29udHJvbHMgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gd25jb250cm9scywgXAorCS5ldmVudCA9IHdldmVudCwgLmV2ZW50X2ZsYWdzID0gd2ZsYWdzfQorI2RlZmluZSBTTkRfU09DX0RBUE1fTUlYRVJfRSh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMsIFwKKwl3bmNvbnRyb2xzLCB3ZXZlbnQsIHdmbGFncykgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fbWl4ZXIsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKKwkuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IHdjb250cm9scywgLm51bV9rY29udHJvbHMgPSB3bmNvbnRyb2xzLCBcCisJLmV2ZW50ID0gd2V2ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9CisjZGVmaW5lIFNORF9TT0NfREFQTV9NSUNCSUFTX0Uod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2V2ZW50LCB3ZmxhZ3MpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX21pY2JpYXMsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKKwkuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IE5VTEwsIC5udW1fa2NvbnRyb2xzID0gMCwgXAorCS5ldmVudCA9IHdldmVudCwgLmV2ZW50X2ZsYWdzID0gd2ZsYWdzfQorI2RlZmluZSBTTkRfU09DX0RBUE1fU1dJVENIX0Uod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2NvbnRyb2xzLCBcCisJd2V2ZW50LCB3ZmxhZ3MpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX3N3aXRjaCwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAorCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDEgXAorCS5ldmVudCA9IHdldmVudCwgLmV2ZW50X2ZsYWdzID0gd2ZsYWdzfQorI2RlZmluZSBTTkRfU09DX0RBUE1fTVVYX0Uod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2NvbnRyb2xzLCBcCisJd2V2ZW50LCB3ZmxhZ3MpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX211eCwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAorCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDEsIFwKKwkuZXZlbnQgPSB3ZXZlbnQsIC5ldmVudF9mbGFncyA9IHdmbGFnc30KKworLyogZXZlbnRzIHRoYXQgYXJlIHByZSBhbmQgcG9zdCBEQVBNICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QUkUod25hbWUsIHdldmVudCkgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fcHJlLCAubmFtZSA9IHduYW1lLCAua2NvbnRyb2xzID0gTlVMTCwgXAorCS5udW1fa2NvbnRyb2xzID0gMCwgLmV2ZW50ID0gd2V2ZW50LCBcCisJLmV2ZW50X2ZsYWdzID0gU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRH0KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BPU1Qod25hbWUsIHdldmVudCkgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fcG9zdCwgLm5hbWUgPSB3bmFtZSwgLmtjb250cm9scyA9IE5VTEwsIFwKKwkubnVtX2tjb250cm9scyA9IDAsIC5ldmVudCA9IHdldmVudCwgXAorCS5ldmVudF9mbGFncyA9IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRH0KKworLyogc3RyZWFtIGRvbWFpbiAqLworI2RlZmluZSBTTkRfU09DX0RBUE1fREFDKHduYW1lLCBzdG5hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCkgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fZGFjLCAubmFtZSA9IHduYW1lLCAuc25hbWUgPSBzdG5hbWUsIC5yZWcgPSB3cmVnLCBcCisJLnNoaWZ0ID0gd3NoaWZ0LCAuaW52ZXJ0ID0gd2ludmVydH0KKyNkZWZpbmUgU05EX1NPQ19EQVBNX0FEQyh3bmFtZSwgc3RuYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX2FkYywgLm5hbWUgPSB3bmFtZSwgLnNuYW1lID0gc3RuYW1lLCAucmVnID0gd3JlZywgXAorCS5zaGlmdCA9IHdzaGlmdCwgLmludmVydCA9IHdpbnZlcnR9CisKKy8qIGRhcG0ga2NvbnRyb2wgdHlwZXMgKi8KKyNkZWZpbmUgU09DX0RBUE1fU0lOR0xFKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgXAorCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X3ZvbHN3LCAucHV0ID0gc25kX3NvY19kYXBtX3B1dF92b2xzdywgXAorCS5wcml2YXRlX3ZhbHVlID0gIFNPQ19TSU5HTEVfVkFMVUUocmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0KSB9CisjZGVmaW5lIFNPQ19EQVBNX0RPVUJMRSh4bmFtZSwgcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52ZXJ0LCBcCisJcG93ZXIpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCisgCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X3ZvbHN3LCAucHV0ID0gc25kX3NvY19kYXBtX3B1dF92b2xzdywgXAorIAkucHJpdmF0ZV92YWx1ZSA9IChyZWcpIHwgKChzaGlmdF9sZWZ0KSA8PCA4KSB8ICgoc2hpZnRfcmlnaHQpIDw8IDEyKSB8XAorIAkJICgobWFzaykgPDwgMTYpIHwgKChpbnZlcnQpIDw8IDI0KSB9CisjZGVmaW5lIFNPQ19EQVBNX0VOVU0oeG5hbWUsIHhlbnVtKSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fZW51bV9kb3VibGUsIFwKKyAJLmdldCA9IHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsIFwKKyAJLnB1dCA9IHNuZF9zb2NfZGFwbV9wdXRfZW51bV9kb3VibGUsIFwKKyAgCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKworLyogZGFwbSBzdHJlYW0gb3BlcmF0aW9ucyAqLworI2RlZmluZSBTTkRfU09DX0RBUE1fU1RSRUFNX05PUAkJCTB4MAorI2RlZmluZSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUCQkweDEKKyNkZWZpbmUgU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QCQkweDIKKyNkZWZpbmUgU05EX1NPQ19EQVBNX1NUUkVBTV9TVVNQRU5ECQkweDQKKyNkZWZpbmUgU05EX1NPQ19EQVBNX1NUUkVBTV9SRVNVTUUJCTB4OAorI2RlZmluZSBTTkRfU09DX0RBUE1fU1RSRUFNX1BBVVNFX1BVU0gJMHgxMAorI2RlZmluZSBTTkRfU09DX0RBUE1fU1RSRUFNX1BBVVNFX1JFTEVBU0UJMHgyMAorCisvKiBkYXBtIGV2ZW50IHR5cGVzICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9QUkVfUE1VCTB4MSAJLyogYmVmb3JlIHdpZGdldCBwb3dlciB1cCAqLworI2RlZmluZSBTTkRfU09DX0RBUE1fUE9TVF9QTVUJMHgyCQkvKiBhZnRlciB3aWRnZXQgcG93ZXIgdXAgKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BSRV9QTUQJMHg0IAkvKiBiZWZvcmUgd2lkZ2V0IHBvd2VyIGRvd24gKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BPU1RfUE1ECTB4OAkJLyogYWZ0ZXIgd2lkZ2V0IHBvd2VyIGRvd24gKi8KKyNkZWZpbmUgU05EX1NPQ19EQVBNX1BSRV9SRUcJMHgxMAkvKiBiZWZvcmUgYXVkaW8gcGF0aCBzZXR1cCAqLworI2RlZmluZSBTTkRfU09DX0RBUE1fUE9TVF9SRUcJMHgyMAkvKiBhZnRlciBhdWRpbyBwYXRoIHNldHVwICovCisKKy8qIGNvbnZlbmllbmNlIGV2ZW50IHR5cGUgZGV0ZWN0aW9uICovCisjZGVmaW5lIFNORF9TT0NfREFQTV9FVkVOVF9PTihlKQlcCisJKGUgJiAoU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpKQorI2RlZmluZSBTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGUpCVwKKwkoZSAmIChTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCkpCisKK3N0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0OworZW51bSBzbmRfc29jX2RhcG1fdHlwZTsKK3N0cnVjdCBzbmRfc29jX2RhcG1fcGF0aDsKK3N0cnVjdCBzbmRfc29jX2RhcG1fcGluOworCisvKiBkYXBtIGNvbnRyb2xzICovCitpbnQgc25kX3NvY19kYXBtX3B1dF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19kYXBtX2dldF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19kYXBtX25ld19jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0KTsKKworLyogZGFwbSBwYXRoIHNldHVwICovCitpbnQgc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCWNvbnN0IGNoYXIgKnNpbmtfbmFtZSwgY29uc3QgY2hhciAqY29udHJvbF9uYW1lLCBjb25zdCBjaGFyICpzcmNfbmFtZSk7CitpbnQgc25kX3NvY19kYXBtX25ld193aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7Cit2b2lkIHNuZF9zb2NfZGFwbV9mcmVlKHN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2KTsKKworLyogZGFwbSBldmVudHMgKi8KK2ludCBzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgY2hhciAqc3RyZWFtLAorCWludCBldmVudCk7CisKKy8qIGRhcG0gc3lzIGZzIC0gdXNlZCBieSB0aGUgY29yZSAqLworaW50IHNuZF9zb2NfZGFwbV9zeXNfYWRkKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qIGRhcG0gYXVkaW8gZW5kcG9pbnQgY29udHJvbCAqLworaW50IHNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCWNoYXIgKnBpbiwgaW50IHN0YXR1cyk7CitpbnQgc25kX3NvY19kYXBtX3N5bmNfZW5kcG9pbnRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CisKKy8qIGRhcG0gd2lkZ2V0IHR5cGVzICovCitlbnVtIHNuZF9zb2NfZGFwbV90eXBlIHsKKwlzbmRfc29jX2RhcG1faW5wdXQgPSAwLAkJLyogaW5wdXQgcGluICovCisJc25kX3NvY19kYXBtX291dHB1dCwJCS8qIG91dHB1dCBwaW4gKi8KKwlzbmRfc29jX2RhcG1fbXV4LAkJCS8qIHNlbGVjdHMgMSBhbmFsb2cgc2lnbmFsIGZyb20gbWFueSBpbnB1dHMgKi8KKwlzbmRfc29jX2RhcG1fbWl4ZXIsCQkJLyogbWl4ZXMgc2V2ZXJhbCBhbmFsb2cgc2lnbmFscyB0b2dldGhlciAqLworCXNuZF9zb2NfZGFwbV9wZ2EsCQkJLyogcHJvZ3JhbW1hYmxlIGdhaW4vYXR0ZW51YXRpb24gKHZvbHVtZSkgKi8KKwlzbmRfc29jX2RhcG1fYWRjLAkJCS8qIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRlciAqLworCXNuZF9zb2NfZGFwbV9kYWMsCQkJLyogZGlnaXRhbCB0byBhbmFsb2cgY29udmVydGVyICovCisJc25kX3NvY19kYXBtX21pY2JpYXMsCQkvKiBtaWNyb3Bob25lIGJpYXMgKHBvd2VyKSAqLworCXNuZF9zb2NfZGFwbV9taWMsCQkJLyogbWljcm9waG9uZSAqLworCXNuZF9zb2NfZGFwbV9ocCwJCQkvKiBoZWFkcGhvbmVzICovCisJc25kX3NvY19kYXBtX3NwaywJCQkvKiBzcGVha2VyICovCisJc25kX3NvY19kYXBtX2xpbmUsCQkJLyogbGluZSBpbnB1dC9vdXRwdXQgKi8KKwlzbmRfc29jX2RhcG1fc3dpdGNoLAkJLyogYW5hbG9nIHN3aXRjaCAqLworCXNuZF9zb2NfZGFwbV92bWlkLAkJCS8qIGNvZGVjIGJpYXMvdm1pZCAtIHRvIG1pbmltaXNlIHBvcHMgKi8KKwlzbmRfc29jX2RhcG1fcHJlLAkJCS8qIG1hY2hpbmUgc3BlY2lmaWMgcHJlIHdpZGdldCAtIGV4ZWMgZmlyc3QgKi8KKwlzbmRfc29jX2RhcG1fcG9zdCwJCQkvKiBtYWNoaW5lIHNwZWNpZmljIHBvc3Qgd2lkZ2V0IC0gZXhlYyBsYXN0ICovCit9OworCisvKiBkYXBtIGF1ZGlvIHBhdGggYmV0d2VlbiB0d28gd2lkZ2V0cyAqLworc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoIHsKKwljaGFyICpuYW1lOworCWNoYXIgKmxvbmdfbmFtZTsKKworCS8qIHNvdXJjZSAoaW5wdXQpIGFuZCBzaW5rIChvdXRwdXQpIHdpZGdldHMgKi8KKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc291cmNlOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sOworCisJLyogc3RhdHVzICovCisJdTMyIGNvbm5lY3Q6MTsJLyogc291cmNlIGFuZCBzaW5rIHdpZGdldHMgYXJlIGNvbm5lY3RlZCAqLworCXUzMiB3YWxrZWQ6MTsJLyogcGF0aCBoYXMgYmVlbiB3YWxrZWQgKi8KKworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9zb3VyY2U7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X3Npbms7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworLyogZGFwbSB3aWRnZXQgKi8KK3N0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHsKKwllbnVtIHNuZF9zb2NfZGFwbV90eXBlIGlkOworCWNoYXIgKm5hbWU7CQkvKiB3aWRnZXQgbmFtZSAqLworCWNoYXIgKnNuYW1lOwkvKiBzdHJlYW0gbmFtZSAqLworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBkYXBtIGNvbnRyb2wgKi8KKwlzaG9ydCByZWc7CQkJCQkJLyogbmVnYXRpdmUgcmVnID0gbm8gZGlyZWN0IGRhcG0gKi8KKwl1bnNpZ25lZCBjaGFyIHNoaWZ0OwkJCS8qIGJpdHMgdG8gc2hpZnQgKi8KKwl1bnNpZ25lZCBpbnQgc2F2ZWRfdmFsdWU7CQkvKiB3aWRnZXQgc2F2ZWQgdmFsdWUgKi8KKwl1bnNpZ25lZCBpbnQgdmFsdWU7CQkJCS8qIHdpZGdldCBjdXJyZW50IHZhbHVlICovCisJdW5zaWduZWQgY2hhciBwb3dlcjoxOwkJCS8qIGJsb2NrIHBvd2VyIHN0YXR1cyAqLworCXVuc2lnbmVkIGNoYXIgaW52ZXJ0OjE7CQkJLyogaW52ZXJ0IHRoZSBwb3dlciBiaXQgKi8KKwl1bnNpZ25lZCBjaGFyIGFjdGl2ZToxOwkJCS8qIGFjdGl2ZSBzdHJlYW0gb24gREFDLCBBREMncyAqLworCXVuc2lnbmVkIGNoYXIgY29ubmVjdGVkOjE7CQkvKiBjb25uZWN0ZWQgY29kZWMgcGluICovCisJdW5zaWduZWQgY2hhciBuZXc6MTsJCQkvKiBjbmV3IGNvbXBsZXRlICovCisJdW5zaWduZWQgY2hhciBleHQ6MTsJCQkvKiBoYXMgZXh0ZXJuYWwgd2lkZ2V0cyAqLworCXVuc2lnbmVkIGNoYXIgbXV0ZWQ6MTsJCQkvKiBtdXRlZCBmb3IgcG9wIHJlZHVjdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgc3VzcGVuZDoxOwkJLyogd2FzIGFjdGl2ZSBiZWZvcmUgc3VzcGVuZCAqLworCXVuc2lnbmVkIGNoYXIgcG1kb3duOjE7CQkJLyogd2FpdGluZyBmb3IgdGltZW91dCAqLworCisJLyogZXh0ZXJuYWwgZXZlbnRzICovCisJdW5zaWduZWQgc2hvcnQgZXZlbnRfZmxhZ3M7CQkvKiBmbGFncyB0byBzcGVjaWZ5IGV2ZW50IHR5cGVzICovCisJaW50ICgqZXZlbnQpKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0KiwgaW50KTsKKworCS8qIGtjb250cm9scyB0aGF0IHJlbGF0ZSB0byB0aGlzIHdpZGdldCAqLworCWludCBudW1fa2NvbnRyb2xzOworCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY29udHJvbHM7CisKKwkvKiB3aWRnZXQgaW5wdXQgYW5kIG91dHB1dHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNvdXJjZXM7CisJc3RydWN0IGxpc3RfaGVhZCBzaW5rczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MuaCBiL2luY2x1ZGUvc291bmQvc29jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkYzM2NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmQvc29jLmgKQEAgLTAsMCArMSw0NjEgQEAKKy8qCisgKiBsaW51eC9zb3VuZC9zb2MuaCAtLSBBTFNBIFNvQyBMYXllcgorICoKKyAqIEF1dGhvcjoJCUxpYW0gR2lyZHdvb2QKKyAqIENyZWF0ZWQ6CQlBdWcgMTF0aCAyMDA1CisgKiBDb3B5cmlnaHQ6CVdvbGZzb24gTWljcm9lbGVjdHJvbmljcy4gUExDLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1NORF9TT0NfSAorI2RlZmluZSBfX0xJTlVYX1NORF9TT0NfSAorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KKworI2RlZmluZSBTTkRfU09DX1ZFUlNJT04gIjAuMTMuMCIKKworLyoKKyAqIENvbnZlbmllbmNlIGtjb250cm9sIGJ1aWxkZXJzCisgKi8KKyNkZWZpbmUgU09DX1NJTkdMRV9WQUxVRShyZWcsc2hpZnQsbWFzayxpbnZlcnQpICgocmVnKSB8ICgoc2hpZnQpIDw8IDgpIHxcCisJKChzaGlmdCkgPDwgMTIpIHwgKChtYXNrKSA8PCAxNikgfCAoKGludmVydCkgPDwgMjQpKQorI2RlZmluZSBTT0NfU0lOR0xFX1ZBTFVFX0VYVChyZWcsbWFzayxpbnZlcnQpICgocmVnKSB8ICgobWFzaykgPDwgMTYpIHxcCisJKChpbnZlcnQpIDw8IDMxKSkKKyNkZWZpbmUgU09DX1NJTkdMRSh4bmFtZSwgcmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0KSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIC5nZXQgPSBzbmRfc29jX2dldF92b2xzdyxcCisJLnB1dCA9IHNuZF9zb2NfcHV0X3ZvbHN3LCBcCisJLnByaXZhdGVfdmFsdWUgPSAgU09DX1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpIH0KKyNkZWZpbmUgU09DX0RPVUJMRSh4bmFtZSwgcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52ZXJ0KSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCAuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3csIFwKKwkucHV0ID0gc25kX3NvY19wdXRfdm9sc3csIFwKKwkucHJpdmF0ZV92YWx1ZSA9IChyZWcpIHwgKChzaGlmdF9sZWZ0KSA8PCA4KSB8IFwKKwkJKChzaGlmdF9yaWdodCkgPDwgMTIpIHwgKChtYXNrKSA8PCAxNikgfCAoKGludmVydCkgPDwgMjQpIH0KKyNkZWZpbmUgU09DX0RPVUJMRV9SKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCBzaGlmdCwgbWFzaywgaW52ZXJ0KSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzd18yciwgXAorCS5nZXQgPSBzbmRfc29jX2dldF92b2xzd18yciwgLnB1dCA9IHNuZF9zb2NfcHV0X3ZvbHN3XzJyLCBcCisJLnByaXZhdGVfdmFsdWUgPSAocmVnX2xlZnQpIHwgKChzaGlmdCkgPDwgOCkgIHwgXAorCQkoKG1hc2spIDw8IDEyKSB8ICgoaW52ZXJ0KSA8PCAyMCkgfCAoKHJlZ19yaWdodCkgPDwgMjQpIH0KKyNkZWZpbmUgU09DX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdF9sLCB4c2hpZnRfciwgeG1hc2ssIHh0ZXh0cykgXAorewkucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAorCS5tYXNrID0geG1hc2ssIC50ZXh0cyA9IHh0ZXh0cyB9CisjZGVmaW5lIFNPQ19FTlVNX1NJTkdMRSh4cmVnLCB4c2hpZnQsIHhtYXNrLCB4dGV4dHMpIFwKKwlTT0NfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0LCB4c2hpZnQsIHhtYXNrLCB4dGV4dHMpCisjZGVmaW5lIFNPQ19FTlVNX1NJTkdMRV9FWFQoeG1hc2ssIHh0ZXh0cykgXAorewkubWFzayA9IHhtYXNrLCAudGV4dHMgPSB4dGV4dHMgfQorI2RlZmluZSBTT0NfRU5VTSh4bmFtZSwgeGVudW0pIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsXAorCS5pbmZvID0gc25kX3NvY19pbmZvX2VudW1fZG91YmxlLCBcCisJLmdldCA9IHNuZF9zb2NfZ2V0X2VudW1fZG91YmxlLCAucHV0ID0gc25kX3NvY19wdXRfZW51bV9kb3VibGUsIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9CisjZGVmaW5lIFNPQ19TSU5HTEVfRVhUKHhuYW1lLCB4cmVnLCB4c2hpZnQsIHhtYXNrLCB4aW52ZXJ0LFwKKwkgeGhhbmRsZXJfZ2V0LCB4aGFuZGxlcl9wdXQpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgXAorCS5nZXQgPSB4aGFuZGxlcl9nZXQsIC5wdXQgPSB4aGFuZGxlcl9wdXQsIFwKKwkucHJpdmF0ZV92YWx1ZSA9IFNPQ19TSU5HTEVfVkFMVUUoeHJlZywgeHNoaWZ0LCB4bWFzaywgeGludmVydCkgfQorI2RlZmluZSBTT0NfU0lOR0xFX0JPT0xfRVhUKHhuYW1lLCB4ZGF0YSwgeGhhbmRsZXJfZ2V0LCB4aGFuZGxlcl9wdXQpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb19ib29sX2V4dCwgXAorCS5nZXQgPSB4aGFuZGxlcl9nZXQsIC5wdXQgPSB4aGFuZGxlcl9wdXQsIFwKKwkucHJpdmF0ZV92YWx1ZSA9IHhkYXRhIH0KKyNkZWZpbmUgU09DX0VOVU1fRVhUKHhuYW1lLCB4ZW51bSwgeGhhbmRsZXJfZ2V0LCB4aGFuZGxlcl9wdXQpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2V4dCwgXAorCS5nZXQgPSB4aGFuZGxlcl9nZXQsIC5wdXQgPSB4aGFuZGxlcl9wdXQsIFwKKwkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9CisKKy8qCisgKiBEaWdpdGFsIEF1ZGlvIEludGVyZmFjZSAoREFJKSB0eXBlcworICovCisjZGVmaW5lIFNORF9TT0NfREFJX0FDOTcJMHgxCisjZGVmaW5lIFNORF9TT0NfREFJX0kyUwkJMHgyCisjZGVmaW5lIFNORF9TT0NfREFJX1BDTQkJMHg0CisKKy8qCisgKiBEQUkgaGFyZHdhcmUgYXVkaW8gZm9ybWF0cworICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0kyUwkJMAkvKiBJMlMgbW9kZSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KCTEJLyogUmlnaHQganVzdGlmaWVkIG1vZGUgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfTEVGVF9KCTIJLyogTGVmdCBKdXN0aWZpZWQgbW9kZSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9EU1BfQQkzCS8qIEwgZGF0YSBtc2IgYWZ0ZXIgRlJNIG9yIExSQyAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9EU1BfQgk0CS8qIEwgZGF0YSBtc2IgZHVyaW5nIEZSTSBvciBMUkMgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQUM5NwkJNQkvKiBBQzk3ICovCisKKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfTVNCIAlTTkRfU09DX0RBSUZNVF9MRUZUX0oKKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfTFNCCVNORF9TT0NfREFJRk1UX1JJR0hUX0oKKworLyoKKyAqIERBSSBHYXRpbmcKKyAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DT05UCQkJKDAgPDwgNCkJLyogY29udGludW91cyBjbG9jayAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9HQVRFRAkJKDEgPDwgNCkJLyogY2xvY2sgaXMgZ2F0ZWQgd2hlbiBub3QgVHgvUnggKi8KKworLyoKKyAqIERBSSBoYXJkd2FyZSBzaWduYWwgaW52ZXJzaW9ucworICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX05CX05GCQkoMCA8PCA4KQkvKiBub3JtYWwgYml0IGNsb2NrICsgZnJhbWUgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfTkJfSUYJCSgxIDw8IDgpCS8qIG5vcm1hbCBiY2xrICsgaW52IGZybSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9JQl9ORgkJKDIgPDwgOCkJLyogaW52ZXJ0IGJjbGsgKyBub3IgZnJtICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0lCX0lGCQkoMyA8PCA4KQkvKiBpbnZlcnQgYmNsayArIGZybSAqLworCisvKgorICogREFJIGhhcmR3YXJlIGNsb2NrIG1hc3RlcnMKKyAqIFRoaXMgaXMgd3J0IHRoZSBjb2RlYywgdGhlIGludmVyc2UgaXMgdHJ1ZSBmb3IgdGhlIGludGVyZmFjZQorICogaS5lLiBpZiB0aGUgY29kZWMgaXMgY2xrIGFuZCBmcm0gbWFzdGVyIHRoZW4gdGhlIGludGVyZmFjZSBpcworICogY2xrIGFuZCBmcmFtZSBzbGF2ZS4KKyAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNCSgwIDw8IDEyKSAvKiBjb2RlYyBjbGsgJiBmcm0gbWFzdGVyICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0NCU19DRk0JKDEgPDwgMTIpIC8qIGNvZGVjIGNsayBzbGF2ZSAmIGZybSBtYXN0ZXIgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQ0JNX0NGUwkoMiA8PCAxMikgLyogY29kZWMgY2xrIG1hc3RlciAmIGZyYW1lIHNsYXZlICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0NCU19DRlMJKDMgPDwgMTIpIC8qIGNvZGVjIGNsayAmIGZybSBzbGF2ZSAqLworCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLCQkweDAwMGYKKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQ0xPQ0tfTUFTSwkJMHgwMGYwCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLCQkJMHgwZjAwCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLCQkweGYwMDAKKworCisvKgorICogTWFzdGVyIENsb2NrIERpcmVjdGlvbnMKKyAqLworI2RlZmluZSBTTkRfU09DX0NMT0NLX0lOCTAKKyNkZWZpbmUgU05EX1NPQ19DTE9DS19PVVQJMQorCisvKgorICogQUM5NyBjb2RlYyBJRCdzIGJpdG1hc2sKKyAqLworI2RlZmluZSBTTkRfU09DX0RBSV9BQzk3X0lEMAkoMSA8PCAwKQorI2RlZmluZSBTTkRfU09DX0RBSV9BQzk3X0lEMQkoMSA8PCAxKQorI2RlZmluZSBTTkRfU09DX0RBSV9BQzk3X0lEMgkoMSA8PCAyKQorI2RlZmluZSBTTkRfU09DX0RBSV9BQzk3X0lEMwkoMSA8PCAzKQorCitzdHJ1Y3Qgc25kX3NvY19kZXZpY2U7CitzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtOworc3RydWN0IHNuZF9zb2Nfb3BzOworc3RydWN0IHNuZF9zb2NfZGFpX21vZGU7CitzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZTsKK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RhaTsKK3N0cnVjdCBzbmRfc29jX2NwdV9kYWk7CitzdHJ1Y3Qgc25kX3NvY19jb2RlYzsKK3N0cnVjdCBzbmRfc29jX21hY2hpbmVfY29uZmlnOworc3RydWN0IHNvY19lbnVtOworc3RydWN0IHNuZF9zb2NfYWM5N19vcHM7CitzdHJ1Y3Qgc25kX3NvY19jbG9ja19pbmZvOworCit0eXBlZGVmIGludCAoKmh3X3dyaXRlX3QpKHZvaWQgKixjb25zdCBjaGFyKiAsaW50KTsKK3R5cGVkZWYgaW50ICgqaHdfcmVhZF90KSh2b2lkICosY2hhciogLGludCk7CisKK2V4dGVybiBzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyBzb2NfYWM5N19vcHM7CisKKy8qIHBjbSA8LT4gREFJIGNvbm5lY3QgKi8KK3ZvaWQgc25kX3NvY19mcmVlX3BjbXMoc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYpOworaW50IHNuZF9zb2NfbmV3X3BjbXMoc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYsIGludCBpZHgsIGNvbnN0IGNoYXIgKnhpZCk7CitpbnQgc25kX3NvY19yZWdpc3Rlcl9jYXJkKHN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2KTsKKworLyogc2V0IHJ1bnRpbWUgaHcgcGFyYW1zICovCitpbnQgc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwljb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSAqaHcpOworCisvKiBjb2RlYyBJTyAqLworI2RlZmluZSBzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgY29kZWMtPnJlYWQoY29kZWMsIHJlZykKKyNkZWZpbmUgc25kX3NvY193cml0ZShjb2RlYywgcmVnLCB2YWx1ZSkgY29kZWMtPndyaXRlKGNvZGVjLCByZWcsIHZhbHVlKQorCisvKiBjb2RlYyByZWdpc3RlciBiaXQgYWNjZXNzICovCitpbnQgc25kX3NvY191cGRhdGVfYml0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIHNob3J0IHJlZywKKwkJCQl1bnNpZ25lZCBzaG9ydCBtYXNrLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSk7CitpbnQgc25kX3NvY190ZXN0X2JpdHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJdW5zaWduZWQgc2hvcnQgbWFzaywgdW5zaWduZWQgc2hvcnQgdmFsdWUpOworCitpbnQgc25kX3NvY19uZXdfYWM5N19jb2RlYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgKm9wcywgaW50IG51bSk7Cit2b2lkIHNuZF9zb2NfZnJlZV9hYzk3X2NvZGVjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CisKKy8qCisgKkNvbnRyb2xzCisgKi8KK3N0cnVjdCBzbmRfa2NvbnRyb2wgKnNuZF9zb2NfY25ldyhjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqX3RlbXBsYXRlLAorCXZvaWQgKmRhdGEsIGNoYXIgKmxvbmdfbmFtZSk7CitpbnQgc25kX3NvY19pbmZvX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOworaW50IHNuZF9zb2NfaW5mb19lbnVtX2V4dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKK2ludCBzbmRfc29jX2dldF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19wdXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworaW50IHNuZF9zb2NfaW5mb192b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKK2ludCBzbmRfc29jX2luZm9fdm9sc3dfZXh0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOworaW50IHNuZF9zb2NfaW5mb19ib29sX2V4dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKK2ludCBzbmRfc29jX2dldF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19wdXRfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworaW50IHNuZF9zb2NfaW5mb192b2xzd18ycihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKK2ludCBzbmRfc29jX2dldF92b2xzd18ycihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19wdXRfdm9sc3dfMnIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworCisvKiBTb0MgUENNIHN0cmVhbSBpbmZvcm1hdGlvbiAqLworc3RydWN0IHNuZF9zb2NfcGNtX3N0cmVhbSB7CisJY2hhciAqc3RyZWFtX25hbWU7CisJdTY0IGZvcm1hdHM7CQkJLyogU05EUlZfUENNX0ZNVEJJVF8qICovCisJdW5zaWduZWQgaW50IHJhdGVzOwkJLyogU05EUlZfUENNX1JBVEVfKiAqLworCXVuc2lnbmVkIGludCByYXRlX21pbjsJCS8qIG1pbiByYXRlICovCisJdW5zaWduZWQgaW50IHJhdGVfbWF4OwkJLyogbWF4IHJhdGUgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHNfbWluOwkvKiBtaW4gY2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHNfbWF4OwkvKiBtYXggY2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBpbnQgYWN0aXZlOjE7CQkvKiBzdHJlYW0gaXMgaW4gdXNlICovCit9OworCisvKiBTb0MgYXVkaW8gb3BzICovCitzdHJ1Y3Qgc25kX3NvY19vcHMgeworCWludCAoKnN0YXJ0dXApKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKKwlpbnQgKCpod19wYXJhbXMpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKik7CisJaW50ICgqaHdfZnJlZSkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopOworCWludCAoKnByZXBhcmUpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKKwlpbnQgKCp0cmlnZ2VyKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKiwgaW50KTsKK307CisKKy8qIEFTb0MgY29kZWMgREFJIG9wcyAqLworc3RydWN0IHNuZF9zb2NfY29kZWNfb3BzIHsKKwkvKiBjb2RlYyBEQUkgY2xvY2tpbmcgY29uZmlndXJhdGlvbiAqLworCWludCAoKnNldF9zeXNjbGspKHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpLAorCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcik7CisJaW50ICgqc2V0X3BsbCkoc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWksCisJCWludCBwbGxfaWQsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpOworCWludCAoKnNldF9jbGtkaXYpKHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpLAorCQlpbnQgZGl2X2lkLCBpbnQgZGl2KTsKKworCS8qIENQVSBEQUkgZm9ybWF0IGNvbmZpZ3VyYXRpb24gKi8KKwlpbnQgKCpzZXRfZm10KShzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJdW5zaWduZWQgaW50IGZtdCk7CisJaW50ICgqc2V0X3RkbV9zbG90KShzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJdW5zaWduZWQgaW50IG1hc2ssIGludCBzbG90cyk7CisJaW50ICgqc2V0X3RyaXN0YXRlKShzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKiwgaW50IHRyaXN0YXRlKTsKKworCS8qIGRpZ2l0YWwgbXV0ZSAqLworCWludCAoKmRpZ2l0YWxfbXV0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICosIGludCBtdXRlKTsKK307CisKKy8qIEFTb0MgY3B1IERBSSBvcHMgKi8KK3N0cnVjdCBzbmRfc29jX2NwdV9vcHMgeworCS8qIENQVSBEQUkgY2xvY2tpbmcgY29uZmlndXJhdGlvbiAqLworCWludCAoKnNldF9zeXNjbGspKHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWksCisJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKTsKKwlpbnQgKCpzZXRfY2xrZGl2KShzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAorCQlpbnQgZGl2X2lkLCBpbnQgZGl2KTsKKwlpbnQgKCpzZXRfcGxsKShzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAorCQlpbnQgcGxsX2lkLCB1bnNpZ25lZCBpbnQgZnJlcV9pbiwgdW5zaWduZWQgaW50IGZyZXFfb3V0KTsKKworCS8qIENQVSBEQUkgZm9ybWF0IGNvbmZpZ3VyYXRpb24gKi8KKwlpbnQgKCpzZXRfZm10KShzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KTsKKwlpbnQgKCpzZXRfdGRtX3Nsb3QpKHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWksCisJCXVuc2lnbmVkIGludCBtYXNrLCBpbnQgc2xvdHMpOworCWludCAoKnNldF90cmlzdGF0ZSkoc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqLCBpbnQgdHJpc3RhdGUpOworfTsKKworLyogU29DIENvZGVjIERBSSAqLworc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpIHsKKwljaGFyICpuYW1lOworCWludCBpZDsKKworCS8qIERBSSBjYXBhYmlsaXRpZXMgKi8KKwlzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtIHBsYXliYWNrOworCXN0cnVjdCBzbmRfc29jX3BjbV9zdHJlYW0gY2FwdHVyZTsKKworCS8qIERBSSBydW50aW1lIGluZm8gKi8KKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJdW5zaWduZWQgaW50IGFjdGl2ZTsKKwl1bnNpZ25lZCBjaGFyIHBvcF93YWl0OjE7CisKKwkvKiBvcHMgKi8KKwlzdHJ1Y3Qgc25kX3NvY19vcHMgb3BzOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX29wcyBkYWlfb3BzOworCisJLyogREFJIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKnByaXZhdGVfZGF0YTsKK307CisKKy8qIFNvQyBDUFUgREFJICovCitzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpIHsKKworCS8qIERBSSBkZXNjcmlwdGlvbiAqLworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IGlkOworCXVuc2lnbmVkIGNoYXIgdHlwZTsKKworCS8qIERBSSBjYWxsYmFja3MgKi8KKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJdm9pZCAoKnJlbW92ZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJaW50ICgqc3VzcGVuZCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSk7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpKTsKKworCS8qIG9wcyAqLworCXN0cnVjdCBzbmRfc29jX29wcyBvcHM7CisJc3RydWN0IHNuZF9zb2NfY3B1X29wcyBkYWlfb3BzOworCisJLyogREFJIGNhcGFiaWxpdGllcyAqLworCXN0cnVjdCBzbmRfc29jX3BjbV9zdHJlYW0gY2FwdHVyZTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtIHBsYXliYWNrOworCisJLyogREFJIHJ1bnRpbWUgaW5mbyAqLworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJdW5zaWduZWQgY2hhciBhY3RpdmU6MTsKKwl2b2lkICpkbWFfZGF0YTsKKworCS8qIERBSSBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICpwcml2YXRlX2RhdGE7Cit9OworCisvKiBTb0MgQXVkaW8gQ29kZWMgKi8KK3N0cnVjdCBzbmRfc29jX2NvZGVjIHsKKwljaGFyICpuYW1lOworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCXN0cnVjdCBtdXRleCBtdXRleDsKKworCS8qIGNhbGxiYWNrcyAqLworCWludCAoKmRhcG1fZXZlbnQpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGV2ZW50KTsKKworCS8qIHJ1bnRpbWUgKi8KKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHNuZF9hYzk3ICphYzk3OyAgLyogZm9yIGFkLWhvYyBhYzk3IGRldmljZXMgKi8KKwl1bnNpZ25lZCBpbnQgYWN0aXZlOworCXVuc2lnbmVkIGludCBwY21fZGV2czsKKwl2b2lkICpwcml2YXRlX2RhdGE7CisKKwkvKiBjb2RlYyBJTyAqLworCXZvaWQgKmNvbnRyb2xfZGF0YTsgLyogY29kZWMgY29udHJvbCAoaTJjLzN3aXJlKSBkYXRhICovCisJdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCWh3X3dyaXRlX3QgaHdfd3JpdGU7CisJaHdfcmVhZF90IGh3X3JlYWQ7CisJdm9pZCAqcmVnX2NhY2hlOworCXNob3J0IHJlZ19jYWNoZV9zaXplOworCXNob3J0IHJlZ19jYWNoZV9zdGVwOworCisJLyogZGFwbSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGFwbV93aWRnZXRzOworCXN0cnVjdCBsaXN0X2hlYWQgZGFwbV9wYXRoczsKKwl1bnNpZ25lZCBpbnQgZGFwbV9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgc3VzcGVuZF9kYXBtX3N0YXRlOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrOworCisJLyogY29kZWMgREFJJ3MgKi8KKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmRhaTsKKwl1bnNpZ25lZCBpbnQgbnVtX2RhaTsKK307CisKKy8qIGNvZGVjIGRldmljZSAqLworc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludCAoKnJlc3VtZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Cit9OworCisvKiBTb0MgcGxhdGZvcm0gaW50ZXJmYWNlICovCitzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSB7CisJY2hhciAqbmFtZTsKKworCWludCAoKnByb2JlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwlpbnQgKCpyZW1vdmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkpOworCWludCAoKnJlc3VtZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSk7CisKKwkvKiBwY20gY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCisJaW50ICgqcGNtX25ldykoc3RydWN0IHNuZF9jYXJkICosIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqLAorCQlzdHJ1Y3Qgc25kX3BjbSAqKTsKKwl2b2lkICgqcGNtX2ZyZWUpKHN0cnVjdCBzbmRfcGNtICopOworCisJLyogcGxhdGZvcm0gc3RyZWFtIG9wcyAqLworCXN0cnVjdCBzbmRfcGNtX29wcyAqcGNtX29wczsKK307CisKKy8qIFNvQyBtYWNoaW5lIERBSSBjb25maWd1cmF0aW9uLCBnbHVlcyBhIGNvZGVjIGFuZCBjcHUgREFJIHRvZ2V0aGVyICovCitzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAgeworCWNoYXIgKm5hbWU7CQkJLyogQ29kZWMgbmFtZSAqLworCWNoYXIgKnN0cmVhbV9uYW1lOwkJLyogU3RyZWFtIG5hbWUgKi8KKworCS8qIERBSSAqLworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWk7CisKKwkvKiBtYWNoaW5lIHN0cmVhbSBvcGVyYXRpb25zICovCisJc3RydWN0IHNuZF9zb2Nfb3BzICpvcHM7CisKKwkvKiBjb2RlYy9tYWNoaW5lIHNwZWNpZmljIGluaXQgLSBlLmcuIGFkZCBtYWNoaW5lIGNvbnRyb2xzICovCisJaW50ICgqaW5pdCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK307CisKKy8qIFNvQyBtYWNoaW5lICovCitzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHsKKwljaGFyICpuYW1lOworCisJaW50ICgqcHJvYmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCWludCAoKnJlbW92ZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKKwkvKiB0aGUgcHJlIGFuZCBwb3N0IFBNIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBkbyBhbnkgUE0gd29yayBiZWZvcmUgYW5kCisJICogYWZ0ZXIgdGhlIGNvZGVjIGFuZCBEQUkncyBkbyBhbnkgUE0gd29yay4gKi8KKwlpbnQgKCpzdXNwZW5kX3ByZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpzdXNwZW5kX3Bvc3QpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICgqcmVzdW1lX3ByZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJaW50ICgqcmVzdW1lX3Bvc3QpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCisJLyogQ1BVIDwtLT4gQ29kZWMgREFJIGxpbmtzICAqLworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKKwlpbnQgbnVtX2xpbmtzOworfTsKKworLyogU29DIERldmljZSAtIHRoZSBhdWRpbyBzdWJzeXN0ZW0gKi8KK3N0cnVjdCBzbmRfc29jX2RldmljZSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBzbmRfc29jX21hY2hpbmUgKm1hY2hpbmU7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2UgKmNvZGVjX2RldjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGRlbGF5ZWRfd29yazsKKwl2b2lkICpjb2RlY19kYXRhOworfTsKKworLyogcnVudGltZSBjaGFubmVsIGRhdGEgKi8KK3N0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2OworfTsKKworLyogZW51bWVyYXRlZCBrY29udHJvbCAqLworc3RydWN0IHNvY19lbnVtIHsKKwl1bnNpZ25lZCBzaG9ydCByZWc7CisJdW5zaWduZWQgc2hvcnQgcmVnMjsKKwl1bnNpZ25lZCBjaGFyIHNoaWZ0X2w7CisJdW5zaWduZWQgY2hhciBzaGlmdF9yOworCXVuc2lnbmVkIGludCBtYXNrOworCWNvbnN0IGNoYXIgKip0ZXh0czsKKwl2b2lkICpkYXBtOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3R5cGVkZWZzLmggYi9pbmNsdWRlL3NvdW5kL3R5cGVkZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTRiMDIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zb3VuZC90eXBlZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBUeXBlZGVmJ3MgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKGZvciBvdXQtb2Yta2VybmVsIGRyaXZlcnMpCi0gKgotICogVGhpcyBmaWxlIHdpbGwgYmUgcmVtb3ZlZCBzb29uIGluIGZ1dHVyZQotICovCi0KLS8qIGNvcmUgc3R1ZmYgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9jYXJkIHNuZF9jYXJkX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfZGV2aWNlIHNuZF9kZXZpY2VfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIHNuZF9kZXZpY2Vfb3BzX3Q7Ci10eXBlZGVmIGVudW0gc25kX2NhcmRfdHlwZSBzbmRfY2FyZF90eXBlX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfbWlub3Igc25kX21pbm9yX3Q7Ci0KLS8qIGluZm8gKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9pbmZvX2VudHJ5IHNuZF9pbmZvX2VudHJ5X3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgc25kX2luZm9fYnVmZmVyX3Q7Ci0KLS8qIGNvbnRyb2wgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9jdGxfZmlsZSBzbmRfY3RsX2ZpbGVfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9rY29udHJvbCBzbmRfa2NvbnRyb2xfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2tjb250cm9sX25ld190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2tjb250cm9sX3ZvbGF0aWxlIHNuZF9rY29udHJvbF92b2xhdGlsZV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2tjdGxfZXZlbnQgc25kX2tjdGxfZXZlbnRfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9hZXNfaWVjOTU4IHNuZF9hZXNfaWVjOTU4X3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfY3RsX2NhcmRfaW5mbyBzbmRfY3RsX2NhcmRfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIHNuZF9jdGxfZWxlbV9pZF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2xpc3Qgc25kX2N0bF9lbGVtX2xpc3RfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvIHNuZF9jdGxfZWxlbV9pbmZvX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgc25kX2N0bF9lbGVtX3ZhbHVlX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfY3RsX2V2ZW50IHNuZF9jdGxfZXZlbnRfdDsKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTX01PRFVMRSkKLXR5cGVkZWYgc3RydWN0IHNuZF9taXhlcl9vc3Mgc25kX21peGVyX29zc190OwotI2VuZGlmCi0KLS8qIHRpbWVyICovCi10eXBlZGVmIHN0cnVjdCBzbmRfdGltZXIgc25kX3RpbWVyX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2Ugc25kX3RpbWVyX2luc3RhbmNlX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfdGltZXJfaWQgc25kX3RpbWVyX2lkX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfdGltZXJfZ2luZm8gc25kX3RpbWVyX2dpbmZvX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfdGltZXJfZ3BhcmFtcyBzbmRfdGltZXJfZ3BhcmFtc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3RpbWVyX2dzdGF0dXMgc25kX3RpbWVyX2dzdGF0dXNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF90aW1lcl9zZWxlY3Qgc25kX3RpbWVyX3NlbGVjdF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3RpbWVyX2luZm8gc25kX3RpbWVyX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF90aW1lcl9wYXJhbXMgc25kX3RpbWVyX3BhcmFtc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3RpbWVyX3N0YXR1cyBzbmRfdGltZXJfc3RhdHVzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfdGltZXJfcmVhZCBzbmRfdGltZXJfcmVhZF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3RpbWVyX3RyZWFkIHNuZF90aW1lcl90cmVhZF90OwotCi0vKiBQQ00gKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9wY20gc25kX3BjbV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9zdHIgc25kX3BjbV9zdHJfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtIHNuZF9wY21fc3Vic3RyZWFtX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX2luZm8gc25kX3BjbV9pbmZvX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyBzbmRfcGNtX2h3X3BhcmFtc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9zd19wYXJhbXMgc25kX3BjbV9zd19wYXJhbXNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21fY2hhbm5lbF9pbmZvIHNuZF9wY21fY2hhbm5lbF9pbmZvX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX3N0YXR1cyBzbmRfcGNtX3N0YXR1c190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9tbWFwX3N0YXR1cyBzbmRfcGNtX21tYXBfc3RhdHVzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX21tYXBfY29udHJvbCBzbmRfcGNtX21tYXBfY29udHJvbF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX21hc2sgc25kX21hc2tfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZ19idWYgc25kX3BjbV9zZ2J1Zl90OwotCi10eXBlZGVmIHN0cnVjdCBzbmRfaW50ZXJ2YWwgc25kX2ludGVydmFsX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfeGZlcmkgc25kX3hmZXJpX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfeGZlcm4gc25kX3hmZXJuX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfeGZlcnYgc25kX3hmZXJ2X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHNuZF9wY21fZmlsZSBzbmRfcGNtX2ZpbGVfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21fcnVudGltZSBzbmRfcGNtX3J1bnRpbWVfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3BjbV9oYXJkd2FyZV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3BjbV9vcHNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21faHdfcnVsZSBzbmRfcGNtX2h3X3J1bGVfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludHMgc25kX3BjbV9od19jb25zdHJhaW50c190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3JhdG51bSByYXRudW1fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9yYXRkZW4gcmF0ZGVuX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0bnVtcyBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0bnVtc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X3JhdGRlbnMgc25kX3BjbV9od19jb25zdHJhaW50X3JhdGRlbnNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0X3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcGNtX2dyb3VwIHNuZF9wY21fZ3JvdXBfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9wY21fbm90aWZ5IHNuZF9wY21fbm90aWZ5X3Q7Ci0KLS8qIHJhd21pZGkgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9yYXdtaWRpIHNuZF9yYXdtaWRpX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcmF3bWlkaV9pbmZvIHNuZF9yYXdtaWRpX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9yYXdtaWRpX3BhcmFtcyBzbmRfcmF3bWlkaV9wYXJhbXNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9yYXdtaWRpX3N0YXR1cyBzbmRfcmF3bWlkaV9zdGF0dXNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9yYXdtaWRpX3J1bnRpbWUgc25kX3Jhd21pZGlfcnVudGltZV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtIHNuZF9yYXdtaWRpX3N1YnN0cmVhbV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3Jhd21pZGlfc3RyIHNuZF9yYXdtaWRpX3N0cl90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3Jhd21pZGlfb3BzIHNuZF9yYXdtaWRpX29wc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3Jhd21pZGlfZ2xvYmFsX29wcyBzbmRfcmF3bWlkaV9nbG9iYWxfb3BzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfcmF3bWlkaV9maWxlIHNuZF9yYXdtaWRpX2ZpbGVfdDsKLQotLyogaHdkZXAgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9od2RlcCBzbmRfaHdkZXBfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9od2RlcF9pbmZvIHNuZF9od2RlcF9pbmZvX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfaHdkZXBfZHNwX3N0YXR1cyBzbmRfaHdkZXBfZHNwX3N0YXR1c190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2h3ZGVwX2RzcF9pbWFnZSBzbmRfaHdkZXBfZHNwX2ltYWdlX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfaHdkZXBfb3BzIHNuZF9od2RlcF9vcHNfdDsKLQotLyogc2VxdWVuY2VyICovCi10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyBzbmRfc2VxX3BvcnRfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2V2ZW50IHNuZF9zZXFfZXZlbnRfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfYWRkciBzbmRfc2VxX2FkZHJfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfdm9sdW1lIHNuZF9zZXFfZXZfdm9sdW1lX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2V2X2xvb3Agc25kX3NlcV9ldl9sb29wX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3JlbW92ZV9ldmVudHMgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3F1ZXJ5X3N1YnMgc25kX3NlcV9xdWVyeV9zdWJzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3N5c3RlbV9pbmZvIHNuZF9zZXFfc3lzdGVtX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8gc25kX3NlcV9jbGllbnRfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvIHNuZF9zZXFfcXVldWVfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXMgc25kX3NlcV9xdWV1ZV9zdGF0dXNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfcXVldWVfdGVtcG8gc25kX3NlcV9xdWV1ZV90ZW1wb190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9vd25lciBzbmRfc2VxX3F1ZXVlX293bmVyX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RpbWVyIHNuZF9zZXFfcXVldWVfdGltZXJfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfcXVldWVfY2xpZW50IHNuZF9zZXFfcXVldWVfY2xpZW50X3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb29sIHNuZF9zZXFfY2xpZW50X3Bvb2xfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfaW5zdHIgc25kX3NlcV9pbnN0cl90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9pbnN0cl9kYXRhIHNuZF9zZXFfaW5zdHJfZGF0YV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9pbnN0cl9oZWFkZXIgc25kX3NlcV9pbnN0cl9oZWFkZXJfdDsKLQotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV91c2VyX2NsaWVudCB1c2VyX2NsaWVudF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9rZXJuZWxfY2xpZW50IGtlcm5lbF9jbGllbnRfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfY2xpZW50IGNsaWVudF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSBxdWV1ZV90OwotCi0vKiBzZXFfZGV2aWNlICovCi10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2RldmljZSBzbmRfc2VxX2RldmljZV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9kZXZfb3BzIHNuZF9zZXFfZGV2X29wc190OwotCi0vKiBzZXFfbWlkaSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX21pZGlfZXZlbnQgc25kX21pZGlfZXZlbnRfdDsKLQotLyogc2VxX21pZGlfZW11bCAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX21pZGlfY2hhbm5lbCBzbmRfbWlkaV9jaGFubmVsX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfbWlkaV9jaGFubmVsX3NldCBzbmRfbWlkaV9jaGFubmVsX3NldF90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX21pZGlfb3Agc25kX21pZGlfb3BfdDsKLQotLyogc2VxX29zcyAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9vc3NfYXJnIHNuZF9zZXFfb3NzX2FyZ190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9vc3NfY2FsbGJhY2sgc25kX3NlcV9vc3NfY2FsbGJhY2tfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfb3NzX3JlZyBzbmRfc2VxX29zc19yZWdfdDsKLQotLyogdmlybWlkaSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3Zpcm1pZGlfZGV2IHNuZF92aXJtaWRpX2Rldl90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX3Zpcm1pZGkgc25kX3Zpcm1pZGlfdDsKLQotLyogc2VxX2luc3RyICovCi10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2tjbHVzdGVyIHNuZF9zZXFfa2NsdXN0ZXJfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfa2luc3RyX29wcyBzbmRfc2VxX2tpbnN0cl9vcHNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9zZXFfa2luc3RyIHNuZF9zZXFfa2luc3RyX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2tpbnN0cl9saXN0IHNuZF9zZXFfa2luc3RyX2xpc3RfdDsKLQotLyogYWM5NyAqLwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2FjOTdfYnVzIGFjOTdfYnVzX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfYWM5N19idXNfb3BzIGFjOTdfYnVzX29wc190OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2FjOTdfdGVtcGxhdGUgYWM5N190ZW1wbGF0ZV90OwotdHlwZWRlZiBzdHJ1Y3Qgc25kX2FjOTcgYWM5N190OwotCi0vKiBvcGwzLzQgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9vcGwzIG9wbDNfdDsKLXR5cGVkZWYgc3RydWN0IHNuZF9vcGw0IG9wbDRfdDsKLQotLyogbXB1NDAxICovCi10eXBlZGVmIHN0cnVjdCBzbmRfbXB1NDAxIG1wdTQwMV90OwotCi0vKiBpMmMgKi8KLXR5cGVkZWYgc3RydWN0IHNuZF9pMmNfZGV2aWNlIHNuZF9pMmNfZGV2aWNlX3Q7Ci10eXBlZGVmIHN0cnVjdCBzbmRfaTJjX2J1cyBzbmRfaTJjX2J1c190OwotCi10eXBlZGVmIHN0cnVjdCBzbmRfYWs0NTMxIGFrNDUzMV90OwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3ZlcnNpb24uaCBiL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oCmluZGV4IDIwZjdiYWIuLmMzOWIzODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oCkBAIC0xLDMgKzEsMyBAQAogLyogaW5jbHVkZS92ZXJzaW9uLmguICBHZW5lcmF0ZWQgYnkgYWxzYS9rc3luYyBzY3JpcHQuICAqLwotI2RlZmluZSBDT05GSUdfU05EX1ZFUlNJT04gIjEuMC4xNHJjMSIKLSNkZWZpbmUgQ09ORklHX1NORF9EQVRFICIgKFR1ZSBKYW4gMDkgMDk6NTY6MTcgMjAwNyBVVEMpIgorI2RlZmluZSBDT05GSUdfU05EX1ZFUlNJT04gIjEuMC4xNHJjMiIKKyNkZWZpbmUgQ09ORklHX1NORF9EQVRFICIgKEZyaSBGZWIgMDkgMTM6NTA6MTAgMjAwNyBVVEMpIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC92eF9jb3JlLmggYi9pbmNsdWRlL3NvdW5kL3Z4X2NvcmUuaAppbmRleCAyMTczOTQ2Li40ODMwNjUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3Z4X2NvcmUuaAorKysgYi9pbmNsdWRlL3NvdW5kL3Z4X2NvcmUuaApAQCAtMTI4LDcgKzEyOCw3IEBACiAJdW5zaWduZWQgaW50IG51bV9pbnM7CiAJdW5zaWduZWQgaW50IG51bV9vdXRzOwogCXVuc2lnbmVkIGludCBvdXRwdXRfbGV2ZWxfbWF4OwotCXVuc2lnbmVkIGludCAqb3V0cHV0X2xldmVsX2RiX3NjYWxlOworCWNvbnN0IHVuc2lnbmVkIGludCAqb3V0cHV0X2xldmVsX2RiX3NjYWxlOwogfTsKIAogLyogaHdkZXAgaWQgc3RyaW5nICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3ltZnBjaS5oIGIvaW5jbHVkZS9zb3VuZC95bWZwY2kuaAppbmRleCBmMzUxNGVlLi4yMDNkMmI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3ltZnBjaS5oCisrKyBiL2luY2x1ZGUvc291bmQveW1mcGNpLmgKQEAgLTI3MCw2ICsyNzAsNyBAQAogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwogCXN0cnVjdCBzbmRfeW1mcGNpX3ZvaWNlICp2b2ljZXNbMl07CS8qIHBsYXliYWNrIG9ubHkgKi8KIAl1bnNpZ25lZCBpbnQgcnVubmluZzogMSwKKwkJICAgICB1c2VfNDQxX3Nsb3Q6IDEsCiAJICAgICAgICAgICAgIG91dHB1dF9mcm9udDogMSwKIAkgICAgICAgICAgICAgb3V0cHV0X3JlYXI6IDEsCiAJICAgICAgICAgICAgIHN3YXBfcmVhcjogMTsKQEAgLTMyNCw2ICszMjUsNyBAQAogCiAJdTMyIGFjdGl2ZV9iYW5rOwogCXN0cnVjdCBzbmRfeW1mcGNpX3ZvaWNlIHZvaWNlc1s2NF07CisJaW50IHNyYzQ0MV91c2VkOwogCiAJc3RydWN0IHNuZF9hYzk3X2J1cyAqYWM5N19idXM7CiAJc3RydWN0IHNuZF9hYzk3ICphYzk3OwpAQCAtMzQ2LDcgKzM0OCw3IEBACiAJaW50IG1vZGVfZHVwNGNoOwogCWludCByZWFyX29wZW5lZDsKIAlpbnQgc3BkaWZfb3BlbmVkOwotCXN0cnVjdCB7CisJc3RydWN0IHNuZF95bWZwY2lfcGNtX21peGVyIHsKIAkJdTE2IGxlZnQ7CiAJCXUxNiByaWdodDsKIAkJc3RydWN0IHNuZF9rY29udHJvbCAqY3RsOwpAQCAtMzU3LDYgKzM1OSw4IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QgaW50ZXJydXB0X3NsZWVwOwogCWF0b21pY190IGludGVycnVwdF9zbGVlcF9jb3VudDsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnByb2NfZW50cnk7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpkc3BfbWljcm9jb2RlOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqY29udHJvbGxlcl9taWNyb2NvZGU7CiAKICNpZmRlZiBDT05GSUdfUE0KIAl1MzIgKnNhdmVkX3JlZ3M7CmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmMgYi9tbS9maWxlbWFwLmMKaW5kZXggODMzMmM3Ny4uZjMwZWYyOCAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtNjA2LDI2ICs2MDYsNiBAQAogRVhQT1JUX1NZTUJPTChmaW5kX2dldF9wYWdlKTsKIAogLyoqCi0gKiBmaW5kX3RyeWxvY2tfcGFnZSAtIGZpbmQgYW5kIGxvY2sgYSBwYWdlCi0gKiBAbWFwcGluZzogdGhlIGFkZHJlc3Nfc3BhY2UgdG8gc2VhcmNoCi0gKiBAb2Zmc2V0OiB0aGUgcGFnZSBpbmRleAotICoKLSAqIFNhbWUgYXMgZmluZF9nZXRfcGFnZSgpLCBidXQgdHJ5bG9jayBpdCBpbnN0ZWFkIG9mIGluY3JlbWVudGluZyB0aGUgY291bnQuCi0gKi8KLXN0cnVjdCBwYWdlICpmaW5kX3RyeWxvY2tfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgdW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQlyZWFkX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCXBhZ2UgPSByYWRpeF90cmVlX2xvb2t1cCgmbWFwcGluZy0+cGFnZV90cmVlLCBvZmZzZXQpOwotCWlmIChwYWdlICYmIFRlc3RTZXRQYWdlTG9ja2VkKHBhZ2UpKQotCQlwYWdlID0gTlVMTDsKLQlyZWFkX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7Ci0JcmV0dXJuIHBhZ2U7Ci19Ci1FWFBPUlRfU1lNQk9MKGZpbmRfdHJ5bG9ja19wYWdlKTsKLQotLyoqCiAgKiBmaW5kX2xvY2tfcGFnZSAtIGxvY2F0ZSwgcGluIGFuZCBsb2NrIGEgcGFnZWNhY2hlIHBhZ2UKICAqIEBtYXBwaW5nOiB0aGUgYWRkcmVzc19zcGFjZSB0byBzZWFyY2gKICAqIEBvZmZzZXQ6IHRoZSBwYWdlIGluZGV4CmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IDdkZmM5NDkuLjkxNTY1NzggMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCisrKyBiL25ldC9LY29uZmlnCkBAIC0zNyw2ICszNyw3IEBACiBzb3VyY2UgIm5ldC9wYWNrZXQvS2NvbmZpZyIKIHNvdXJjZSAibmV0L3VuaXgvS2NvbmZpZyIKIHNvdXJjZSAibmV0L3hmcm0vS2NvbmZpZyIKK3NvdXJjZSAibmV0L2l1Y3YvS2NvbmZpZyIKIAogY29uZmlnIElORVQKIAlib29sICJUQ1AvSVAgbmV0d29ya2luZyIKZGlmZiAtLWdpdCBhL25ldC9NYWtlZmlsZSBiL25ldC9NYWtlZmlsZQppbmRleCBhZDRkMTRmLi40ODU0YWM1IDEwMDY0NAotLS0gYS9uZXQvTWFrZWZpbGUKKysrIGIvbmV0L01ha2VmaWxlCkBAIC00Nyw2ICs0Nyw3IEBACiBvYmotJChDT05GSUdfSUVFRTgwMjExKQkJKz0gaWVlZTgwMjExLwogb2JqLSQoQ09ORklHX1RJUEMpCQkrPSB0aXBjLwogb2JqLSQoQ09ORklHX05FVExBQkVMKQkJKz0gbmV0bGFiZWwvCitvYmotJChDT05GSUdfSVVDVikJCSs9IGl1Y3YvCiAKIGlmZXEgKCQoQ09ORklHX05FVCkseSkKIG9iai0kKENPTkZJR19TWVNDVEwpCQkrPSBzeXNjdGxfbmV0Lm8KZGlmZiAtLWdpdCBhL25ldC9hdG0vY29tbW9uLmMgYi9uZXQvYXRtL2NvbW1vbi5jCmluZGV4IGZiYWJmZjQuLmEyODc4ZTkgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vY29tbW9uLmMKKysrIGIvbmV0L2F0bS9jb21tb24uYwpAQCAtODE2LDcgKzgxNiw4IEBACiAJcHJvdG9fdW5yZWdpc3RlcigmdmNjX3Byb3RvKTsKIH0KIAotbW9kdWxlX2luaXQoYXRtX2luaXQpOworc3Vic3lzX2luaXRjYWxsKGF0bV9pbml0KTsKKwogbW9kdWxlX2V4aXQoYXRtX2V4aXQpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oIGIvbmV0L2JsdWV0b290aC9oaWRwL2hpZHAuaAppbmRleCBjMjc3NWY1Li5jOGRmYWNkIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmgKQEAgLTg2LDcgKzg2LDcgQEAKIAlpbnQgICBpbnRyX3NvY2s7CS8vIENvbm50ZXRlZCBpbnRlcnJ1cHQgc29ja2V0CiAJX191MTYgcGFyc2VyOwogCV9fdTE2IHJkX3NpemU7Ci0JX191OCAqcmRfZGF0YTsKKwlfX3U4IF9fdXNlciAqcmRfZGF0YTsKIAlfX3U4ICBjb3VudHJ5OwogCV9fdTggIHN1YmNsYXNzOwogCV9fdTE2IHZlbmRvcjsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvc29jay5jCmluZGV4IDQwN2ZiYTQuLjkzY2Y5ZTUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL3NvY2suYwpAQCAtMTg5LDcgKzE4OSw3IEBACiAKIAkJdWNhID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp1Y2EpKTsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNhLCAodm9pZCAqKSBhcmcsIHNpemVvZihjYSkpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNhLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY2EpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWlmIChwdXRfdXNlcihjYS5jdHJsX3NvY2ssICZ1Y2EtPmN0cmxfc29jaykgfHwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCmluZGV4IGVhMzMzN2EuLmEyNWZhOGMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwpAQCAtOTQ5LDQ0ICs5NDksMjkgQEAKIH07CiAjZW5kaWYKIAotaW50IGJyX25ldGZpbHRlcl9pbml0KHZvaWQpCitpbnQgX19pbml0IGJyX25ldGZpbHRlcl9pbml0KHZvaWQpCiB7Ci0JaW50IGk7CisJaW50IHJldDsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJyX25mX29wcyk7IGkrKykgewotCQlpbnQgcmV0OwotCi0JCWlmICgocmV0ID0gbmZfcmVnaXN0ZXJfaG9vaygmYnJfbmZfb3BzW2ldKSkgPj0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCXdoaWxlIChpLS0pCi0JCQluZl91bnJlZ2lzdGVyX2hvb2soJmJyX25mX29wc1tpXSk7Ci0KKwlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rcyhicl9uZl9vcHMsIEFSUkFZX1NJWkUoYnJfbmZfb3BzKSk7CisJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JfQotCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCWJybmZfc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShicm5mX25ldF90YWJsZSwgMCk7CiAJaWYgKGJybmZfc3lzY3RsX2hlYWRlciA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJicl9uZXRmaWx0ZXI6IGNhbid0IHJlZ2lzdGVyIHRvIHN5c2N0bC5cbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShicl9uZl9vcHMpOyBpKyspCi0JCQluZl91bnJlZ2lzdGVyX2hvb2soJmJyX25mX29wc1tpXSk7Ci0JCXJldHVybiAtRUZBVUxUOworCQluZl91bnJlZ2lzdGVyX2hvb2tzKGJyX25mX29wcywgQVJSQVlfU0laRShicl9uZl9vcHMpKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogI2VuZGlmCi0KIAlwcmludGsoS0VSTl9OT1RJQ0UgIkJyaWRnZSBmaXJld2FsbGluZyByZWdpc3RlcmVkXG4iKTsKLQogCXJldHVybiAwOwogfQogCiB2b2lkIGJyX25ldGZpbHRlcl9maW5pKHZvaWQpCiB7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSBBUlJBWV9TSVpFKGJyX25mX29wcykgLSAxOyBpID49IDA7IGktLSkKLQkJbmZfdW5yZWdpc3Rlcl9ob29rKCZicl9uZl9vcHNbaV0pOworCW5mX3VucmVnaXN0ZXJfaG9va3MoYnJfbmZfb3BzLCBBUlJBWV9TSVpFKGJyX25mX29wcykpOwogI2lmZGVmIENPTkZJR19TWVNDVEwKIAl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShicm5mX3N5c2N0bF9oZWFkZXIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCmluZGV4IGE5MTM5NjguLjdkNjhiMjQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCkBAIC00NSw3ICs0NSw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqaGRyKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJaGRyID0gbmxtc2dfZGF0YShubGgpOwogCWhkci0+aWZpX2ZhbWlseSA9IEFGX0JSSURHRTsKQEAgLTcyLDcgKzcyLDggQEAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAogbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogLyoKQEAgLTg5LDkgKzkwLDEyIEBACiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gYnJfZmlsbF9pZmluZm8oc2tiLCBwb3J0LCAwLCAwLCBldmVudCwgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBicl9ubG1zZ19zaXplKCkgKi8KLQlCVUdfT04oZXJyIDwgMCk7Ci0KKwlpZiAoZXJyIDwgMCkgeworCQkvKiAtRU1TR1NJWkUgaW1wbGllcyBCVUcgaW4gYnJfbmxtc2dfc2l6ZSgpICovCisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVycm91dDsKKwl9CiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0xJTkssIE5VTEwsIEdGUF9BVE9NSUMpOwogZXJyb3V0OgogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYwppbmRleCBlNGM2NDI0Li42YWZhNGQwIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYwpAQCAtOTMsNiArOTMsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCAmJgogCQkgICAgaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19VRFAgJiYKKwkJICAgIGluZm8tPnByb3RvY29sICE9IElQUFJPVE9fVURQTElURSAmJgogCQkgICAgaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19TQ1RQICYmCiAJCSAgICBpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX0RDQ1ApCiAJCQkgcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKaW5kZXggYTE4NGY4Ny4uOTg1ZGY4MiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwpAQCAtOTYsNiArOTYsNyBAQAogCQkgICAgICAgTklQUVVBRChpaC0+ZGFkZHIpLCBpaC0+dG9zLCBpaC0+cHJvdG9jb2wpOwogCQlpZiAoaWgtPnByb3RvY29sID09IElQUFJPVE9fVENQIHx8CiAJCSAgICBpaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFAgfHwKKwkJICAgIGloLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUExJVEUgfHwKIAkJICAgIGloLT5wcm90b2NvbCA9PSBJUFBST1RPX1NDVFAgfHwKIAkJICAgIGloLT5wcm90b2NvbCA9PSBJUFBST1RPX0RDQ1ApIHsKIAkJCXN0cnVjdCB0Y3B1ZHBoZHIgX3BvcnRzLCAqcHB0cjsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggNDU1ZDU4OS4uMWU5NGExYiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTMyNDcsNyArMzI0Nyw3IEBACiAgKgl1bnJlZ2lzdGVyX25ldGRldigpIGluc3RlYWQgb2YgdGhpcy4KICAqLwogCi1pbnQgdW5yZWdpc3Rlcl9uZXRkZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgdW5yZWdpc3Rlcl9uZXRkZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZCwgKipkcDsKIApAQCAtMzI1OCw3ICszMjU4LDkgQEAKIAlpZiAoZGV2LT5yZWdfc3RhdGUgPT0gTkVUUkVHX1VOSU5JVElBTElaRUQpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgInVucmVnaXN0ZXJfbmV0ZGV2aWNlOiBkZXZpY2UgJXMvJXAgbmV2ZXIgIgogCQkJCSAgIndhcyByZWdpc3RlcmVkXG4iLCBkZXYtPm5hbWUsIGRldik7Ci0JCXJldHVybiAtRU5PREVWOworCisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKIAl9CiAKIAlCVUdfT04oZGV2LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1JFR0lTVEVSRUQpOwpAQCAtMzI4MCwxMSArMzI4Miw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAoIWQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1bnJlZ2lzdGVyIG5ldF9kZXZpY2U6ICclcycgbm90IGZvdW5kXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCUJVR19PTighZCk7CiAKIAlkZXYtPnJlZ19zdGF0ZSA9IE5FVFJFR19VTlJFR0lTVEVSSU5HOwogCkBAIC0zMzE2LDcgKzMzMTQsNiBAQAogCXN5bmNocm9uaXplX25ldCgpOwogCiAJZGV2X3B1dChkZXYpOwotCXJldHVybiAwOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RzdC5jIGIvbmV0L2NvcmUvZHN0LmMKaW5kZXggODM2ZWM2Ni4uMWE1M2ZiMyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZHN0LmMKKysrIGIvbmV0L2NvcmUvZHN0LmMKQEAgLTk5LDcgKzk5LDE0IEBACiAJcHJpbnRrKCJkc3RfdG90YWw6ICVkLyVkICVsZFxuIiwKIAkgICAgICAgYXRvbWljX3JlYWQoJmRzdF90b3RhbCksIGRlbGF5ZWQsICBkc3RfZ2NfdGltZXJfZXhwaXJlcyk7CiAjZW5kaWYKLQltb2RfdGltZXIoJmRzdF9nY190aW1lciwgamlmZmllcyArIGRzdF9nY190aW1lcl9leHBpcmVzKTsKKwkvKiBpZiB0aGUgbmV4dCBkZXNpcmVkIHRpbWVyIGlzIG1vcmUgdGhhbiA0IHNlY29uZHMgaW4gdGhlIGZ1dHVyZQorCSAqIHRoZW4gcm91bmQgdGhlIHRpbWVyIHRvIHdob2xlIHNlY29uZHMKKwkgKi8KKwlpZiAoZHN0X2djX3RpbWVyX2V4cGlyZXMgPiA0KkhaKQorCQltb2RfdGltZXIoJmRzdF9nY190aW1lciwKKwkJCXJvdW5kX2ppZmZpZXMoamlmZmllcyArIGRzdF9nY190aW1lcl9leHBpcmVzKSk7CisJZWxzZQorCQltb2RfdGltZXIoJmRzdF9nY190aW1lciwgamlmZmllcyArIGRzdF9nY190aW1lcl9leHBpcmVzKTsKIAogb3V0OgogCXNwaW5fdW5sb2NrKCZkc3RfbG9jayk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9maWJfcnVsZXMuYyBiL25ldC9jb3JlL2ZpYl9ydWxlcy5jCmluZGV4IDFkZjZjZDQ1Li4yMTVmMWJmZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmliX3J1bGVzLmMKKysrIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKQEAgLTMzMSw3ICszMzEsNyBAQAogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIHR5cGUsIHNpemVvZigqZnJoKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJZnJoID0gbmxtc2dfZGF0YShubGgpOwogCWZyaC0+dGFibGUgPSBydWxlLT50YWJsZTsKQEAgLTM1OSw3ICszNTksOCBAQAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCiBubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiBpbnQgZmliX3J1bGVzX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLCBpbnQgZmFtaWx5KQpAQCAtNDA1LDkgKzQwNiwxMiBAQAogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IGZpYl9ubF9maWxsX3J1bGUoc2tiLCBydWxlLCBwaWQsIG5saC0+bmxtc2dfc2VxLCBldmVudCwgMCwgb3BzKTsKLQkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGZpYl9ydWxlX25sbXNnX3NpemUoKSAqLwotCUJVR19PTihlcnIgPCAwKTsKLQorCWlmIChlcnIgPCAwKSB7CisJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBmaWJfcnVsZV9ubG1zZ19zaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX25vdGlmeShza2IsIHBpZCwgb3BzLT5ubGdyb3VwLCBubGgsIEdGUF9LRVJORUwpOwogZXJyb3V0OgogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwppbmRleCBlNzMwMGI2Li4wNTRkNDY0IDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZWlnaGJvdXIuYworKysgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwpAQCAtNjk2LDcgKzY5NiwxMCBAQAogCWlmICghZXhwaXJlKQogCQlleHBpcmUgPSAxOwogCi0gCW1vZF90aW1lcigmdGJsLT5nY190aW1lciwgbm93ICsgZXhwaXJlKTsKKwlpZiAoZXhwaXJlPkhaKQorCQltb2RfdGltZXIoJnRibC0+Z2NfdGltZXIsIHJvdW5kX2ppZmZpZXMobm93ICsgZXhwaXJlKSk7CisJZWxzZQorCQltb2RfdGltZXIoJnRibC0+Z2NfdGltZXIsIG5vdyArIGV4cGlyZSk7CiAKIAl3cml0ZV91bmxvY2soJnRibC0+bG9jayk7CiB9CkBAIC0xNjM3LDcgKzE2NDAsNyBAQAogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIHR5cGUsIHNpemVvZigqbmR0bXNnKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJbmR0bXNnID0gbmxtc2dfZGF0YShubGgpOwogCkBAIC0xNzA2LDcgKzE3MDksOCBAQAogCiBubGFfcHV0X2ZhaWx1cmU6CiAJcmVhZF91bmxvY2tfYmgoJnRibC0+bG9jayk7Ci0JcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiBzdGF0aWMgaW50IG5laWdodGJsX2ZpbGxfcGFyYW1faW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTcyMCw3ICsxNzI0LDcgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCB0eXBlLCBzaXplb2YoKm5kdG1zZyksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCW5kdG1zZyA9IG5sbXNnX2RhdGEobmxoKTsKIApAQCAtMTczNyw3ICsxNzQxLDggQEAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIGVycm91dDoKIAlyZWFkX3VubG9ja19iaCgmdGJsLT5sb2NrKTsKLQlyZXR1cm4gbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCXJldHVybiAtRU1TR1NJWkU7CiB9CiAgCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZWlnaF9wYXJtcyAqbG9va3VwX25laWdoX3BhcmFtcyhzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwKQEAgLTE5NTUsNyArMTk2MCw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgdHlwZSwgc2l6ZW9mKCpuZG0pLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAluZG0gPSBubG1zZ19kYXRhKG5saCk7CiAJbmRtLT5uZG1fZmFtaWx5CSA9IG5laWdoLT5vcHMtPmZhbWlseTsKQEAgLTE5ODcsNyArMTk5Miw4IEBACiAJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiAKIG5sYV9wdXRfZmFpbHVyZToKLQlyZXR1cm4gbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKIApAQCAtMjQyOSw5ICsyNDM1LDEyIEBACiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gbmVpZ2hfZmlsbF9pbmZvKHNrYiwgbiwgMCwgMCwgdHlwZSwgZmxhZ3MpOwotCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gbmVpZ2hfbmxtc2dfc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIG5laWdoX25sbXNnX3NpemUoKSAqLworCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBlcnJvdXQ7CisJfQogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgMCwgUlROTEdSUF9ORUlHSCwgTlVMTCwgR0ZQX0FUT01JQyk7CiBlcnJvdXQ6CiAJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9uZXQvY29yZS9ydG5ldGxpbmsuYyBiL25ldC9jb3JlL3J0bmV0bGluay5jCmluZGV4IGU3NjUzOWEuLjliZjlhZTAgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3J0bmV0bGluay5jCisrKyBiL25ldC9jb3JlL3J0bmV0bGluay5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCB0eXBlLCBzaXplb2YoKmlmbSksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCWlmbSA9IG5sbXNnX2RhdGEobmxoKTsKIAlpZm0tPmlmaV9mYW1pbHkgPSBBRl9VTlNQRUM7CkBAIC0zODQsNyArMzg0LDggQEAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAogbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogc3RhdGljIGludCBydG5sX2R1bXBfaWZpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKQEAgLTYzMyw5ICs2MzQsMTIgQEAKIAogCWVyciA9IHJ0bmxfZmlsbF9pZmluZm8obnNrYiwgZGV2LCBpdywgaXdfYnVmX2xlbiwgUlRNX05FV0xJTkssCiAJCQkgICAgICAgTkVUTElOS19DQihza2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsIDAsIDApOwotCS8qIGZhaWx1cmUgaW1waWxpZXMgQlVHIGluIGlmX25sbXNnX3NpemUgb3Igd2lyZWxlc3NfcnRuZXRsaW5rX2dldCAqLwotCUJVR19PTihlcnIgPCAwKTsKLQorCWlmIChlcnIgPCAwKSB7CisJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBpZl9ubG1zZ19zaXplICovCisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihuc2tiKTsKKwkJZ290byBlcnJvdXQ7CisJfQogCWVyciA9IHJ0bmxfdW5pY2FzdChuc2tiLCBORVRMSU5LX0NCKHNrYikucGlkKTsKIGVycm91dDoKIAlrZnJlZShpd19idWYpOwpAQCAtNjc4LDkgKzY4MiwxMiBAQAogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IHJ0bmxfZmlsbF9pZmluZm8oc2tiLCBkZXYsIE5VTEwsIDAsIHR5cGUsIDAsIDAsIGNoYW5nZSwgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpZl9ubG1zZ19zaXplKCkgKi8KLQlCVUdfT04oZXJyIDwgMCk7Ci0KKwlpZiAoZXJyIDwgMCkgeworCQkvKiAtRU1TR1NJWkUgaW1wbGllcyBCVUcgaW4gaWZfbmxtc2dfc2l6ZSgpICovCisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVycm91dDsKKwl9CiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0xJTkssIE5VTEwsIEdGUF9LRVJORUwpOwogZXJyb3V0OgogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKaW5kZXggNDA0MDJjNS4uNWM0NTJhMyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYworKysgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCkBAIC00NzksNyArNDc5LDggQEAKIAogCQkJY2NpZDNfcHJfZGVidWcoIiVzKCVwKSwgcz0ldSwgd19pbml0PSVsbHUsICIKIAkJCQkgICAgICAgIlJfc2FtcGxlPSVkdXMsIFg9JXVcbiIsIGRjY3Bfcm9sZShzayksCi0JCQkJICAgICAgIHNrLCBoY3R4LT5jY2lkM2hjdHhfcywgd19pbml0LAorCQkJCSAgICAgICBzaywgaGN0eC0+Y2NpZDNoY3R4X3MsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpd19pbml0LAogCQkJCSAgICAgICAoaW50KXJfc2FtcGxlLAogCQkJCSAgICAgICAodW5zaWduZWQpKGhjdHgtPmNjaWQzaGN0eF94ID4+IDYpKTsKIApAQCAtMTAwNSw3ICsxMDA2LDcgQEAKIAkJRENDUF9CVUdfT04ocl9zYW1wbGUgPCAwKTsKIAkJaWYgKHVubGlrZWx5KHJfc2FtcGxlIDw9IHRfZWxhcHNlZCkpCiAJCQlEQ0NQX1dBUk4oInJfc2FtcGxlPSVsZHVzLCB0X2VsYXBzZWQ9JWxkdXNcbiIsCi0JCQkJICByX3NhbXBsZSwgdF9lbGFwc2VkKTsKKwkJCQkgIChsb25nKXJfc2FtcGxlLCAobG9uZyl0X2VsYXBzZWQpOwogCQllbHNlCiAJCQlyX3NhbXBsZSAtPSB0X2VsYXBzZWQ7CiAJCUNDSUQzX1JUVF9TQU5JVFlfQ0hFQ0socl9zYW1wbGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2NC5jIGIvbmV0L2RjY3AvaXB2NC5jCmluZGV4IDkwYzc0YjQuLmZhMmM5ODIgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjQuYworKysgYi9uZXQvZGNjcC9pcHY0LmMKQEAgLTcyLDcgKzcyLDcgQEAKIAl0bXAgPSBpcF9yb3V0ZV9jb25uZWN0KCZydCwgbmV4dGhvcCwgaW5ldC0+c2FkZHIsCiAJCQkgICAgICAgUlRfQ09OTl9GTEFHUyhzayksIHNrLT5za19ib3VuZF9kZXZfaWYsCiAJCQkgICAgICAgSVBQUk9UT19EQ0NQLAotCQkJICAgICAgIGluZXQtPnNwb3J0LCB1c2luLT5zaW5fcG9ydCwgc2spOworCQkJICAgICAgIGluZXQtPnNwb3J0LCB1c2luLT5zaW5fcG9ydCwgc2ssIDEpOwogCWlmICh0bXAgPCAwKQogCQlyZXR1cm4gdG1wOwogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY2LmMgYi9uZXQvZGNjcC9pcHY2LmMKaW5kZXggNmI5MWE5ZC4uNzkxNDBiMyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2Ni5jCisrKyBiL25ldC9kY2NwL2lwdjYuYwpAQCAtMTA0MSw3ICsxMDQxLDcgQEAKIAlpZiAoZmluYWxfcCkKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGZpbmFsX3ApOwogCi0JZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCk7CisJZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZmFpbHVyZTsKIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvcHJvdG8uYyBiL25ldC9kY2NwL3Byb3RvLmMKaW5kZXggNjNiM2ZhMi4uNDg0Mzg1NiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvcHJvdG8uYworKysgYi9uZXQvZGNjcC9wcm90by5jCkBAIC0xMDI0LDcgKzEwMjQsNiBAQAogCWRvIHsKIAkJZGNjcF9oYXNoaW5mby5laGFzaF9zaXplID0gKDFVTCA8PCBlaGFzaF9vcmRlcikgKiBQQUdFX1NJWkUgLwogCQkJCQlzaXplb2Yoc3RydWN0IGluZXRfZWhhc2hfYnVja2V0KTsKLQkJZGNjcF9oYXNoaW5mby5laGFzaF9zaXplID4+PSAxOwogCQl3aGlsZSAoZGNjcF9oYXNoaW5mby5laGFzaF9zaXplICYKIAkJICAgICAgIChkY2NwX2hhc2hpbmZvLmVoYXNoX3NpemUgLSAxKSkKIAkJCWRjY3BfaGFzaGluZm8uZWhhc2hfc2l6ZS0tOwpAQCAtMTAzNyw5ICsxMDM2LDEwIEBACiAJCWdvdG8gb3V0X2ZyZWVfYmluZF9idWNrZXRfY2FjaGVwOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCAoZGNjcF9oYXNoaW5mby5laGFzaF9zaXplIDw8IDEpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZGNjcF9oYXNoaW5mby5laGFzaF9zaXplOyBpKyspIHsKIAkJcndsb2NrX2luaXQoJmRjY3BfaGFzaGluZm8uZWhhc2hbaV0ubG9jayk7CiAJCUlOSVRfSExJU1RfSEVBRCgmZGNjcF9oYXNoaW5mby5laGFzaFtpXS5jaGFpbik7CisJCUlOSVRfSExJU1RfSEVBRCgmZGNjcF9oYXNoaW5mby5laGFzaFtpXS50d2NoYWluKTsKIAl9CiAKIAliaGFzaF9vcmRlciA9IGVoYXNoX29yZGVyOwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9kZXYuYyBiL25ldC9kZWNuZXQvZG5fZGV2LmMKaW5kZXggZWQwODNhYi4uOTBiM2RmZCAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9kZXYuYworKysgYi9uZXQvZGVjbmV0L2RuX2Rldi5jCkBAIC03NDksNyArNzQ5LDcgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCppZm0pLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlpZm0gPSBubG1zZ19kYXRhKG5saCk7CiAJaWZtLT5pZmFfZmFtaWx5ID0gQUZfREVDbmV0OwpAQCAtNzY4LDcgKzc2OCw4IEBACiAJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiAKIG5sYV9wdXRfZmFpbHVyZToKLQlyZXR1cm4gbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKIHN0YXRpYyB2b2lkIGRuX2lmYWRkcl9ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpCkBAIC03ODEsOSArNzgyLDEyIEBACiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gZG5fbmxfZmlsbF9pZmFkZHIoc2tiLCBpZmEsIDAsIDAsIGV2ZW50LCAwKTsKLQkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGRuX2lmYWRkcl9ubG1zZ19zaXplKCkgKi8KLQlCVUdfT04oZXJyIDwgMCk7Ci0KKwlpZiAoZXJyIDwgMCkgeworCQkvKiAtRU1TR1NJWkUgaW1wbGllcyBCVUcgaW4gZG5faWZhZGRyX25sbXNnX3NpemUoKSAqLworCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBlcnJvdXQ7CisJfQogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgMCwgUlROTEdSUF9ERUNuZXRfSUZBRERSLCBOVUxMLCBHRlBfS0VSTkVMKTsKIGVycm91dDoKIAlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fdGFibGUuYyBiL25ldC9kZWNuZXQvZG5fdGFibGUuYwppbmRleCAxM2IyNDIxLi5jMWYwY2MxIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX3RhYmxlLmMKKysrIGIvbmV0L2RlY25ldC9kbl90YWJsZS5jCkBAIC0zNTAsNyArMzUwLDcgQEAKIG5sbXNnX2ZhaWx1cmU6CiBydGF0dHJfZmFpbHVyZToKICAgICAgICAgc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gLUVNU0dTSVpFOwogfQogCiAKQEAgLTM2OCw5ICszNjgsMTIgQEAKICAgICAgICAgZXJyID0gZG5fZmliX2R1bXBfaW5mbyhza2IsIHBpZCwgbmxoLT5ubG1zZ19zZXEsIGV2ZW50LCB0Yl9pZCwKIAkJCSAgICAgICBmLT5mbl90eXBlLCBmLT5mbl9zY29wZSwgJmYtPmZuX2tleSwgeiwKIAkJCSAgICAgICBETl9GSUJfSU5GTyhmKSwgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBkbl9maWJfbmxtc2dfc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGRuX2ZpYl9ubG1zZ19zaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX25vdGlmeShza2IsIHBpZCwgUlROTEdSUF9ERUNuZXRfUk9VVEUsIG5saCwgR0ZQX0tFUk5FTCk7CiBlcnJvdXQ6CiAJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggODY0MDA5Ni4uNTc1MGEyYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKIAkJCSAgICAgICBSVF9DT05OX0ZMQUdTKHNrKSwKIAkJCSAgICAgICBzay0+c2tfYm91bmRfZGV2X2lmLAogCQkJICAgICAgIHNrLT5za19wcm90b2NvbCwKLQkJCSAgICAgICBpbmV0LT5zcG9ydCwgaW5ldC0+ZHBvcnQsIHNrKTsKKwkJCSAgICAgICBpbmV0LT5zcG9ydCwgaW5ldC0+ZHBvcnQsIHNrLCAwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9kYXRhZ3JhbS5jIGIvbmV0L2lwdjQvZGF0YWdyYW0uYwppbmRleCA3YjA2OGE4Li4wMDcyZDc5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9kYXRhZ3JhbS5jCisrKyBiL25ldC9pcHY0L2RhdGFncmFtLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAllcnIgPSBpcF9yb3V0ZV9jb25uZWN0KCZydCwgdXNpbi0+c2luX2FkZHIuc19hZGRyLCBzYWRkciwKIAkJCSAgICAgICBSVF9DT05OX0ZMQUdTKHNrKSwgb2lmLAogCQkJICAgICAgIHNrLT5za19wcm90b2NvbCwKLQkJCSAgICAgICBpbmV0LT5zcG9ydCwgdXNpbi0+c2luX3BvcnQsIHNrKTsKKwkJCSAgICAgICBpbmV0LT5zcG9ydCwgdXNpbi0+c2luX3BvcnQsIHNrLCAxKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCWlmICgocnQtPnJ0X2ZsYWdzICYgUlRDRl9CUk9BRENBU1QpICYmICFzb2NrX2ZsYWcoc2ssIFNPQ0tfQlJPQURDQVNUKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZGV2aW5ldC5jIGIvbmV0L2lwdjQvZGV2aW5ldC5jCmluZGV4IDQ4MGFjZTkuLmM0MDIwMzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2RldmluZXQuYworKysgYi9uZXQvaXB2NC9kZXZpbmV0LmMKQEAgLTExNDAsNyArMTE0MCw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqaWZtKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJaWZtID0gbmxtc2dfZGF0YShubGgpOwogCWlmbS0+aWZhX2ZhbWlseSA9IEFGX0lORVQ7CkBAIC0xMTY3LDcgKzExNjcsOCBAQAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCiBubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiBzdGF0aWMgaW50IGluZXRfZHVtcF9pZmFkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQpAQCAtMTIyNSw5ICsxMjI2LDEyIEBACiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gaW5ldF9maWxsX2lmYWRkcihza2IsIGlmYSwgcGlkLCBzZXEsIGV2ZW50LCAwKTsKLQkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGluZXRfbmxtc2dfc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGluZXRfbmxtc2dfc2l6ZSgpICovCisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVycm91dDsKKwl9CiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCBwaWQsIFJUTkxHUlBfSVBWNF9JRkFERFIsIG5saCwgR0ZQX0tFUk5FTCk7CiBlcnJvdXQ6CiAJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKaW5kZXggZTYzYjhhOS4uYmUxMDI4YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYwpAQCAtMzE0LDkgKzMxNCwxMiBAQAogCWVyciA9IGZpYl9kdW1wX2luZm8oc2tiLCBpbmZvLT5waWQsIHNlcSwgZXZlbnQsIHRiX2lkLAogCQkJICAgIGZhLT5mYV90eXBlLCBmYS0+ZmFfc2NvcGUsIGtleSwgZHN0X2xlbiwKIAkJCSAgICBmYS0+ZmFfdG9zLCBmYS0+ZmFfaW5mbywgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBmaWJfbmxtc2dfc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGZpYl9ubG1zZ19zaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX25vdGlmeShza2IsIGluZm8tPnBpZCwgUlROTEdSUF9JUFY0X1JPVVRFLAogCQkJICBpbmZvLT5ubGgsIEdGUF9LRVJORUwpOwogZXJyb3V0OgpAQCAtOTYwLDcgKzk2Myw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqcnRtKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJcnRtID0gbmxtc2dfZGF0YShubGgpOwogCXJ0bS0+cnRtX2ZhbWlseSA9IEFGX0lORVQ7CkBAIC0xMDMxLDcgKzEwMzQsOCBAQAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCiBubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCmluZGV4IDAwMTdjY2IuLjAyNGFlNTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lnbXAuYworKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTQ1NSw2ICs0NTUsOCBAQAogCQkJc2tiID0gYWRkX2dyaGVhZChza2IsIHBtYywgdHlwZSwgJnBncik7CiAJCQlmaXJzdCA9IDA7CiAJCX0KKwkJaWYgKCFza2IpCisJCQlyZXR1cm4gTlVMTDsKIAkJcHNyYyA9IChfX2JlMzIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUzMikpOwogCQkqcHNyYyA9IHBzZi0+c2ZfaW5hZGRyOwogCQlzY291bnQrKzsgc3RvdGFsKys7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2RpYWcuYyBiL25ldC9pcHY0L2luZXRfZGlhZy5jCmluZGV4IDc3NzYxYWMuLjhhYTdkNTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfZGlhZy5jCisrKyBiL25ldC9pcHY0L2luZXRfZGlhZy5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIHJ0YXR0cl9mYWlsdXJlOgogbmxtc2dfZmFpbHVyZToKIAlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOwotCXJldHVybiAtMTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiBzdGF0aWMgaW50IGluZXRfdHdza19kaWFnX2ZpbGwoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsCkBAIC0yMDksNyArMjA5LDcgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiBubG1zZ19mYWlsdXJlOgogCXNrYl90cmltKHNrYiwgcHJldmlvdXNfdGFpbCAtIHNrYi0+ZGF0YSk7Ci0JcmV0dXJuIC0xOworCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKIHN0YXRpYyBpbnQgc2tfZGlhZ19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTI3NCwxMSArMjc0LDE0IEBACiAJaWYgKCFyZXApCiAJCWdvdG8gb3V0OwogCi0JaWYgKHNrX2RpYWdfZmlsbChzaywgcmVwLCByZXEtPmlkaWFnX2V4dCwKLQkJCSBORVRMSU5LX0NCKGluX3NrYikucGlkLAotCQkJIG5saC0+bmxtc2dfc2VxLCAwLCBubGgpIDw9IDApCi0JCUJVRygpOwotCisJZXJyID0gc2tfZGlhZ19maWxsKHNrLCByZXAsIHJlcS0+aWRpYWdfZXh0LAorCQkJICAgTkVUTElOS19DQihpbl9za2IpLnBpZCwKKwkJCSAgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgpOworCWlmIChlcnIgPCAwKSB7CisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihyZXApOworCQlnb3RvIG91dDsKKwl9CiAJZXJyID0gbmV0bGlua191bmljYXN0KGlkaWFnbmwsIHJlcCwgTkVUTElOS19DQihpbl9za2IpLnBpZCwKIAkJCSAgICAgIE1TR19ET05UV0FJVCk7CiAJaWYgKGVyciA+IDApCkBAIC03NzUsNyArNzc4LDcgQEAKIAkJCXN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3OwogCiAJCQlpbmV0X3R3c2tfZm9yX2VhY2godHcsIG5vZGUsCi0JCQkJICAgICZoYXNoaW5mby0+ZWhhc2hbaSArIGhhc2hpbmZvLT5laGFzaF9zaXplXS5jaGFpbikgeworCQkJCSAgICAmaGVhZC0+dHdjaGFpbikgewogCiAJCQkJaWYgKG51bSA8IHNfbnVtKQogCQkJCQlnb3RvIG5leHRfZHlpbmc7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2hhc2h0YWJsZXMuYyBiL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCmluZGV4IDhjNzljOGEuLjE1MGFjZTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCisrKyBiL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAl3cml0ZV9sb2NrKCZoZWFkLT5sb2NrKTsKIAogCS8qIENoZWNrIFRJTUUtV0FJVCBzb2NrZXRzIGZpcnN0LiAqLwotCXNrX2Zvcl9lYWNoKHNrMiwgbm9kZSwgJihoZWFkICsgaGluZm8tPmVoYXNoX3NpemUpLT5jaGFpbikgeworCXNrX2Zvcl9lYWNoKHNrMiwgbm9kZSwgJmhlYWQtPnR3Y2hhaW4pIHsKIAkJdHcgPSBpbmV0X3R3c2soc2syKTsKIAogCQlpZiAoSU5FVF9UV19NQVRDSChzazIsIGhhc2gsIGFjb29raWUsIHNhZGRyLCBkYWRkciwgcG9ydHMsIGRpZikpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jIGIvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKaW5kZXggOWY0MTRlMy4uYTczY2Y5MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKKysrIGIvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKQEAgLTc4LDggKzc4LDggQEAKIAlpZiAoX19za19kZWxfbm9kZV9pbml0KHNrKSkKIAkJc29ja19wcm90X2RlY191c2Uoc2stPnNrX3Byb3QpOwogCi0JLyogU3RlcCAzOiBIYXNoIFRXIGludG8gVElNRVdBSVQgaGFsZiBvZiBlc3RhYmxpc2hlZCBoYXNoIHRhYmxlLiAqLwotCWluZXRfdHdza19hZGRfbm9kZSh0dywgJihlaGVhZCArIGhhc2hpbmZvLT5laGFzaF9zaXplKS0+Y2hhaW4pOworCS8qIFN0ZXAgMzogSGFzaCBUVyBpbnRvIFRJTUVXQUlUIGNoYWluLiAqLworCWluZXRfdHdza19hZGRfbm9kZSh0dywgJmVoZWFkLT50d2NoYWluKTsKIAlhdG9taWNfaW5jKCZ0dy0+dHdfcmVmY250KTsKIAogCXdyaXRlX3VubG9jaygmZWhlYWQtPmxvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZ3JlLmMgYi9uZXQvaXB2NC9pcF9ncmUuYwppbmRleCA0NzZjYjYwLi41MWM4MzUwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9ncmUuYworKysgYi9uZXQvaXB2NC9pcF9ncmUuYwpAQCAtMTAwOCw3ICsxMDA4LDggQEAKIAkJCQlnb3RvIGRvbmU7CiAJCQlkZXYgPSB0LT5kZXY7CiAJCX0KLQkJZXJyID0gdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJZXJyID0gMDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBpcC5jIGIvbmV0L2lwdjQvaXBpcC5jCmluZGV4IDlkNzE5ZDYuLmRhOGJiZDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwaXAuYworKysgYi9uZXQvaXB2NC9pcGlwLmMKQEAgLTc1NCw3ICs3NTQsOCBAQAogCQkJCWdvdG8gZG9uZTsKIAkJCWRldiA9IHQtPmRldjsKIAkJfQotCQllcnIgPSB1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCQl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCQllcnIgPSAwOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDQ3YmQzYWQxLi45YjA4ZTdhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMzYxLDMyICszNjEsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX1RBUkdFVF9UQ1BNU1MKLQl0cmlzdGF0ZSAiVENQTVNTIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQktLS1oZWxwLS0tCi0JICBUaGlzIG9wdGlvbiBhZGRzIGEgYFRDUE1TUycgdGFyZ2V0LCB3aGljaCBhbGxvd3MgeW91IHRvIGFsdGVyIHRoZQotCSAgTVNTIHZhbHVlIG9mIFRDUCBTWU4gcGFja2V0cywgdG8gY29udHJvbCB0aGUgbWF4aW11bSBzaXplIGZvciB0aGF0Ci0JICBjb25uZWN0aW9uICh1c3VhbGx5IGxpbWl0aW5nIGl0IHRvIHlvdXIgb3V0Z29pbmcgaW50ZXJmYWNlJ3MgTVRVCi0JICBtaW51cyA0MCkuCi0KLQkgIFRoaXMgaXMgdXNlZCB0byBvdmVyY29tZSBjcmltaW5hbGx5IGJyYWluZGVhZCBJU1BzIG9yIHNlcnZlcnMgd2hpY2gKLQkgIGJsb2NrIElDTVAgRnJhZ21lbnRhdGlvbiBOZWVkZWQgcGFja2V0cy4gIFRoZSBzeW1wdG9tcyBvZiB0aGlzCi0JICBwcm9ibGVtIGFyZSB0aGF0IGV2ZXJ5dGhpbmcgd29ya3MgZmluZSBmcm9tIHlvdXIgTGludXgKLQkgIGZpcmV3YWxsL3JvdXRlciwgYnV0IG1hY2hpbmVzIGJlaGluZCBpdCBjYW4gbmV2ZXIgZXhjaGFuZ2UgbGFyZ2UKLQkgIHBhY2tldHM6Ci0JICAJMSkgV2ViIGJyb3dzZXJzIGNvbm5lY3QsIHRoZW4gaGFuZyB3aXRoIG5vIGRhdGEgcmVjZWl2ZWQuCi0JICAJMikgU21hbGwgbWFpbCB3b3JrcyBmaW5lLCBidXQgbGFyZ2UgZW1haWxzIGhhbmcuCi0JICAJMykgc3NoIHdvcmtzIGZpbmUsIGJ1dCBzY3AgaGFuZ3MgYWZ0ZXIgaW5pdGlhbCBoYW5kc2hha2luZy4KLQotCSAgV29ya2Fyb3VuZDogYWN0aXZhdGUgdGhpcyBvcHRpb24gYW5kIGFkZCBhIHJ1bGUgdG8geW91ciBmaXJld2FsbAotCSAgY29uZmlndXJhdGlvbiBsaWtlOgotCi0JICBpcHRhYmxlcyAtQSBGT1JXQVJEIC1wIHRjcCAtLXRjcC1mbGFncyBTWU4sUlNUIFNZTiBcCi0JICAJCSAtaiBUQ1BNU1MgLS1jbGFtcC1tc3MtdG8tcG10dQotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogIyBOQVQgKyBzcGVjaWZpYyB0YXJnZXRzOiBpcF9jb25udHJhY2sKIGNvbmZpZyBJUF9ORl9OQVQKIAl0cmlzdGF0ZSAiRnVsbCBOQVQiCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggMTZkMTc3Yi4uNjYyNWVjNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMTAzLDcgKzEwMyw2IEBACiBvYmotJChDT05GSUdfSVBfTkZfTkFUX1NOTVBfQkFTSUMpICs9IGlwX25hdF9zbm1wX2Jhc2ljLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTE9HKSArPSBpcHRfTE9HLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfVUxPRykgKz0gaXB0X1VMT0cubwotb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9UQ1BNU1MpICs9IGlwdF9UQ1BNU1Mubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVApICs9IGlwdF9DTFVTVEVSSVAubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9UVEwpICs9IGlwdF9UVEwubwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3RjcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYwppbmRleCAwNmU0ZThhLi5jMzRmNDhmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3RjcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMKQEAgLTUwLDEyICs1MCw5IEBACiAgICAgSWYgaXQncyBub24temVybywgd2UgbWFyayBvbmx5IG91dCBvZiB3aW5kb3cgUlNUIHNlZ21lbnRzIGFzIElOVkFMSUQuICovCiBpbnQgaXBfY3RfdGNwX2JlX2xpYmVyYWwgX19yZWFkX21vc3RseSA9IDA7CiAKLS8qIFdoZW4gY29ubmVjdGlvbiBpcyBwaWNrZWQgdXAgZnJvbSB0aGUgbWlkZGxlLCBob3cgbWFueSBwYWNrZXRzIGFyZSByZXF1aXJlZAotICAgdG8gcGFzcyBpbiBlYWNoIGRpcmVjdGlvbiB3aGVuIHdlIGFzc3VtZSB3ZSBhcmUgaW4gc3luYyAtIGlmIGFueSBzaWRlIHVzZXMKLSAgIHdpbmRvdyBzY2FsaW5nLCB3ZSBsb3N0IHRoZSBnYW1lLiAKLSAgIElmIGl0IGlzIHNldCB0byB6ZXJvLCB3ZSBkaXNhYmxlIHBpY2tpbmcgdXAgYWxyZWFkeSBlc3RhYmxpc2hlZCAKKy8qIElmIGl0IGlzIHNldCB0byB6ZXJvLCB3ZSBkaXNhYmxlIHBpY2tpbmcgdXAgYWxyZWFkeSBlc3RhYmxpc2hlZAogICAgY29ubmVjdGlvbnMuICovCi1pbnQgaXBfY3RfdGNwX2xvb3NlIF9fcmVhZF9tb3N0bHkgPSAzOworaW50IGlwX2N0X3RjcF9sb29zZSBfX3JlYWRfbW9zdGx5ID0gMTsKIAogLyogTWF4IG51bWJlciBvZiB0aGUgcmV0cmFuc21pdHRlZCBwYWNrZXRzIHdpdGhvdXQgcmVjZWl2aW5nIGFuIChhY2NlcHRhYmxlKSAKICAgIEFDSyBmcm9tIHRoZSBkZXN0aW5hdGlvbi4gSWYgdGhpcyBudW1iZXIgaXMgcmVhY2hlZCwgYSBzaG9ydGVyIHRpbWVyIApAQCAtNjk0LDExICs2OTEsMTAgQEAKIAkgICAgCWJlZm9yZShzYWNrLCByZWNlaXZlci0+dGRfZW5kICsgMSksCiAJICAgIAlhZnRlcihhY2ssIHJlY2VpdmVyLT50ZF9lbmQgLSBNQVhBQ0tXSU5ET1coc2VuZGVyKSkpOwogCQotCWlmIChzZW5kZXItPmxvb3NlIHx8IHJlY2VpdmVyLT5sb29zZSB8fAotCSAgICAoYmVmb3JlKHNlcSwgc2VuZGVyLT50ZF9tYXhlbmQgKyAxKSAmJgotCSAgICAgYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX2VuZCAtIHJlY2VpdmVyLT50ZF9tYXh3aW4gLSAxKSAmJgotCSAgICAgYmVmb3JlKHNhY2ssIHJlY2VpdmVyLT50ZF9lbmQgKyAxKSAmJgotCSAgICAgYWZ0ZXIoYWNrLCByZWNlaXZlci0+dGRfZW5kIC0gTUFYQUNLV0lORE9XKHNlbmRlcikpKSkgeworCWlmIChiZWZvcmUoc2VxLCBzZW5kZXItPnRkX21heGVuZCArIDEpICYmCisJICAgIGFmdGVyKGVuZCwgc2VuZGVyLT50ZF9lbmQgLSByZWNlaXZlci0+dGRfbWF4d2luIC0gMSkgJiYKKwkgICAgYmVmb3JlKHNhY2ssIHJlY2VpdmVyLT50ZF9lbmQgKyAxKSAmJgorCSAgICBhZnRlcihhY2ssIHJlY2VpdmVyLT50ZF9lbmQgLSBNQVhBQ0tXSU5ET1coc2VuZGVyKSkpIHsKIAkgICAgCS8qCiAJCSAqIFRha2UgaW50byBhY2NvdW50IHdpbmRvdyBzY2FsaW5nIChSRkMgMTMyMykuCiAJCSAqLwpAQCAtNzQzLDE1ICs3MzksMTMgQEAKIAkJCQlzdGF0ZS0+cmV0cmFucyA9IDA7CiAJCQl9CiAJCX0KLQkJLyoKLQkJICogQ2xvc2UgdGhlIHdpbmRvdyBvZiBkaXNhYmxlZCB3aW5kb3cgdHJhY2tpbmcgOi0pCi0JCSAqLwotCQlpZiAoc2VuZGVyLT5sb29zZSkKLQkJCXNlbmRlci0+bG9vc2UtLTsKLQkJCiAJCXJlcyA9IDE7CiAJfSBlbHNlIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKKwkJcmVzID0gMDsKKwkJaWYgKHNlbmRlci0+ZmxhZ3MgJiBJUF9DVF9UQ1BfRkxBR19CRV9MSUJFUkFMIHx8CisJCSAgICBpcF9jdF90Y3BfYmVfbGliZXJhbCkKKwkJCXJlcyA9IDE7CisJCWlmICghcmVzICYmIExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKIAkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAogCQkJImlwX2N0X3RjcDogJXMgIiwKIAkJCWJlZm9yZShzZXEsIHNlbmRlci0+dGRfbWF4ZW5kICsgMSkgPwpAQCAtNzYyLDggKzc1Niw2IEBACiAJCQk6ICJBQ0sgaXMgb3ZlciB0aGUgdXBwZXIgYm91bmQgKEFDS2VkIGRhdGEgbm90IHNlZW4geWV0KSIKIAkJCTogIlNFUSBpcyB1bmRlciB0aGUgbG93ZXIgYm91bmQgKGFscmVhZHkgQUNLZWQgZGF0YSByZXRyYW5zbWl0dGVkKSIKIAkJCTogIlNFUSBpcyBvdmVyIHRoZSB1cHBlciBib3VuZCAob3ZlciB0aGUgd2luZG93IG9mIHRoZSByZWNlaXZlcikiKTsKLQotCQlyZXMgPSBpcF9jdF90Y3BfYmVfbGliZXJhbDsKICAgCX0KICAgCiAJREVCVUdQKCJ0Y3BfaW5fd2luZG93OiByZXM9JWkgc2VuZGVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1ICIKQEAgLTExMDUsOCArMTA5Nyw2IEBACiAKIAkJdGNwX29wdGlvbnMoc2tiLCBpcGgsIHRoLCAmY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXSk7CiAJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0uZmxhZ3MgPSAwOwotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLmxvb3NlID0gCi0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0ubG9vc2UgPSAwOwogCX0gZWxzZSBpZiAoaXBfY3RfdGNwX2xvb3NlID09IDApIHsKIAkJLyogRG9uJ3QgdHJ5IHRvIHBpY2sgdXAgY29ubmVjdGlvbnMuICovCiAJCXJldHVybiAwOwpAQCAtMTEyNywxMSArMTExNywxMSBAQAogCQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXh3aW47CiAJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfc2NhbGUgPSAwOwogCi0JCS8qIFdlIGFzc3VtZSBTQUNLLiBTaG91bGQgd2UgYXNzdW1lIHdpbmRvdyBzY2FsaW5nIHRvbz8gKi8KKwkJLyogV2UgYXNzdW1lIFNBQ0sgYW5kIGxpYmVyYWwgd2luZG93IGNoZWNraW5nIHRvIGhhbmRsZQorCQkgKiB3aW5kb3cgc2NhbGluZyAqLwogCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLmZsYWdzID0KLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS5mbGFncyA9IElQX0NUX1RDUF9GTEFHX1NBQ0tfUEVSTTsKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS5sb29zZSA9IAotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLmxvb3NlID0gaXBfY3RfdGNwX2xvb3NlOworCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLmZsYWdzID0gSVBfQ1RfVENQX0ZMQUdfU0FDS19QRVJNIHwKKwkJCQkJCSAgICAgSVBfQ1RfVENQX0ZMQUdfQkVfTElCRVJBTDsKIAl9CiAgICAgCiAJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS50ZF9lbmQgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYwppbmRleCA5ZDFhNTE3Li41ZTA4YzJiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYwpAQCAtMjQ2LDggKzI0Niw5IEBACiAJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7CiAJCWlmIChmaW5kX2FwcHJvcHJpYXRlX3NyYyhvcmlnX3R1cGxlLCB0dXBsZSwgcmFuZ2UpKSB7CiAJCQlERUJVR1AoImdldF91bmlxdWVfdHVwbGU6IEZvdW5kIGN1cnJlbnQgc3JjIG1hcFxuIik7Ci0JCQlpZiAoIWlwX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjb25udHJhY2spKQotCQkJCXJldHVybjsKKwkJCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pKQorCQkJCWlmICghaXBfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGNvbm50cmFjaykpCisJCQkJCXJldHVybjsKIAkJfQogCX0KIApAQCAtMjYxLDYgKzI2MiwxMyBAQAogCiAJcHJvdG8gPSBpcF9uYXRfcHJvdG9fZmluZF9nZXQob3JpZ190dXBsZS0+ZHN0LnByb3RvbnVtKTsKIAorCS8qIENoYW5nZSBwcm90b2NvbCBpbmZvIHRvIGhhdmUgc29tZSByYW5kb21pemF0aW9uICovCisJaWYgKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pIHsKKwkJcHJvdG8tPnVuaXF1ZV90dXBsZSh0dXBsZSwgcmFuZ2UsIG1hbmlwdHlwZSwgY29ubnRyYWNrKTsKKwkJaXBfbmF0X3Byb3RvX3B1dChwcm90byk7CisJCXJldHVybjsKKwl9CisKIAkvKiBPbmx5IGJvdGhlciBtYXBwaW5nIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gcmFuZ2UgYW5kIHVuaXF1ZSAqLwogCWlmICgoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKQogCSAgICAgfHwgcHJvdG8tPmluX3JhbmdlKHR1cGxlLCBtYW5pcHR5cGUsICZyYW5nZS0+bWluLCAmcmFuZ2UtPm1heCkpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXIuYwppbmRleCBlZTgwZmViLi4yZTVjNGJjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OwogCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQl0Y3BoLT5jaGVjayA9IDA7Ci0JCXRjcGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKHRjcGgsIGRhdGFsZW4sCisJCXRjcGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKGRhdGFsZW4sCiAJCQkJCSAgIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCiAJCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRjcGgsCiAJCQkJCSAgIAkJZGF0YWxlbiwgMCkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b190Y3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMKaW5kZXggYjU4NmQxOC4uMTRmZjI0ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b190Y3AuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KQEAgLTc1LDYgKzc2LDEwIEBACiAJCXJhbmdlX3NpemUgPSBudG9ocyhyYW5nZS0+bWF4LnRjcC5wb3J0KSAtIG1pbiArIDE7CiAJfQogCisJLyogU3RhcnQgZnJvbSByYW5kb20gcG9ydCB0byBhdm9pZCBwcmVkaWN0aW9uICovCisJaWYgKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pCisJCXBvcnQgPSAgbmV0X3JhbmRvbSgpOworCiAJZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgcG9ydCsrKSB7CiAJCSpwb3J0cHRyID0gaHRvbnMobWluICsgcG9ydCAlIHJhbmdlX3NpemUpOwogCQlpZiAoIWlwX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjb25udHJhY2spKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191ZHAuYwppbmRleCA1Y2VkMDg3Li5kZmQ1MjE2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgpAQCAtNzQsNiArNzUsMTAgQEAKIAkJcmFuZ2Vfc2l6ZSA9IG50b2hzKHJhbmdlLT5tYXgudWRwLnBvcnQpIC0gbWluICsgMTsKIAl9CiAKKwkvKiBTdGFydCBmcm9tIHJhbmRvbSBwb3J0IHRvIGF2b2lkIHByZWRpY3Rpb24gKi8KKwlpZiAocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkKKwkJcG9ydCA9IG5ldF9yYW5kb20oKTsKKwogCWZvciAoaSA9IDA7IGkgPCByYW5nZV9zaXplOyBpKyssIHBvcnQrKykgewogCQkqcG9ydHB0ciA9IGh0b25zKG1pbiArIHBvcnQgJSByYW5nZV9zaXplKTsKIAkJaWYgKCFpcF9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY29ubnRyYWNrKSkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcnVsZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMKaW5kZXggYTE3NmFhMy4uZTFjOGEwNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMKQEAgLTg2LDcgKzg2LDcgQEAKICAgICB9CiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF90YWJsZSBuYXRfdGFibGUgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhYmxlIG5hdF90YWJsZSA9IHsKIAkubmFtZQkJPSAibmF0IiwKIAkudmFsaWRfaG9va3MJPSBOQVRfVkFMSURfSE9PS1MsCiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKQEAgLTk5LDcgKzk5LDcgQEAKIAkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQkJCSAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAogCQkJCSAgICBjb25zdCB2b2lkICp0YXJnaW5mbykKIHsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKQEAgLTE0MSw3ICsxNDEsNyBAQAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJCQkJICAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCiAJCQkJICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQogewogCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwpAQCAtMTY2LDcgKzE2Niw3IEBACiAKIHN0YXRpYyBpbnQgaXB0X3NuYXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCiAJCQkgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCiAJCQkgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKQEAgLTE4Miw3ICsxODIsNyBAQAogCiBzdGF0aWMgaW50IGlwdF9kbmF0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAogCQkJICAgICAgIGNvbnN0IHZvaWQgKmVudHJ5LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAogCQkJICAgICAgIHZvaWQgKnRhcmdpbmZvLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CkBAIC0xOTMsNiArMTkzLDEwIEBACiAJCXByaW50aygiRE5BVDogbXVsdGlwbGUgcmFuZ2VzIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CisJaWYgKG1yLT5yYW5nZVswXS5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pIHsKKwkJcHJpbnRrKCJETkFUOiBwb3J0IHJhbmRvbWl6YXRpb24gbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAwOworCX0KIAlyZXR1cm4gMTsKIH0KIApAQCAtMjU3LDggKzI2MSw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9zbmF0X3JlZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9zbmF0X3JlZyA9IHsKIAkubmFtZQkJPSAiU05BVCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQJCT0gaXB0X3NuYXRfdGFyZ2V0LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKIAkudGFibGUJCT0gIm5hdCIsCkBAIC0yNjYsOCArMjcxLDkgQEAKIAkuY2hlY2tlbnRyeQk9IGlwdF9zbmF0X2NoZWNrZW50cnksCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X2RuYXRfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X2RuYXRfcmVnID0gewogCS5uYW1lCQk9ICJETkFUIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSBpcHRfZG5hdF90YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpLAogCS50YWJsZQkJPSAibmF0IiwKQEAgLTI4MiwyNyArMjg4LDI3IEBACiAJcmV0ID0gaXB0X3JlZ2lzdGVyX3RhYmxlKCZuYXRfdGFibGUsICZuYXRfaW5pdGlhbF90YWJsZS5yZXBsKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X3NuYXRfcmVnKTsKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIHVucmVnaXN0ZXJfdGFibGU7CiAKLQlyZXQgPSBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfZG5hdF9yZWcpOworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2RuYXRfcmVnKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gdW5yZWdpc3Rlcl9zbmF0OwogCiAJcmV0dXJuIHJldDsKIAogIHVucmVnaXN0ZXJfc25hdDoKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9zbmF0X3JlZyk7CiAgdW5yZWdpc3Rlcl90YWJsZToKLQlpcHRfdW5yZWdpc3Rlcl90YWJsZSgmbmF0X3RhYmxlKTsKKwl4dF91bnJlZ2lzdGVyX3RhYmxlKCZuYXRfdGFibGUpOwogCiAJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBpcF9uYXRfcnVsZV9jbGVhbnVwKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfZG5hdF9yZWcpOwotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3NuYXRfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X2RuYXRfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3NuYXRfcmVnKTsKIAlpcHRfdW5yZWdpc3Rlcl90YWJsZSgmbmF0X3RhYmxlKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwppbmRleCBmYzFmMTUzLi41YTdiM2EzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCkBAIC0yMTYsNyArMjE2LDcgQEAKIAkgICAgIHVuc2lnbmVkIGludCBob29rLAogCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgICAgIHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlKQorCSAgICAgc3RydWN0IHh0X3RhYmxlICp0YWJsZSkKIHsKIAlzdGF0aWMgY29uc3QgY2hhciBudWxsZGV2bmFtZVtJRk5BTVNJWl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2YobG9uZykpKSk7CiAJdV9pbnQxNl90IG9mZnNldDsKQEAgLTUwNyw3ICs1MDcsNyBAQAogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfbWF0Y2goc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgdW5zaWduZWQgaW50IGhvb2ttYXNrKQogewotCXN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoOworCXN0cnVjdCB4dF9tYXRjaCAqbWF0Y2g7CiAJaW50IHJldDsKIAogCW1hdGNoID0gbS0+dS5rZXJuZWwubWF0Y2g7CkBAIC01MzEsNyArNTMxLDcgQEAKIAkgICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLAogCSAgICB1bnNpZ25lZCBpbnQgKmkpCiB7Ci0Jc3RydWN0IGlwdF9tYXRjaCAqbWF0Y2g7CisJc3RydWN0IHh0X21hdGNoICptYXRjaDsKIAlpbnQgcmV0OwogCiAJbWF0Y2ggPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX21hdGNoKEFGX0lORVQsIG0tPnUudXNlci5uYW1lLApAQCAtNTU3LDcgKzU1Nyw3IEBACiBzdGF0aWMgaW5saW5lIGludCBjaGVja190YXJnZXQoc3RydWN0IGlwdF9lbnRyeSAqZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKICAJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQ7Ci0gCXN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQ7CisJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OwogIAlpbnQgcmV0OwogCiAJdCA9IGlwdF9nZXRfdGFyZ2V0KGUpOwpAQCAtNTgwLDcgKzU4MCw3IEBACiAJICAgIHVuc2lnbmVkIGludCAqaSkKIHsKIAlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKLQlzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0OworCXN0cnVjdCB4dF90YXJnZXQgKnRhcmdldDsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGludCBqOwogCkBAIC04MTgsNyArODE4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHh0X2NvdW50ZXJzICogYWxsb2NfY291bnRlcnMoc3RydWN0IGlwdF90YWJsZSAqdGFibGUpCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4dF9jb3VudGVycyAqIGFsbG9jX2NvdW50ZXJzKHN0cnVjdCB4dF90YWJsZSAqdGFibGUpCiB7CiAJdW5zaWduZWQgaW50IGNvdW50ZXJzaXplOwogCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CkBAIC04NDMsNyArODQzLDcgQEAKIAogc3RhdGljIGludAogY29weV9lbnRyaWVzX3RvX3VzZXIodW5zaWduZWQgaW50IHRvdGFsX3NpemUsCi0JCSAgICAgc3RydWN0IGlwdF90YWJsZSAqdGFibGUsCisJCSAgICAgc3RydWN0IHh0X3RhYmxlICp0YWJsZSwKIAkJICAgICB2b2lkIF9fdXNlciAqdXNlcnB0cikKIHsKIAl1bnNpZ25lZCBpbnQgb2ZmLCBudW07CkBAIC0xMDQ2LDcgKzEwNDYsNyBAQAogc3RhdGljIGludCBnZXRfaW5mbyh2b2lkIF9fdXNlciAqdXNlciwgaW50ICpsZW4sIGludCBjb21wYXQpCiB7CiAJY2hhciBuYW1lW0lQVF9UQUJMRV9NQVhOQU1FTEVOXTsKLQlzdHJ1Y3QgaXB0X3RhYmxlICp0OworCXN0cnVjdCB4dF90YWJsZSAqdDsKIAlpbnQgcmV0OwogCiAJaWYgKCpsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpcHRfZ2V0aW5mbykpIHsKQEAgLTExMDcsNyArMTEwNyw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaXB0X2dldF9lbnRyaWVzIGdldDsKLQlzdHJ1Y3QgaXB0X3RhYmxlICp0OworCXN0cnVjdCB4dF90YWJsZSAqdDsKIAogCWlmICgqbGVuIDwgc2l6ZW9mKGdldCkpIHsKIAkJZHVwcmludGYoImdldF9lbnRyaWVzOiAldSA8ICVkXG4iLCAqbGVuLApAQCAtMTE1MSw3ICsxMTUxLDcgQEAKIAkJdm9pZCBfX3VzZXIgKmNvdW50ZXJzX3B0cikKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBpcHRfdGFibGUgKnQ7CisJc3RydWN0IHh0X3RhYmxlICp0OwogCXN0cnVjdCB4dF90YWJsZV9pbmZvICpvbGRpbmZvOwogCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CiAJdm9pZCAqbG9jX2NwdV9vbGRfZW50cnk7CkBAIC0xMzAyLDcgKzEzMDIsNyBAQAogCWNoYXIgKm5hbWU7CiAJaW50IHNpemU7CiAJdm9pZCAqcHRtcDsKLQlzdHJ1Y3QgaXB0X3RhYmxlICp0OworCXN0cnVjdCB4dF90YWJsZSAqdDsKIAlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwpAQCAtMTQzNyw3ICsxNDM3LDcgQEAKIAkgICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLAogCSAgICBpbnQgKnNpemUsIGludCAqaSkKIHsKLQlzdHJ1Y3QgaXB0X21hdGNoICptYXRjaDsKKwlzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoOwogCiAJbWF0Y2ggPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX21hdGNoKEFGX0lORVQsIG0tPnUudXNlci5uYW1lLAogCQkJCQkJICAgbS0+dS51c2VyLnJldmlzaW9uKSwKQEAgLTE0NjYsNyArMTQ2Niw3IEBACiAJCQkgICBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0OwotCXN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQ7CisJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OwogCXVuc2lnbmVkIGludCBlbnRyeV9vZmZzZXQ7CiAJaW50IHJldCwgb2ZmLCBoLCBqOwogCkBAIC0xNTUwLDcgKzE1NTAsNyBAQAogCXN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLCB1bnNpZ25lZCBjaGFyICpiYXNlKQogewogCXN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0ICp0OwotCXN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQ7CisJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OwogCXN0cnVjdCBpcHRfZW50cnkgKmRlOwogCXVuc2lnbmVkIGludCBvcmlnc2l6ZTsKIAlpbnQgcmV0LCBoOwpAQCAtMTc5NSw3ICsxNzk1LDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgY29tcGF0X2NvcHlfZW50cmllc190b191c2VyKHVuc2lnbmVkIGludCB0b3RhbF9zaXplLAotCQkgICAgIHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlLCB2b2lkIF9fdXNlciAqdXNlcnB0cikKKwkJICAgICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLCB2b2lkIF9fdXNlciAqdXNlcnB0cikKIHsKIAl1bnNpZ25lZCBpbnQgb2ZmLCBudW07CiAJc3RydWN0IGNvbXBhdF9pcHRfZW50cnkgZTsKQEAgLTE4NjksNyArMTg2OSw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgY29tcGF0X2lwdF9nZXRfZW50cmllcyBnZXQ7Ci0Jc3RydWN0IGlwdF90YWJsZSAqdDsKKwlzdHJ1Y3QgeHRfdGFibGUgKnQ7CiAKIAogCWlmICgqbGVuIDwgc2l6ZW9mKGdldCkpIHsKQEAgLTIwNTIsNyArMjA1Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaXB0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IGlwdF90YWJsZSAqdGFibGUpCit2b2lkIGlwdF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCB4dF90YWJsZSAqdGFibGUpCiB7CiAJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKQEAgLTIxMjQsNyArMjEyNCw3IEBACiB9CiAKIC8qIFRoZSBidWlsdC1pbiB0YXJnZXRzOiBzdGFuZGFyZCAoTlVMTCkgYW5kIGVycm9yLiAqLwotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9zdGFuZGFyZF90YXJnZXQgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfc3RhbmRhcmRfdGFyZ2V0ID0gewogCS5uYW1lCQk9IElQVF9TVEFOREFSRF9UQVJHRVQsCiAJLnRhcmdldHNpemUJPSBzaXplb2YoaW50KSwKIAkuZmFtaWx5CQk9IEFGX0lORVQsCkBAIC0yMTM1LDcgKzIxMzUsNyBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X2Vycm9yX3RhcmdldCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9lcnJvcl90YXJnZXQgPSB7CiAJLm5hbWUJCT0gSVBUX0VSUk9SX1RBUkdFVCwKIAkudGFyZ2V0CQk9IGlwdF9lcnJvciwKIAkudGFyZ2V0c2l6ZQk9IElQVF9GVU5DVElPTl9NQVhOQU1FTEVOLApAQCAtMjE1OCw3ICsyMTU4LDcgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggaWNtcF9tYXRjaHN0cnVjdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaWNtcF9tYXRjaHN0cnVjdCA9IHsKIAkubmFtZQkJPSAiaWNtcCIsCiAJLm1hdGNoCQk9IGljbXBfbWF0Y2gsCiAJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X2ljbXApLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKaW5kZXggYjFjMTExNi4uMzQzYzJhYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCkBAIC0yNiw2ICsyNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xVU1RFUklQLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CkBAIC0yNDcsNiArMjQ4LDcgQEAKIAlzd2l0Y2ggKGlwaC0+cHJvdG9jb2wpIHsKIAljYXNlIElQUFJPVE9fVENQOgogCWNhc2UgSVBQUk9UT19VRFA6CisJY2FzZSBJUFBST1RPX1VEUExJVEU6CiAJY2FzZSBJUFBST1RPX1NDVFA6CiAJY2FzZSBJUFBST1RPX0RDQ1A6CiAJY2FzZSBJUFBST1RPX0lDTVA6CkBAIC0zMjksNyArMzMxLDcgQEAKIAlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVAKIAkgICAgJiYgKGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEIAogCQl8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWSkpCi0JCXJldHVybiBJUFRfQ09OVElOVUU7CisJCXJldHVybiBYVF9DT05USU5VRTsKIAogCS8qIGlwX2Nvbm50cmFja19pY21wIGd1YXJhbnRlZXMgdXMgdGhhdCB3ZSBvbmx5IGhhdmUgSUNNUF9FQ0hPLCAKIAkgKiBUSU1FU1RBTVAsIElORk9fUkVRVUVTVCBvciBBRERSRVNTIHR5cGUgaWNtcCBwYWNrZXRzIGZyb20gaGVyZQpAQCAtMzY3LDcgKzM2OSw3IEBACiAJICogYWN0dWFsbHkgYSB1bmljYXN0IElQIHBhY2tldC4gVENQIGRvZXNuJ3QgbGlrZSBQQUNLRVRfTVVMVElDQVNUICovCiAJKCpwc2tiKS0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAotCXJldHVybiBJUFRfQ09OVElOVUU7CisJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50CkBAIC00NzAsOCArNDcyLDkgQEAKIAluZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQodGFyZ2V0LT5mYW1pbHkpOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgY2x1c3RlcmlwX3RndCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGNsdXN0ZXJpcF90Z3QgPSB7CiAJLm5hbWUJCT0gIkNMVVNURVJJUCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQJCT0gdGFyZ2V0LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfY2x1c3RlcmlwX3RndF9pbmZvKSwKIAkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCkBAIC03MjcsNyArNzMwLDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gaXB0X3JlZ2lzdGVyX3RhcmdldCgmY2x1c3RlcmlwX3RndCk7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KCZjbHVzdGVyaXBfdGd0KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNzUzLDcgKzc1Niw3IEBACiAJbmZfdW5yZWdpc3Rlcl9ob29rKCZjaXBfYXJwX29wcyk7CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIGNsZWFudXBfdGFyZ2V0OgotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmY2x1c3RlcmlwX3RndCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmNsdXN0ZXJpcF90Z3QpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc2NSw3ICs3NjgsNyBAQAogCXJlbW92ZV9wcm9jX2VudHJ5KGNsdXN0ZXJpcF9wcm9jZGlyLT5uYW1lLCBjbHVzdGVyaXBfcHJvY2Rpci0+cGFyZW50KTsKICNlbmRpZgogCW5mX3VucmVnaXN0ZXJfaG9vaygmY2lwX2FycF9vcHMpOwotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmY2x1c3RlcmlwX3RndCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmNsdXN0ZXJpcF90Z3QpOwogfQogCiBtb2R1bGVfaW5pdChpcHRfY2x1c3RlcmlwX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKaW5kZXggYjU1ZDY3MC4uYjVjYTU5MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCkBAIC05LDEyICs5LDE0IEBACiAgKiBpcHRfRUNOLmMsdiAxLjUgMjAwMi8wOC8xOCAxOTozNjo1MSBsYWZvcmdlIEV4cAogKi8KIAorI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9FQ04uaD4KIApAQCAtOTUsNyArOTcsNyBAQAogCQlpZiAoIXNldF9lY3RfdGNwKHBza2IsIGVpbmZvKSkKIAkJCXJldHVybiBORl9EUk9QOwogCi0JcmV0dXJuIElQVF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTExOSw3ICsxMjEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKChlaW5mby0+b3BlcmF0aW9uICYgKElQVF9FQ05fT1BfU0VUX0VDRXxJUFRfRUNOX09QX1NFVF9DV1IpKQotCSAgICAmJiAoZS0+aXAucHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwgKGUtPmlwLmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpKSB7CisJICAgICYmIChlLT5pcC5wcm90byAhPSBJUFBST1RPX1RDUCB8fCAoZS0+aXAuaW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJFQ046IGNhbm5vdCB1c2UgVENQIG9wZXJhdGlvbnMgb24gYSAiCiAJCSAgICAgICAibm9uLXRjcCBydWxlXG4iKTsKIAkJcmV0dXJuIDA7CkBAIC0xMjcsOCArMTI5LDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9lY25fcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X2Vjbl9yZWcgPSB7CiAJLm5hbWUJCT0gIkVDTiIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQJCT0gdGFyZ2V0LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfRUNOX2luZm8pLAogCS50YWJsZQkJPSAibWFuZ2xlIiwKQEAgLTEzOCwxMiArMTQxLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF9lY25faW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfZWNuX3JlZyk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2Vjbl9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X2Vjbl9maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfZWNuX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9lY25fcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X2Vjbl9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCmluZGV4IGM5NmRlMTYuLmY2ODM3MGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC00MzIsNyArNDMyLDcgQEAKIAogCWlwdF9sb2dfcGFja2V0KFBGX0lORVQsIGhvb2tudW0sICpwc2tiLCBpbiwgb3V0LCAmbGksCiAJICAgICAgICAgICAgICAgbG9naW5mby0+cHJlZml4KTsKLQlyZXR1cm4gSVBUX0NPTlRJTlVFOworCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBpcHRfbG9nX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLApAQCAtNDU1LDggKzQ1NSw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfbG9nX3JlZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9sb2dfcmVnID0gewogCS5uYW1lCQk9ICJMT0ciLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0CQk9IGlwdF9sb2dfdGFyZ2V0LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfbG9nX2luZm8pLAogCS5jaGVja2VudHJ5CT0gaXB0X2xvZ19jaGVja2VudHJ5LApAQCAtNDcxLDggKzQ3MiwxMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfbG9nX2luaXQodm9pZCkKIHsKLQlpZiAoaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2xvZ19yZWcpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpbnQgcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbG9nX3JlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAJaWYgKG5mX2xvZ19yZWdpc3RlcihQRl9JTkVULCAmaXB0X2xvZ19sb2dnZXIpIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcHRfTE9HOiBub3QgbG9nZ2luZyB2aWEgc3lzdGVtIGNvbnNvbGUgIgogCQkgICAgICAgInNpbmNlIHNvbWVib2R5IGVsc2UgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBQRl9JTkVUXG4iKTsKQEAgLTQ4Niw3ICs0OTAsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IGlwdF9sb2dfZmluaSh2b2lkKQogewogCW5mX2xvZ191bnJlZ2lzdGVyX2xvZ2dlcigmaXB0X2xvZ19sb2dnZXIpOwotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X2xvZ19yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbG9nX3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF9sb2dfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCmluZGV4IGQ2Njk2ODUuLjkxYzQyZWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCkBAIC0yNSw3ICsyNSw3IEBACiAjZWxzZQogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+CiAjZW5kaWYKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKQEAgLTE5MCw4ICsxOTAsOSBAQAogCS5ub3RpZmllcl9jYWxsCT0gbWFzcV9pbmV0X2V2ZW50LAogfTsKIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IG1hc3F1ZXJhZGUgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBtYXNxdWVyYWRlID0gewogCS5uYW1lCQk9ICJNQVNRVUVSQURFIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSBtYXNxdWVyYWRlX3RhcmdldCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCiAJLnRhYmxlCQk9ICJuYXQiLApAQCAtMjA0LDcgKzIwNSw3IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IGlwdF9yZWdpc3Rlcl90YXJnZXQoJm1hc3F1ZXJhZGUpOworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmbWFzcXVlcmFkZSk7CiAKIAlpZiAocmV0ID09IDApIHsKIAkJLyogUmVnaXN0ZXIgZm9yIGRldmljZSBkb3duIHJlcG9ydHMgKi8KQEAgLTIxOCw3ICsyMTksNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X21hc3F1ZXJhZGVfZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmbWFzcXVlcmFkZSk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJm1hc3F1ZXJhZGUpOwogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZtYXNxX2Rldl9ub3RpZmllcik7CiAJdW5yZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmbWFzcV9pbmV0X25vdGlmaWVyKTsJCiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwppbmRleCA5MzkwZTkwLi5iNGFjYzI0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgogI2Vsc2UKQEAgLTg4LDggKzg5LDkgQEAKIAlyZXR1cm4gaXBfbmF0X3NldHVwX2luZm8oY3QsICZuZXdyYW5nZSwgaG9va251bSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCB0YXJnZXRfbW9kdWxlID0geyAKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHRhcmdldF9tb2R1bGUgPSB7CiAJLm5hbWUgCQk9IE1PRFVMRU5BTUUsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQgCT0gdGFyZ2V0LCAKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCiAJLnRhYmxlCQk9ICJuYXQiLApAQCAtMTAxLDEyICsxMDMsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXB0X25ldG1hcF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJnRhcmdldF9tb2R1bGUpOworCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXQoJnRhcmdldF9tb2R1bGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X25ldG1hcF9maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZ0YXJnZXRfbW9kdWxlKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmdGFyZ2V0X21vZHVsZSk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF9uZXRtYXBfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKaW5kZXggNDYyZWNlYi4uNTRjZDAyMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+CiAjZWxzZQpAQCAtMTA0LDggKzEwNSw5IEBACiAJcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGN0LCAmbmV3cmFuZ2UsIGhvb2tudW0pOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgcmVkaXJlY3RfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgcmVkaXJlY3RfcmVnID0gewogCS5uYW1lCQk9ICJSRURJUkVDVCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQJCT0gcmVkaXJlY3RfdGFyZ2V0LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKIAkudGFibGUJCT0gIm5hdCIsCkBAIC0xMTYsMTIgKzExOCwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfcmVkaXJlY3RfaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZyZWRpcmVjdF9yZWcpOworCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXQoJnJlZGlyZWN0X3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfcmVkaXJlY3RfZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmcmVkaXJlY3RfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmcmVkaXJlY3RfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X3JlZGlyZWN0X2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKaW5kZXggZjAzMTllNS4uZTRhMWRkYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfUkVKRUNULmg+CiAjaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKQEAgLTExNiw3ICsxMTcsNyBAQAogCiAJLyogQWRqdXN0IFRDUCBjaGVja3N1bSAqLwogCXRjcGgtPmNoZWNrID0gMDsKLQl0Y3BoLT5jaGVjayA9IHRjcF92NF9jaGVjayh0Y3BoLCBzaXplb2Yoc3RydWN0IHRjcGhkciksCisJdGNwaC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2soc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAogCQkJCSAgIG5za2ItPm5oLmlwaC0+c2FkZHIsCiAJCQkJICAgbnNrYi0+bmguaXBoLT5kYWRkciwKIAkJCQkgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0Y3BoLApAQCAtMjMwLDcgKzIzMSw3IEBACiAJfSBlbHNlIGlmIChyZWppbmZvLT53aXRoID09IElQVF9UQ1BfUkVTRVQpIHsKIAkJLyogTXVzdCBzcGVjaWZ5IHRoYXQgaXQncyBhIFRDUCBwYWNrZXQgKi8KIAkJaWYgKGUtPmlwLnByb3RvICE9IElQUFJPVE9fVENQCi0JCSAgICB8fCAoZS0+aXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgeworCQkgICAgfHwgKGUtPmlwLmludmZsYWdzICYgWFRfSU5WX1BST1RPKSkgewogCQkJREVCVUdQKCJSRUpFQ1Q6IFRDUF9SRVNFVCBpbnZhbGlkIGZvciBub24tdGNwXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yMzgsOCArMjM5LDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9yZWplY3RfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X3JlamVjdF9yZWcgPSB7CiAJLm5hbWUJCT0gIlJFSkVDVCIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQJCT0gcmVqZWN0LAogCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfcmVqZWN0X2luZm8pLAogCS50YWJsZQkJPSAiZmlsdGVyIiwKQEAgLTI1MSwxMiArMjUzLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF9yZWplY3RfaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfcmVqZWN0X3JlZyk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X3JlamVjdF9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X3JlamVjdF9maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfcmVqZWN0X3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9yZWplY3RfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X3JlamVjdF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfU0FNRS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKaW5kZXggM2RjZjI5NC4uYTFjZGQxMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgogI2Vsc2UKQEAgLTE4Niw4ICsxODcsOSBAQAogCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IHNhbWVfcmVnID0geyAKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHNhbWVfcmVnID0gewogCS5uYW1lCQk9ICJTQU1FIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSBzYW1lX3RhcmdldCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X3NhbWVfaW5mbyksCiAJLnRhYmxlCQk9ICJuYXQiLApAQCAtMTk5LDEyICsyMDEsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXB0X3NhbWVfaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZzYW1lX3JlZyk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmc2FtZV9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X3NhbWVfZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmc2FtZV9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZzYW1lX3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF9zYW1lX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UQ1BNU1MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZWI1YzMuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UQ1BNU1MuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKgotICogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBNU1Mgb3B0aW9uIGluIFRDUCBwYWNrZXRzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1RDUE1TUy5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgVENQIE1TUyBtb2RpZmljYXRpb24gbW9kdWxlIik7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1vcHRsZW4oY29uc3QgdV9pbnQ4X3QgKm9wdCwgdW5zaWduZWQgaW50IG9mZnNldCkKLXsKLQkvKiBCZXdhcmUgemVyby1sZW5ndGggb3B0aW9uczogbWFrZSBmaW5pdGUgcHJvZ3Jlc3MgKi8KLQlpZiAob3B0W29mZnNldF0gPD0gVENQT1BUX05PUCB8fCBvcHRbb2Zmc2V0KzFdID09IDApCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIG9wdFtvZmZzZXQrMV07Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWlwdF90Y3Btc3NfdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0JCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCi17Ci0JY29uc3Qgc3RydWN0IGlwdF90Y3Btc3NfaW5mbyAqdGNwbXNzaW5mbyA9IHRhcmdpbmZvOwotCXN0cnVjdCB0Y3BoZHIgKnRjcGg7Ci0Jc3RydWN0IGlwaGRyICppcGg7Ci0JdV9pbnQxNl90IHRjcGxlbiwgbmV3bXNzOwotCV9fYmUxNiBuZXd0b3RsZW4sIG9sZHZhbDsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1X2ludDhfdCAqb3B0OwotCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5sZW4pKQotCQlyZXR1cm4gTkZfRFJPUDsKLQotCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKLQl0Y3BsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OwotCXRjcGggPSAodm9pZCAqKWlwaCArIGlwaC0+aWhsKjQ7Ci0KLQkvKiBTaW5jZSBpdCBwYXNzZWQgZmxhZ3MgdGVzdCBpbiB0Y3AgbWF0Y2gsIHdlIGtub3cgaXQgaXMgaXMKLQkgICBub3QgYSBmcmFnbWVudCwgYW5kIGhhcyBkYXRhID49IHRjcCBoZWFkZXIgbGVuZ3RoLiAgU1lOCi0JICAgcGFja2V0cyBzaG91bGQgbm90IGNvbnRhaW4gZGF0YTogaWYgdGhleSBkaWQsIHRoZW4gd2UgcmlzawotCSAgIHJ1bm5pbmcgb3ZlciBNVFUsIHNlbmRpbmcgRnJhZyBOZWVkZWQgYW5kIGJyZWFraW5nIHRoaW5ncwotCSAgIGJhZGx5LiAtLVJSICovCi0JaWYgKHRjcGxlbiAhPSB0Y3BoLT5kb2ZmKjQpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJpcHRfdGNwbXNzX3RhcmdldDogYmFkIGxlbmd0aCAoJWQgYnl0ZXMpXG4iLAotCQkJICAgICAgICgqcHNrYiktPmxlbik7Ci0JCXJldHVybiBORl9EUk9QOwotCX0KLQotCWlmICh0Y3Btc3NpbmZvLT5tc3MgPT0gSVBUX1RDUE1TU19DTEFNUF9QTVRVKSB7Ci0JCWlmIChkc3RfbXR1KCgqcHNrYiktPmRzdCkgPD0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgKwotCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkgewotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcmludGsoS0VSTl9FUlIgImlwdF90Y3Btc3NfdGFyZ2V0OiAiCi0JCQkJICAgICAgICJ1bmtub3duIG9yIGludmFsaWQgcGF0aC1NVFUgKCVkKVxuIiwKLQkJCQkgICAgICAgZHN0X210dSgoKnBza2IpLT5kc3QpKTsKLQkJCXJldHVybiBORl9EUk9QOyAvKiBvciBJUFRfQ09OVElOVUUgPz8gKi8KLQkJfQotCi0JCW5ld21zcyA9IGRzdF9tdHUoKCpwc2tiKS0+ZHN0KSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpIC0KLQkJCQkJCSBzaXplb2Yoc3RydWN0IHRjcGhkcik7Ci0JfSBlbHNlCi0JCW5ld21zcyA9IHRjcG1zc2luZm8tPm1zczsKLQotIAlvcHQgPSAodV9pbnQ4X3QgKil0Y3BoOwotCWZvciAoaSA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsgaSA8IHRjcGgtPmRvZmYqNDsgaSArPSBvcHRsZW4ob3B0LCBpKSkgewotCQlpZiAob3B0W2ldID09IFRDUE9QVF9NU1MgJiYgdGNwaC0+ZG9mZio0IC0gaSA+PSBUQ1BPTEVOX01TUyAmJgotCQkgICAgb3B0W2krMV0gPT0gVENQT0xFTl9NU1MpIHsKLQkJCXVfaW50MTZfdCBvbGRtc3M7Ci0KLQkJCW9sZG1zcyA9IChvcHRbaSsyXSA8PCA4KSB8IG9wdFtpKzNdOwotCi0JCQlpZiAodGNwbXNzaW5mby0+bXNzID09IElQVF9UQ1BNU1NfQ0xBTVBfUE1UVSAmJgotCQkJICAgIG9sZG1zcyA8PSBuZXdtc3MpCi0JCQkJcmV0dXJuIElQVF9DT05USU5VRTsKLQotCQkJb3B0W2krMl0gPSAobmV3bXNzICYgMHhmZjAwKSA+PiA4OwotCQkJb3B0W2krM10gPSAobmV3bXNzICYgMHgwMGZmKTsKLQotCQkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAotCQkJCQkJaHRvbnMob2xkbXNzKSwgaHRvbnMobmV3bXNzKSwgMCk7Ci0JCQlyZXR1cm4gSVBUX0NPTlRJTlVFOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBNU1MgT3B0aW9uIG5vdCBmb3VuZCA/ISBhZGQgaXQuLgotCSAqLwotCWlmIChza2JfdGFpbHJvb20oKCpwc2tiKSkgPCBUQ1BPTEVOX01TUykgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOwotCi0JCW5ld3NrYiA9IHNrYl9jb3B5X2V4cGFuZCgqcHNrYiwgc2tiX2hlYWRyb29tKCpwc2tiKSwKLQkJCQkJIFRDUE9MRU5fTVNTLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFuZXdza2IpCi0JCQlyZXR1cm4gTkZfRFJPUDsKLQkJa2ZyZWVfc2tiKCpwc2tiKTsKLQkJKnBza2IgPSBuZXdza2I7Ci0JCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKLQkJdGNwaCA9ICh2b2lkICopaXBoICsgaXBoLT5paGwqNDsKLQl9Ci0KLQlza2JfcHV0KCgqcHNrYiksIFRDUE9MRU5fTVNTKTsKLQotIAlvcHQgPSAodV9pbnQ4X3QgKil0Y3BoICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwotCW1lbW1vdmUob3B0ICsgVENQT0xFTl9NU1MsIG9wdCwgdGNwbGVuIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKLQotCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJnRjcGgtPmNoZWNrLCAqcHNrYiwKLQkJCQlodG9ucyh0Y3BsZW4pLCBodG9ucyh0Y3BsZW4gKyBUQ1BPTEVOX01TUyksIDEpOwotCW9wdFswXSA9IFRDUE9QVF9NU1M7Ci0Jb3B0WzFdID0gVENQT0xFTl9NU1M7Ci0Jb3B0WzJdID0gKG5ld21zcyAmIDB4ZmYwMCkgPj4gODsKLQlvcHRbM10gPSAobmV3bXNzICYgMHgwMGZmKTsKLQotCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcGgtPmNoZWNrLCAqcHNrYiwgMCwgKigoX19iZTMyICopb3B0KSwgMCk7Ci0KLQlvbGR2YWwgPSAoKF9fYmUxNiAqKXRjcGgpWzZdOwotCXRjcGgtPmRvZmYgKz0gVENQT0xFTl9NU1MvNDsKLQluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ0Y3BoLT5jaGVjaywgKnBza2IsCi0JCQkJb2xkdmFsLCAoKF9fYmUxNiAqKXRjcGgpWzZdLCAwKTsKLQotCW5ld3RvdGxlbiA9IGh0b25zKG50b2hzKGlwaC0+dG90X2xlbikgKyBUQ1BPTEVOX01TUyk7Ci0JbmZfY3N1bV9yZXBsYWNlMigmaXBoLT5jaGVjaywgaXBoLT50b3RfbGVuLCBuZXd0b3RsZW4pOwotCWlwaC0+dG90X2xlbiA9IG5ld3RvdGxlbjsKLQlyZXR1cm4gSVBUX0NPTlRJTlVFOwotfQotCi0jZGVmaW5lIFRIX1NZTiAweDAyCi0KLXN0YXRpYyBpbmxpbmUgaW50IGZpbmRfc3luX21hdGNoKGNvbnN0IHN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKm0pCi17Ci0JY29uc3Qgc3RydWN0IGlwdF90Y3AgKnRjcGluZm8gPSAoY29uc3Qgc3RydWN0IGlwdF90Y3AgKiltLT5kYXRhOwotCi0JaWYgKHN0cmNtcChtLT51Lmtlcm5lbC5tYXRjaC0+bmFtZSwgInRjcCIpID09IDAgJiYKLQkgICAgdGNwaW5mby0+ZmxnX2NtcCAmIFRIX1NZTiAmJgotCSAgICAhKHRjcGluZm8tPmludmZsYWdzICYgSVBUX1RDUF9JTlZfRkxBR1MpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi0vKiBNdXN0IHNwZWNpZnkgLXAgdGNwIC0tc3luLy0tdGNwLWZsYWdzIFNZTiAqLwotc3RhdGljIGludAotaXB0X3RjcG1zc19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgICAgY29uc3Qgdm9pZCAqZV92b2lkLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0JCSAgICAgIHZvaWQgKnRhcmdpbmZvLAotCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcHRfdGNwbXNzX2luZm8gKnRjcG1zc2luZm8gPSB0YXJnaW5mbzsKLQljb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplID0gZV92b2lkOwotCi0JaWYgKHRjcG1zc2luZm8tPm1zcyA9PSBJUFRfVENQTVNTX0NMQU1QX1BNVFUgJiYKLQkgICAgKGhvb2tfbWFzayAmIH4oKDEgPDwgTkZfSVBfRk9SV0FSRCkgfAotCQkJICAgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSB8Ci0JCQkgICAoMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcpKSkgIT0gMCkgewotCQlwcmludGsoIlRDUE1TUzogcGF0aC1NVFUgY2xhbXBpbmcgb25seSBzdXBwb3J0ZWQgaW4gIgotCQkgICAgICAgIkZPUldBUkQsIE9VVFBVVCBhbmQgUE9TVFJPVVRJTkcgaG9va3NcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoSVBUX01BVENIX0lURVJBVEUoZSwgZmluZF9zeW5fbWF0Y2gpKQotCQlyZXR1cm4gMTsKLQlwcmludGsoIlRDUE1TUzogT25seSB3b3JrcyBvbiBUQ1AgU1lOIHBhY2tldHNcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X3RjcG1zc19yZWcgPSB7Ci0JLm5hbWUJCT0gIlRDUE1TUyIsCi0JLnRhcmdldAkJPSBpcHRfdGNwbXNzX3RhcmdldCwKLQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X3RjcG1zc19pbmZvKSwKLQkucHJvdG8JCT0gSVBQUk9UT19UQ1AsCi0JLmNoZWNrZW50cnkJPSBpcHRfdGNwbXNzX2NoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaXB0X3RjcG1zc19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF90Y3Btc3NfcmVnKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwdF90Y3Btc3NfZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3RjcG1zc19yZWcpOwotfQotCi1tb2R1bGVfaW5pdChpcHRfdGNwbXNzX2luaXQpOwotbW9kdWxlX2V4aXQoaXB0X3RjcG1zc19maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jCmluZGV4IDE4ZTc0YWMuLjI5YjA1YTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVE9TLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTQwLDcgKzQwLDcgQEAKIAkJaXBoLT50b3MgPSAoaXBoLT50b3MgJiBJUFRPU19QUkVDX01BU0spIHwgdG9zaW5mby0+dG9zOwogCQluZl9jc3VtX3JlcGxhY2UyKCZpcGgtPmNoZWNrLCBodG9ucyhvbGR0b3MpLCBodG9ucyhpcGgtPnRvcykpOwogCX0KLQlyZXR1cm4gSVBUX0NPTlRJTlVFOworCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludApAQCAtNjMsOCArNjMsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X3Rvc19yZWcgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfdG9zX3JlZyA9IHsKIAkubmFtZQkJPSAiVE9TIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSB0YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF90b3NfdGFyZ2V0X2luZm8pLAogCS50YWJsZQkJPSAibWFuZ2xlIiwKQEAgLTc0LDEyICs3NSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfdG9zX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X3Rvc19yZWcpOworCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwdF90b3NfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwdF90b3NfZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3Rvc19yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdG9zX3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF90b3NfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UVEwuYwppbmRleCBmZmZlNWNhLi5kMmI2ZmEzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1RUTC5oPgogCiBNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKQEAgLTU5LDcgKzU5LDcgQEAKIAkJaXBoLT50dGwgPSBuZXdfdHRsOwogCX0KIAotCXJldHVybiBJUFRfQ09OVElOVUU7CisJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50IGlwdF90dGxfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCkBAIC04MCw4ICs4MCw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfVFRMID0geyAKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9UVEwgPSB7CiAJLm5hbWUgCQk9ICJUVEwiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0IAk9IGlwdF90dGxfdGFyZ2V0LCAKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X1RUTF9pbmZvKSwKIAkudGFibGUJCT0gIm1hbmdsZSIsCkBAIC05MSwxMiArOTIsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXB0X3R0bF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9UVEwpOworCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9UVEwpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X3R0bF9maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfVFRMKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X1RUTCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF90dGxfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCmluZGV4IGRiZDM0NzguLjdhZjU3YTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCkBAIC01Nyw3ICs1Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9VTE9HLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KQEAgLTEzMiw3ICsxMzIsNiBAQAogCXViLT5xbGVuID0gMDsKIAl1Yi0+c2tiID0gTlVMTDsKIAl1Yi0+bGFzdG5saCA9IE5VTEw7Ci0KIH0KIAogCkBAIC0zMTQsNyArMzEzLDcgQEAKIAogCWlwdF91bG9nX3BhY2tldChob29rbnVtLCAqcHNrYiwgaW4sIG91dCwgbG9naW5mbywgTlVMTCk7CiAgCi0gCXJldHVybiBJUFRfQ09OVElOVUU7CisJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogIAogc3RhdGljIHZvaWQgaXB0X2xvZ2ZuKHVuc2lnbmVkIGludCBwZiwKQEAgLTM2Myw4ICszNjIsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X3Vsb2dfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X3Vsb2dfcmVnID0gewogCS5uYW1lCQk9ICJVTE9HIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnRhcmdldAkJPSBpcHRfdWxvZ190YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwdF91bG9nX2luZm8pLAogCS5jaGVja2VudHJ5CT0gaXB0X3Vsb2dfY2hlY2tlbnRyeSwKQEAgLTM3OSw3ICszNzksNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfdWxvZ19pbml0KHZvaWQpCiB7Ci0JaW50IGk7CisJaW50IHJldCwgaTsKIAogCURFQlVHUCgiaXB0X1VMT0c6IGluaXQgbW9kdWxlXG4iKTsKIApAQCAtNDAwLDkgKzQwMCwxMCBAQAogCWlmICghbmZsb2dubCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X3Vsb2dfcmVnKSAhPSAwKSB7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfdWxvZ19yZWcpOworCWlmIChyZXQgPCAwKSB7CiAJCXNvY2tfcmVsZWFzZShuZmxvZ25sLT5za19zb2NrZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAl9CiAJaWYgKG5mbG9nKQogCQluZl9sb2dfcmVnaXN0ZXIoUEZfSU5FVCwgJmlwdF91bG9nX2xvZ2dlcik7CkBAIC00MTksNyArNDIwLDcgQEAKIAogCWlmIChuZmxvZykKIAkJbmZfbG9nX3VucmVnaXN0ZXJfbG9nZ2VyKCZpcHRfdWxvZ19sb2dnZXIpOwotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3Vsb2dfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3Vsb2dfcmVnKTsKIAlzb2NrX3JlbGVhc2UobmZsb2dubC0+c2tfc29ja2V0KTsKIAogCS8qIHJlbW92ZSBwZW5kaW5nIHRpbWVycyBhbmQgZnJlZSBhbGxvY2F0ZWQgc2tiJ3MgKi8KQEAgLTQzNSw3ICs0MzYsNiBAQAogCQkJdWItPnNrYiA9IE5VTEw7CiAJCX0KIAl9Ci0KIH0KIAogbW9kdWxlX2luaXQoaXB0X3Vsb2dfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMKaW5kZXggN2I2MGViNy4uNjQ4ZjU1NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWRkcnR5cGUuYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2FkZHJ0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOwpAQCAtNDQsOCArNDQsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGFkZHJ0eXBlX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBhZGRydHlwZV9tYXRjaCA9IHsKIAkubmFtZQkJPSAiYWRkcnR5cGUiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkubWF0Y2gJCT0gbWF0Y2gsCiAJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X2FkZHJ0eXBlX2luZm8pLAogCS5tZQkJPSBUSElTX01PRFVMRQpAQCAtNTMsMTIgKzU0LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF9hZGRydHlwZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmYWRkcnR5cGVfbWF0Y2gpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmYWRkcnR5cGVfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X2FkZHJ0eXBlX2Zpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmYWRkcnR5cGVfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmFkZHJ0eXBlX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X2FkZHJ0eXBlX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9haC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9haC5jCmluZGV4IDE3OThmODYuLjQyZjQxMjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWguYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FoLmMKQEAgLTYsMTIgKzYsMTMgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfYWguaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiWW9uIFVyaWFydGUgPHlvbkBhc3Rhcm8uZGU+Iik7CkBAIC04Niw4ICs4Nyw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGFoX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBhaF9tYXRjaCA9IHsKIAkubmFtZQkJPSAiYWgiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkubWF0Y2gJCT0gbWF0Y2gsCiAJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X2FoKSwKIAkucHJvdG8JCT0gSVBQUk9UT19BSCwKQEAgLTk3LDEyICs5OSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfYWhfaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJmFoX21hdGNoKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmFoX21hdGNoKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwdF9haF9maW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJmFoX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZhaF9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF9haF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCmluZGV4IGRhZmJkZWMuLjM3NTA4YjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYwpAQCAtOSwxMCArOSwxMyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KIAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaD4KIApAQCAtMTA5LDggKzExMiw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIGVjbl9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZWNuX21hdGNoID0gewogCS5uYW1lCQk9ICJlY24iLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkubWF0Y2gJCT0gbWF0Y2gsCiAJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X2Vjbl9pbmZvKSwKIAkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCkBAIC0xMTksMTIgKzEyMywxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfZWNuX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZlY25fbWF0Y2gpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmZWNuX21hdGNoKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwdF9lY25fZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZlY25fbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmVjbl9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF9lY25faW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2lwcmFuZ2UuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jCmluZGV4IDUyMDJlZGQuLjA1ZGU1OTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaXByYW5nZS5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC02MywyMiArNjMsMjIgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggaXByYW5nZV9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaXByYW5nZV9tYXRjaCA9IHsKIAkubmFtZQkJPSAiaXByYW5nZSIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfaXByYW5nZV9pbmZvKSwKLQkuZGVzdHJveQk9IE5VTEwsCiAJLm1lCQk9IFRISVNfTU9EVUxFCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfaXByYW5nZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmaXByYW5nZV9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZpcHJhbmdlX21hdGNoKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwdF9pcHJhbmdlX2Zpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXByYW5nZV9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXByYW5nZV9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF9pcHJhbmdlX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jCmluZGV4IDc4YzMzNmYxLi45ZjQ5NmFjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X293bmVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9vd25lci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKQEAgLTY4LDggKzY4LDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggb3duZXJfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIG93bmVyX21hdGNoID0gewogCS5uYW1lCQk9ICJvd25lciIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfb3duZXJfaW5mbyksCiAJLmhvb2tzCQk9ICgxIDw8IE5GX0lQX0xPQ0FMX09VVCkgfCAoMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcpLApAQCAtNzksMTIgKzgwLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdF9vd25lcl9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmb3duZXJfbWF0Y2gpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmb3duZXJfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X293bmVyX2Zpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmb3duZXJfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJm93bmVyX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXB0X293bmVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVjZW50LmMKaW5kZXggNGRiMGU3My4uNmI5N2I2NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKiBDb3B5cmlnaHQgMjAwMi0yMDAzLCBTdGVwaGVuIEZyb3N0LCAyLjUueCBwb3J0IGJ5IGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZwogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTI0LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVjZW50Lmg+CiAKIE1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOwpAQCAtNDYyLDggKzQ2Myw5IEBACiB9OwogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHJlY2VudF9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcmVjZW50X21hdGNoID0gewogCS5uYW1lCQk9ICJyZWNlbnQiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkubWF0Y2gJCT0gaXB0X3JlY2VudF9tYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfcmVjZW50X2luZm8pLAogCS5jaGVja2VudHJ5CT0gaXB0X3JlY2VudF9jaGVja2VudHJ5LApAQCAtNDc5LDEzICs0ODEsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaXBfbGlzdF9oYXNoX3NpemUgPSAxIDw8IGZscyhpcF9saXN0X3RvdCk7CiAKLQllcnIgPSBpcHRfcmVnaXN0ZXJfbWF0Y2goJnJlY2VudF9tYXRjaCk7CisJZXJyID0geHRfcmVnaXN0ZXJfbWF0Y2goJnJlY2VudF9tYXRjaCk7CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCXByb2NfZGlyID0gcHJvY19ta2RpcigiaXB0X3JlY2VudCIsIHByb2NfbmV0KTsKIAlpZiAocHJvY19kaXIgPT0gTlVMTCkgewotCQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmcmVjZW50X21hdGNoKTsKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmcmVjZW50X21hdGNoKTsKIAkJZXJyID0gLUVOT01FTTsKIAl9CiAjZW5kaWYKQEAgLTQ5NSw3ICs0OTcsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IGlwdF9yZWNlbnRfZXhpdCh2b2lkKQogewogCUJVR19PTighbGlzdF9lbXB0eSgmdGFibGVzKSk7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnJlY2VudF9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmcmVjZW50X21hdGNoKTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCXJlbW92ZV9wcm9jX2VudHJ5KCJpcHRfcmVjZW50IiwgcHJvY19uZXQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90b3MuYwppbmRleCA1NTQ5YzM5Li41ZDMzYjUxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMKQEAgLTgsMTEgKzgsMTIgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3Rvcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIFRPUyBtYXRjaCBtb2R1bGUiKTsKQEAgLTMyLDggKzMzLDkgQEAKIAlyZXR1cm4gKHNrYi0+bmguaXBoLT50b3MgPT0gaW5mby0+dG9zKSBeIGluZm8tPmludmVydDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggdG9zX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB0b3NfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gInRvcyIsCisJLmZhbWlseQkJPSBBRl9JTkVULAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcHRfdG9zX2luZm8pLAogCS5tZQkJPSBUSElTX01PRFVMRSwKQEAgLTQxLDEyICs0MywxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHRfbXVsdGlwb3J0X2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZ0b3NfbWF0Y2gpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmdG9zX21hdGNoKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwdF9tdWx0aXBvcnRfZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZ0b3NfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJnRvc19tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF9tdWx0aXBvcnRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYwppbmRleCBhNTI0M2JkLi5kNWNkOTg0ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jCkBAIC05LDExICs5LDEyIEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90dGwuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBUVEwgbWF0Y2hpbmcgbW9kdWxlIik7CkBAIC00OCw4ICs0OSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHR0bF9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdHRsX21hdGNoID0gewogCS5uYW1lCQk9ICJ0dGwiLAorCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkubWF0Y2gJCT0gbWF0Y2gsCiAJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X3R0bF9pbmZvKSwKIAkubWUJCT0gVEhJU19NT0RVTEUsCkBAIC01NywxMyArNTksMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXB0X3R0bF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmdHRsX21hdGNoKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJnR0bF9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHRfdHRsX2Zpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmdHRsX21hdGNoKTsKLQorCXh0X3VucmVnaXN0ZXJfbWF0Y2goJnR0bF9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwdF90dGxfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCmluZGV4IGUyZTdkZDguLjUxMDUzY2IgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCkBAIC03NCw3ICs3NCw3IEBACiAgICAgfQogfTsKIAotc3RhdGljIHN0cnVjdCBpcHRfdGFibGUgcGFja2V0X2ZpbHRlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFibGUgcGFja2V0X2ZpbHRlciA9IHsKIAkubmFtZQkJPSAiZmlsdGVyIiwKIAkudmFsaWRfaG9va3MJPSBGSUxURVJfVkFMSURfSE9PS1MsCiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMKaW5kZXggYWYyOTM5OC4uYTUzMmU0ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgIH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhYmxlIHBhY2tldF9tYW5nbGVyID0geworc3RhdGljIHN0cnVjdCB4dF90YWJsZSBwYWNrZXRfbWFuZ2xlciA9IHsKIAkubmFtZQkJPSAibWFuZ2xlIiwKIAkudmFsaWRfaG9va3MJPSBNQU5HTEVfVkFMSURfSE9PS1MsCiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfcmF3LmMKaW5kZXggYmNiZWI0YS4uNTI3NzU1MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfcmF3LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfcmF3LmMKQEAgLTc5LDcgKzc5LDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF90YWJsZSBwYWNrZXRfcmF3ID0geyAKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFibGUgcGFja2V0X3JhdyA9IHsKIAkubmFtZSA9ICJyYXciLCAKIAkudmFsaWRfaG9va3MgPSAgUkFXX1ZBTElEX0hPT0tTLCAKIAkubG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQsIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYwppbmRleCA4NmE5MjI3Li45OThiMjU1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYwpAQCAtMjU0LDggKzI1NCw5IEBACiAJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7CiAJCWlmIChmaW5kX2FwcHJvcHJpYXRlX3NyYyhvcmlnX3R1cGxlLCB0dXBsZSwgcmFuZ2UpKSB7CiAJCQlERUJVR1AoImdldF91bmlxdWVfdHVwbGU6IEZvdW5kIGN1cnJlbnQgc3JjIG1hcFxuIik7Ci0JCQlpZiAoIW5mX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjdCkpCi0JCQkJcmV0dXJuOworCQkJaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkpCisJCQkJaWYgKCFuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQorCQkJCQlyZXR1cm47CiAJCX0KIAl9CiAKQEAgLTI2OSw2ICsyNzAsMTMgQEAKIAogCXByb3RvID0gbmZfbmF0X3Byb3RvX2ZpbmRfZ2V0KG9yaWdfdHVwbGUtPmRzdC5wcm90b251bSk7CiAKKwkvKiBDaGFuZ2UgcHJvdG9jb2wgaW5mbyB0byBoYXZlIHNvbWUgcmFuZG9taXphdGlvbiAqLworCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKSB7CisJCXByb3RvLT51bmlxdWVfdHVwbGUodHVwbGUsIHJhbmdlLCBtYW5pcHR5cGUsIGN0KTsKKwkJbmZfbmF0X3Byb3RvX3B1dChwcm90byk7CisJCXJldHVybjsKKwl9CisKIAkvKiBPbmx5IGJvdGhlciBtYXBwaW5nIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gcmFuZ2UgYW5kIHVuaXF1ZSAqLwogCWlmICgoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSB8fAogCSAgICAgcHJvdG8tPmluX3JhbmdlKHR1cGxlLCBtYW5pcHR5cGUsICZyYW5nZS0+bWluLCAmcmFuZ2UtPm1heCkpICYmCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYwppbmRleCA5OGZiZmM4Li5kYzY3MzhiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBpcGgtPmlobCo0OwogCWlmICgoKnBza2IpLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQl0Y3BoLT5jaGVjayA9IDA7Ci0JCXRjcGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKHRjcGgsIGRhdGFsZW4sCisJCXRjcGgtPmNoZWNrID0gdGNwX3Y0X2NoZWNrKGRhdGFsZW4sCiAJCQkJCSAgIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCiAJCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRjcGgsCiAJCQkJCSAgIAkJZGF0YWxlbiwgMCkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b190Y3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdGNwLmMKaW5kZXggN2UyNmE3ZS4uNDM5MTY0YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b190Y3AuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3RjcC5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KIApAQCAtNzUsNiArNzYsOSBAQAogCQlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC50Y3AucG9ydCkgLSBtaW4gKyAxOwogCX0KIAorCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKQorCQlwb3J0ID0gIG5ldF9yYW5kb20oKTsKKwogCWZvciAoaSA9IDA7IGkgPCByYW5nZV9zaXplOyBpKyssIHBvcnQrKykgewogCQkqcG9ydHB0ciA9IGh0b25zKG1pbiArIHBvcnQgJSByYW5nZV9zaXplKTsKIAkJaWYgKCFuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwLmMKaW5kZXggYWIwY2U0Yy4uOGNhZTZlMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcC5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KIApAQCAtNzMsNiArNzQsOSBAQAogCQlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC51ZHAucG9ydCkgLSBtaW4gKyAxOwogCX0KIAorCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKQorCQlwb3J0ID0gbmV0X3JhbmRvbSgpOworCiAJZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgcG9ydCsrKSB7CiAJCSpwb3J0cHRyID0gaHRvbnMobWluICsgcG9ydCAlIHJhbmdlX3NpemUpOwogCQlpZiAoIW5mX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjdCkpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCmluZGV4IGI4NjhlZTAuLjdmOTViNGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF90YWJsZSBuYXRfdGFibGUgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhYmxlIG5hdF90YWJsZSA9IHsKIAkubmFtZQkJPSAibmF0IiwKIAkudmFsaWRfaG9va3MJPSBOQVRfVkFMSURfSE9PS1MsCiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKQEAgLTIyNiw2ICsyMjYsMTAgQEAKIAkJcHJpbnRrKCJETkFUOiBtdWx0aXBsZSByYW5nZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAwOwogCX0KKwlpZiAobXItPnJhbmdlWzBdLmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkgeworCQlwcmludGsoIkROQVQ6IHBvcnQgcmFuZG9taXphdGlvbiBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQogCXJldHVybiAxOwogfQogCkBAIC0yOTAsNyArMjk0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X3NuYXRfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXB0X3NuYXRfcmVnID0gewogCS5uYW1lCQk9ICJTTkFUIiwKIAkudGFyZ2V0CQk9IGlwdF9zbmF0X3RhcmdldCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCmluZGV4IDAwZDZkZWEuLjVhOTY0YTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCkBAIC0zMiwxMiArMzIsNiBAQAogI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQogI2VuZGlmCiAKLSNkZWZpbmUgSE9PS05BTUUoaG9va251bSkgKChob29rbnVtKSA9PSBORl9JUF9QT1NUX1JPVVRJTkcgPyAiUE9TVF9ST1VUSU5HIiAgXAotCQkJICAgOiAoKGhvb2tudW0pID09IE5GX0lQX1BSRV9ST1VUSU5HID8gIlBSRV9ST1VUSU5HIiBcCi0JCQkgICAgICA6ICgoaG9va251bSkgPT0gTkZfSVBfTE9DQUxfT1VUID8gIkxPQ0FMX09VVCIgIFwKLQkJCSAgICAgICAgIDogKChob29rbnVtKSA9PSBORl9JUF9MT0NBTF9JTiA/ICJMT0NBTF9JTiIgIFwKLQkJCQkgICAgOiAiKkVSUk9SKiIpKSkKLQogI2lmZGVmIENPTkZJR19YRlJNCiBzdGF0aWMgdm9pZCBuYXRfZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCkKIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Jhdy5jIGIvbmV0L2lwdjQvcmF3LmMKaW5kZXggYTZjNjNiYi4uZmVkNmExZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcmF3LmMKKysrIGIvbmV0L2lwdjQvcmF3LmMKQEAgLTQ4OSw3ICs0ODksNyBAQAogCQl9CiAKIAkJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgJmZsKTsKLQkJZXJyID0gaXBfcm91dGVfb3V0cHV0X2Zsb3coJnJ0LCAmZmwsIHNrLCAhKG1zZy0+bXNnX2ZsYWdzJk1TR19ET05UV0FJVCkpOworCQllcnIgPSBpcF9yb3V0ZV9vdXRwdXRfZmxvdygmcnQsICZmbCwgc2ssIDEpOwogCX0KIAlpZiAoZXJyKQogCQlnb3RvIGRvbmU7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yb3V0ZS5jIGIvbmV0L2lwdjQvcm91dGUuYwppbmRleCAyZGFhMGRjLi5iYWVlMzA0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yb3V0ZS5jCisrKyBiL25ldC9pcHY0L3JvdXRlLmMKQEAgLTI2MzUsNyArMjYzNSw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqciksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCXIgPSBubG1zZ19kYXRhKG5saCk7CiAJci0+cnRtX2ZhbWlseQkgPSBBRl9JTkVUOwpAQCAtMjcxOCw3ICsyNzE4LDggQEAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAogbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogaW50IGluZXRfcnRtX2dldHJvdXRlKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IGI2N2UwZGQuLjViZDQzZDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC0yNDE1LDEwICsyNDE1LDExIEBACiAJCQkJCSZ0Y3BfaGFzaGluZm8uZWhhc2hfc2l6ZSwKIAkJCQkJTlVMTCwKIAkJCQkJMCk7Ci0JdGNwX2hhc2hpbmZvLmVoYXNoX3NpemUgPSAoMSA8PCB0Y3BfaGFzaGluZm8uZWhhc2hfc2l6ZSkgPj4gMTsKLQlmb3IgKGkgPSAwOyBpIDwgKHRjcF9oYXNoaW5mby5laGFzaF9zaXplIDw8IDEpOyBpKyspIHsKKwl0Y3BfaGFzaGluZm8uZWhhc2hfc2l6ZSA9IDEgPDwgdGNwX2hhc2hpbmZvLmVoYXNoX3NpemU7CisJZm9yIChpID0gMDsgaSA8IHRjcF9oYXNoaW5mby5laGFzaF9zaXplOyBpKyspIHsKIAkJcndsb2NrX2luaXQoJnRjcF9oYXNoaW5mby5laGFzaFtpXS5sb2NrKTsKIAkJSU5JVF9ITElTVF9IRUFEKCZ0Y3BfaGFzaGluZm8uZWhhc2hbaV0uY2hhaW4pOworCQlJTklUX0hMSVNUX0hFQUQoJnRjcF9oYXNoaW5mby5laGFzaFtpXS50d2NoYWluKTsKIAl9CiAKIAl0Y3BfaGFzaGluZm8uYmhhc2ggPQpAQCAtMjQ3NSw3ICsyNDc2LDcgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIlRDUDogSGFzaCB0YWJsZXMgY29uZmlndXJlZCAiCiAJICAgICAgICIoZXN0YWJsaXNoZWQgJWQgYmluZCAlZClcbiIsCi0JICAgICAgIHRjcF9oYXNoaW5mby5laGFzaF9zaXplIDw8IDEsIHRjcF9oYXNoaW5mby5iaGFzaF9zaXplKTsKKwkgICAgICAgdGNwX2hhc2hpbmZvLmVoYXNoX3NpemUsIHRjcF9oYXNoaW5mby5iaGFzaF9zaXplKTsKIAogCXRjcF9yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF9yZW5vKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pbnB1dC5jIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKaW5kZXggYzI2MDc2Zi4uYzYxMDk4OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTkzNiwyOCArOTM2LDU4IEBACiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJdW5zaWduZWQgY2hhciAqcHRyID0gYWNrX3NrYi0+aC5yYXcgKyBUQ1BfU0tCX0NCKGFja19za2IpLT5zYWNrZWQ7CiAJc3RydWN0IHRjcF9zYWNrX2Jsb2NrX3dpcmUgKnNwID0gKHN0cnVjdCB0Y3Bfc2Fja19ibG9ja193aXJlICopKHB0cisyKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqY2FjaGVkX3NrYjsKIAlpbnQgbnVtX3NhY2tzID0gKHB0clsxXSAtIFRDUE9MRU5fU0FDS19CQVNFKT4+MzsKIAlpbnQgcmVvcmQgPSB0cC0+cGFja2V0c19vdXQ7CiAJaW50IHByaW9yX2ZhY2tldHM7CiAJdTMyIGxvc3RfcmV0cmFucyA9IDA7CiAJaW50IGZsYWcgPSAwOwogCWludCBkdXBfc2FjayA9IDA7CisJaW50IGNhY2hlZF9mYWNrX2NvdW50OwogCWludCBpOworCWludCBmaXJzdF9zYWNrX2luZGV4OwogCiAJaWYgKCF0cC0+c2Fja2VkX291dCkKIAkJdHAtPmZhY2tldHNfb3V0ID0gMDsKIAlwcmlvcl9mYWNrZXRzID0gdHAtPmZhY2tldHNfb3V0OwogCisJLyogQ2hlY2sgZm9yIEQtU0FDSy4gKi8KKwlpZiAoYmVmb3JlKG50b2hsKHNwWzBdLnN0YXJ0X3NlcSksIFRDUF9TS0JfQ0IoYWNrX3NrYiktPmFja19zZXEpKSB7CisJCWR1cF9zYWNrID0gMTsKKwkJdHAtPnJ4X29wdC5zYWNrX29rIHw9IDQ7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUERTQUNLUkVDVik7CisJfSBlbHNlIGlmIChudW1fc2Fja3MgPiAxICYmCisJCQkhYWZ0ZXIobnRvaGwoc3BbMF0uZW5kX3NlcSksIG50b2hsKHNwWzFdLmVuZF9zZXEpKSAmJgorCQkJIWJlZm9yZShudG9obChzcFswXS5zdGFydF9zZXEpLCBudG9obChzcFsxXS5zdGFydF9zZXEpKSkgeworCQlkdXBfc2FjayA9IDE7CisJCXRwLT5yeF9vcHQuc2Fja19vayB8PSA0OworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BEU0FDS09GT1JFQ1YpOworCX0KKworCS8qIEQtU0FDSyBmb3IgYWxyZWFkeSBmb3Jnb3R0ZW4gZGF0YS4uLgorCSAqIERvIGR1bWIgY291bnRpbmcuICovCisJaWYgKGR1cF9zYWNrICYmCisJCQkhYWZ0ZXIobnRvaGwoc3BbMF0uZW5kX3NlcSksIHByaW9yX3NuZF91bmEpICYmCisJCQlhZnRlcihudG9obChzcFswXS5lbmRfc2VxKSwgdHAtPnVuZG9fbWFya2VyKSkKKwkJdHAtPnVuZG9fcmV0cmFucy0tOworCisJLyogRWxpbWluYXRlIHRvbyBvbGQgQUNLcywgYnV0IHRha2UgaW50bworCSAqIGFjY291bnQgbW9yZSBvciBsZXNzIGZyZXNoIG9uZXMsIHRoZXkgY2FuCisJICogY29udGFpbiB2YWxpZCBTQUNLIGluZm8uCisJICovCisJaWYgKGJlZm9yZShUQ1BfU0tCX0NCKGFja19za2IpLT5hY2tfc2VxLCBwcmlvcl9zbmRfdW5hIC0gdHAtPm1heF93aW5kb3cpKQorCQlyZXR1cm4gMDsKKwogCS8qIFNBQ0sgZmFzdHBhdGg6CiAJICogaWYgdGhlIG9ubHkgU0FDSyBjaGFuZ2UgaXMgdGhlIGluY3JlYXNlIG9mIHRoZSBlbmRfc2VxIG9mCiAJICogdGhlIGZpcnN0IGJsb2NrIHRoZW4gb25seSBhcHBseSB0aGF0IFNBQ0sgYmxvY2sKIAkgKiBhbmQgdXNlIHJldHJhbnMgcXVldWUgaGludGluZyBvdGhlcndpc2Ugc2xvd3BhdGggKi8KIAlmbGFnID0gMTsKLQlmb3IgKGkgPSAwOyBpPCBudW1fc2Fja3M7IGkrKykgewotCQlfX3UzMiBzdGFydF9zZXEgPSBudG9obChzcFtpXS5zdGFydF9zZXEpOwotCQlfX3UzMiBlbmRfc2VxID0JIG50b2hsKHNwW2ldLmVuZF9zZXEpOworCWZvciAoaSA9IDA7IGkgPCBudW1fc2Fja3M7IGkrKykgeworCQlfX2JlMzIgc3RhcnRfc2VxID0gc3BbaV0uc3RhcnRfc2VxOworCQlfX2JlMzIgZW5kX3NlcSA9IHNwW2ldLmVuZF9zZXE7CiAKLQkJaWYgKGkgPT0gMCl7CisJCWlmIChpID09IDApIHsKIAkJCWlmICh0cC0+cmVjdl9zYWNrX2NhY2hlW2ldLnN0YXJ0X3NlcSAhPSBzdGFydF9zZXEpCiAJCQkJZmxhZyA9IDA7CiAJCX0gZWxzZSB7CkBAIC05NjcsMzkgKzk5NywxNCBAQAogCQl9CiAJCXRwLT5yZWN2X3NhY2tfY2FjaGVbaV0uc3RhcnRfc2VxID0gc3RhcnRfc2VxOwogCQl0cC0+cmVjdl9zYWNrX2NhY2hlW2ldLmVuZF9zZXEgPSBlbmRfc2VxOwotCi0JCS8qIENoZWNrIGZvciBELVNBQ0suICovCi0JCWlmIChpID09IDApIHsKLQkJCXUzMiBhY2sgPSBUQ1BfU0tCX0NCKGFja19za2IpLT5hY2tfc2VxOwotCi0JCQlpZiAoYmVmb3JlKHN0YXJ0X3NlcSwgYWNrKSkgewotCQkJCWR1cF9zYWNrID0gMTsKLQkJCQl0cC0+cnhfb3B0LnNhY2tfb2sgfD0gNDsKLQkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BEU0FDS1JFQ1YpOwotCQkJfSBlbHNlIGlmIChudW1fc2Fja3MgPiAxICYmCi0JCQkJICAgIWFmdGVyKGVuZF9zZXEsIG50b2hsKHNwWzFdLmVuZF9zZXEpKSAmJgotCQkJCSAgICFiZWZvcmUoc3RhcnRfc2VxLCBudG9obChzcFsxXS5zdGFydF9zZXEpKSkgewotCQkJCWR1cF9zYWNrID0gMTsKLQkJCQl0cC0+cnhfb3B0LnNhY2tfb2sgfD0gNDsKLQkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BEU0FDS09GT1JFQ1YpOwotCQkJfQotCi0JCQkvKiBELVNBQ0sgZm9yIGFscmVhZHkgZm9yZ290dGVuIGRhdGEuLi4KLQkJCSAqIERvIGR1bWIgY291bnRpbmcuICovCi0JCQlpZiAoZHVwX3NhY2sgJiYKLQkJCSAgICAhYWZ0ZXIoZW5kX3NlcSwgcHJpb3Jfc25kX3VuYSkgJiYKLQkJCSAgICBhZnRlcihlbmRfc2VxLCB0cC0+dW5kb19tYXJrZXIpKQotCQkJCXRwLT51bmRvX3JldHJhbnMtLTsKLQotCQkJLyogRWxpbWluYXRlIHRvbyBvbGQgQUNLcywgYnV0IHRha2UgaW50bwotCQkJICogYWNjb3VudCBtb3JlIG9yIGxlc3MgZnJlc2ggb25lcywgdGhleSBjYW4KLQkJCSAqIGNvbnRhaW4gdmFsaWQgU0FDSyBpbmZvLgotCQkJICovCi0JCQlpZiAoYmVmb3JlKGFjaywgcHJpb3Jfc25kX3VuYSAtIHRwLT5tYXhfd2luZG93KSkKLQkJCQlyZXR1cm4gMDsKLQkJfQorCX0KKwkvKiBDbGVhciB0aGUgcmVzdCBvZiB0aGUgY2FjaGUgc2FjayBibG9ja3Mgc28gdGhleSB3b24ndCBtYXRjaCBtaXN0YWtlbmx5LiAqLworCWZvciAoOyBpIDwgQVJSQVlfU0laRSh0cC0+cmVjdl9zYWNrX2NhY2hlKTsgaSsrKSB7CisJCXRwLT5yZWN2X3NhY2tfY2FjaGVbaV0uc3RhcnRfc2VxID0gMDsKKwkJdHAtPnJlY3Zfc2Fja19jYWNoZVtpXS5lbmRfc2VxID0gMDsKIAl9CiAKKwlmaXJzdF9zYWNrX2luZGV4ID0gMDsKIAlpZiAoZmxhZykKIAkJbnVtX3NhY2tzID0gMTsKIAllbHNlIHsKQEAgLTEwMTYsNiArMTAyMSwxMCBAQAogCQkJCQl0bXAgPSBzcFtqXTsKIAkJCQkJc3Bbal0gPSBzcFtqKzFdOwogCQkJCQlzcFtqKzFdID0gdG1wOworCisJCQkJCS8qIFRyYWNrIHdoZXJlIHRoZSBmaXJzdCBTQUNLIGJsb2NrIGdvZXMgdG8gKi8KKwkJCQkJaWYgKGogPT0gZmlyc3Rfc2Fja19pbmRleCkKKwkJCQkJCWZpcnN0X3NhY2tfaW5kZXggPSBqKzE7CiAJCQkJfQogCiAJCQl9CkBAIC0xMDI1LDIwICsxMDM0LDIyIEBACiAJLyogY2xlYXIgZmxhZyBhcyB1c2VkIGZvciBkaWZmZXJlbnQgcHVycG9zZSBpbiBmb2xsb3dpbmcgY29kZSAqLwogCWZsYWcgPSAwOwogCisJLyogVXNlIFNBQ0sgZmFzdHBhdGggaGludCBpZiB2YWxpZCAqLworCWNhY2hlZF9za2IgPSB0cC0+ZmFzdHBhdGhfc2tiX2hpbnQ7CisJY2FjaGVkX2ZhY2tfY291bnQgPSB0cC0+ZmFzdHBhdGhfY250X2hpbnQ7CisJaWYgKCFjYWNoZWRfc2tiKSB7CisJCWNhY2hlZF9za2IgPSBzay0+c2tfd3JpdGVfcXVldWUubmV4dDsKKwkJY2FjaGVkX2ZhY2tfY291bnQgPSAwOworCX0KKwogCWZvciAoaT0wOyBpPG51bV9zYWNrczsgaSsrLCBzcCsrKSB7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAJCV9fdTMyIHN0YXJ0X3NlcSA9IG50b2hsKHNwLT5zdGFydF9zZXEpOwogCQlfX3UzMiBlbmRfc2VxID0gbnRvaGwoc3AtPmVuZF9zZXEpOwogCQlpbnQgZmFja19jb3VudDsKIAotCQkvKiBVc2UgU0FDSyBmYXN0cGF0aCBoaW50IGlmIHZhbGlkICovCi0JCWlmICh0cC0+ZmFzdHBhdGhfc2tiX2hpbnQpIHsKLQkJCXNrYiA9IHRwLT5mYXN0cGF0aF9za2JfaGludDsKLQkJCWZhY2tfY291bnQgPSB0cC0+ZmFzdHBhdGhfY250X2hpbnQ7Ci0JCX0gZWxzZSB7Ci0JCQlza2IgPSBzay0+c2tfd3JpdGVfcXVldWUubmV4dDsKLQkJCWZhY2tfY291bnQgPSAwOwotCQl9CisJCXNrYiA9IGNhY2hlZF9za2I7CisJCWZhY2tfY291bnQgPSBjYWNoZWRfZmFja19jb3VudDsKIAogCQkvKiBFdmVudCAiQiIgaW4gdGhlIGNvbW1lbnQgYWJvdmUuICovCiAJCWlmIChhZnRlcihlbmRfc2VxLCB0cC0+aGlnaF9zZXEpKQpAQCAtMTA0OCw4ICsxMDU5LDEyIEBACiAJCQlpbnQgaW5fc2FjaywgcGNvdW50OwogCQkJdTggc2Fja2VkOwogCi0JCQl0cC0+ZmFzdHBhdGhfc2tiX2hpbnQgPSBza2I7Ci0JCQl0cC0+ZmFzdHBhdGhfY250X2hpbnQgPSBmYWNrX2NvdW50OworCQkJY2FjaGVkX3NrYiA9IHNrYjsKKwkJCWNhY2hlZF9mYWNrX2NvdW50ID0gZmFja19jb3VudDsKKwkJCWlmIChpID09IGZpcnN0X3NhY2tfaW5kZXgpIHsKKwkJCQl0cC0+ZmFzdHBhdGhfc2tiX2hpbnQgPSBza2I7CisJCQkJdHAtPmZhc3RwYXRoX2NudF9oaW50ID0gZmFja19jb3VudDsKKwkJCX0KIAogCQkJLyogVGhlIHJldHJhbnNtaXNzaW9uIHF1ZXVlIGlzIGFsd2F5cyBpbiBvcmRlciwgc28KIAkJCSAqIHdlIGNhbiBzaG9ydC1jaXJjdWl0IHRoZSB3YWxrIGVhcmx5LgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggMTJkZTkwYS4uZjUxZDY0MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAl0bXAgPSBpcF9yb3V0ZV9jb25uZWN0KCZydCwgbmV4dGhvcCwgaW5ldC0+c2FkZHIsCiAJCQkgICAgICAgUlRfQ09OTl9GTEFHUyhzayksIHNrLT5za19ib3VuZF9kZXZfaWYsCiAJCQkgICAgICAgSVBQUk9UT19UQ1AsCi0JCQkgICAgICAgaW5ldC0+c3BvcnQsIHVzaW4tPnNpbl9wb3J0LCBzayk7CisJCQkgICAgICAgaW5ldC0+c3BvcnQsIHVzaW4tPnNpbl9wb3J0LCBzaywgMSk7CiAJaWYgKHRtcCA8IDApCiAJCXJldHVybiB0bXA7CiAKQEAgLTUwMiwxMSArNTAyLDExIEBACiAJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQl0aC0+Y2hlY2sgPSB+dGNwX3Y0X2NoZWNrKHRoLCBsZW4sCi0JCQkJCSAgaW5ldC0+c2FkZHIsIGluZXQtPmRhZGRyLCAwKTsKKwkJdGgtPmNoZWNrID0gfnRjcF92NF9jaGVjayhsZW4sIGluZXQtPnNhZGRyLAorCQkJCQkgIGluZXQtPmRhZGRyLCAwKTsKIAkJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKIAl9IGVsc2UgewotCQl0aC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2sodGgsIGxlbiwgaW5ldC0+c2FkZHIsIGluZXQtPmRhZGRyLAorCQl0aC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2sobGVuLCBpbmV0LT5zYWRkciwgaW5ldC0+ZGFkZHIsCiAJCQkJCSBjc3VtX3BhcnRpYWwoKGNoYXIgKil0aCwKIAkJCQkJCSAgICAgIHRoLT5kb2ZmIDw8IDIsCiAJCQkJCQkgICAgICBza2ItPmNzdW0pKTsKQEAgLTUyNSw3ICs1MjUsNyBAQAogCXRoID0gc2tiLT5oLnRoOwogCiAJdGgtPmNoZWNrID0gMDsKLQl0aC0+Y2hlY2sgPSB+dGNwX3Y0X2NoZWNrKHRoLCBza2ItPmxlbiwgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgMCk7CisJdGgtPmNoZWNrID0gfnRjcF92NF9jaGVjayhza2ItPmxlbiwgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgMCk7CiAJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJcmV0dXJuIDA7CkBAIC03NDcsNyArNzQ3LDcgQEAKIAlpZiAoc2tiKSB7CiAJCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOwogCi0JCXRoLT5jaGVjayA9IHRjcF92NF9jaGVjayh0aCwgc2tiLT5sZW4sCisJCXRoLT5jaGVjayA9IHRjcF92NF9jaGVjayhza2ItPmxlbiwKIAkJCQkJIGlyZXEtPmxvY19hZGRyLAogCQkJCQkgaXJlcS0+cm10X2FkZHIsCiAJCQkJCSBjc3VtX3BhcnRpYWwoKGNoYXIgKil0aCwgc2tiLT5sZW4sCkBAIC0xNTE0LDcgKzE1MTQsNyBAQAogc3RhdGljIF9fc3VtMTYgdGNwX3Y0X2NoZWNrc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKLQkJaWYgKCF0Y3BfdjRfY2hlY2soc2tiLT5oLnRoLCBza2ItPmxlbiwgc2tiLT5uaC5pcGgtPnNhZGRyLAorCQlpZiAoIXRjcF92NF9jaGVjayhza2ItPmxlbiwgc2tiLT5uaC5pcGgtPnNhZGRyLAogCQkJCSAgc2tiLT5uaC5pcGgtPmRhZGRyLCBza2ItPmNzdW0pKSB7CiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCQkJcmV0dXJuIDA7CkBAIC0yMDUxLDcgKzIwNTEsNyBAQAogCQl9CiAJCXN0LT5zdGF0ZSA9IFRDUF9TRVFfU1RBVEVfVElNRV9XQUlUOwogCQlpbmV0X3R3c2tfZm9yX2VhY2godHcsIG5vZGUsCi0JCQkJICAgJnRjcF9oYXNoaW5mby5laGFzaFtzdC0+YnVja2V0ICsgdGNwX2hhc2hpbmZvLmVoYXNoX3NpemVdLmNoYWluKSB7CisJCQkJICAgJnRjcF9oYXNoaW5mby5laGFzaFtzdC0+YnVja2V0XS50d2NoYWluKSB7CiAJCQlpZiAodHctPnR3X2ZhbWlseSAhPSBzdC0+ZmFtaWx5KSB7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0yMTA3LDcgKzIxMDcsNyBAQAogCX0KIAogCXN0LT5zdGF0ZSA9IFRDUF9TRVFfU1RBVEVfVElNRV9XQUlUOwotCXR3ID0gdHdfaGVhZCgmdGNwX2hhc2hpbmZvLmVoYXNoW3N0LT5idWNrZXQgKyB0Y3BfaGFzaGluZm8uZWhhc2hfc2l6ZV0uY2hhaW4pOworCXR3ID0gdHdfaGVhZCgmdGNwX2hhc2hpbmZvLmVoYXNoW3N0LT5idWNrZXRdLnR3Y2hhaW4pOwogCWdvdG8gZ2V0X3R3OwogZm91bmQ6CiAJY3VyID0gc2s7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKaW5kZXggOTc1ZjQ0Ny4uNThiNzExMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtOTY1LDcgKzk2NSw4IEBACiAJdTMyIGluX2ZsaWdodCwgY3duZDsKIAogCS8qIERvbid0IGJlIHN0cmljdCBhYm91dCB0aGUgY29uZ2VzdGlvbiB3aW5kb3cgZm9yIHRoZSBmaW5hbCBGSU4uICAqLwotCWlmIChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19GSU4pCisJaWYgKChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19GSU4pICYmCisJICAgIHRjcF9za2JfcGNvdW50KHNrYikgPT0gMSkKIAkJcmV0dXJuIDE7CiAKIAlpbl9mbGlnaHQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCBjZmZmOTMwLi44YjU0YzY4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHAuYworKysgYi9uZXQvaXB2NC91ZHAuYwpAQCAtNjI5LDcgKzYyOSw3IEBACiAJCQkJCSAgICAgICB7IC5zcG9ydCA9IGluZXQtPnNwb3J0LAogCQkJCQkJIC5kcG9ydCA9IGRwb3J0IH0gfSB9OwogCQlzZWN1cml0eV9za19jbGFzc2lmeV9mbG93KHNrLCAmZmwpOwotCQllcnIgPSBpcF9yb3V0ZV9vdXRwdXRfZmxvdygmcnQsICZmbCwgc2ssICEobXNnLT5tc2dfZmxhZ3MmTVNHX0RPTlRXQUlUKSk7CisJCWVyciA9IGlwX3JvdXRlX291dHB1dF9mbG93KCZydCwgJmZsLCBzaywgMSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfbW9kZV90dW5uZWwuYyBiL25ldC9pcHY0L3hmcm00X21vZGVfdHVubmVsLmMKaW5kZXggZTIzYzIxZC4uZTU0YzU0OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfbW9kZV90dW5uZWwuYworKysgYi9uZXQvaXB2NC94ZnJtNF9tb2RlX3R1bm5lbC5jCkBAIC0yMyw2ICsyMywxMiBAQAogCQlJUF9FQ05fc2V0X2NlKGlubmVyX2lwaCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcGlwNl9lY25fZGVjYXBzdWxhdGUoc3RydWN0IGlwaGRyICppcGgsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKElORVRfRUNOX2lzX2NlKGlwaC0+dG9zKSkKKwkJSVA2X0VDTl9zZXRfY2Uoc2tiLT5uaC5pcHY2aCk7Cit9CisKIC8qIEFkZCBlbmNhcHN1bGF0aW9uIGhlYWRlci4KICAqCiAgKiBUaGUgdG9wIElQIGhlYWRlciB3aWxsIGJlIGNvbnN0cnVjdGVkIHBlciBSRkMgMjQwMS4gIFRoZSBmb2xsb3dpbmcgZmllbGRzCkBAIC0zNiw2ICs0Miw3IEBACiBzdGF0aWMgaW50IHhmcm00X3R1bm5lbF9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisJc3RydWN0IHhmcm1fZHN0ICp4ZHN0ID0gKHN0cnVjdCB4ZnJtX2RzdCopZHN0OwogCXN0cnVjdCBpcGhkciAqaXBoLCAqdG9wX2lwaDsKIAlpbnQgZmxhZ3M7CiAKQEAgLTQ4LDE1ICs1NSwyNyBAQAogCXRvcF9pcGgtPmlobCA9IDU7CiAJdG9wX2lwaC0+dmVyc2lvbiA9IDQ7CiAKLQkvKiBEUyBkaXNjbG9zZWQgKi8KLQl0b3BfaXBoLT50b3MgPSBJTkVUX0VDTl9lbmNhcHN1bGF0ZShpcGgtPnRvcywgaXBoLT50b3MpOwotCiAJZmxhZ3MgPSB4LT5wcm9wcy5mbGFnczsKKworCS8qIERTIGRpc2Nsb3NlZCAqLworCWlmICh4ZHN0LT5yb3V0ZS0+b3BzLT5mYW1pbHkgPT0gQUZfSU5FVCkgeworCQl0b3BfaXBoLT5wcm90b2NvbCA9IElQUFJPVE9fSVBJUDsKKwkJdG9wX2lwaC0+dG9zID0gSU5FVF9FQ05fZW5jYXBzdWxhdGUoaXBoLT50b3MsIGlwaC0+dG9zKTsKKwkJdG9wX2lwaC0+ZnJhZ19vZmYgPSAoZmxhZ3MgJiBYRlJNX1NUQVRFX05PUE1UVURJU0MpID8KKwkJCTAgOiAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSk7CisJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKKwllbHNlIHsKKwkJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gKHN0cnVjdCBpcHY2aGRyKilpcGg7CisJCXRvcF9pcGgtPnByb3RvY29sID0gSVBQUk9UT19JUFY2OworCQl0b3BfaXBoLT50b3MgPSBJTkVUX0VDTl9lbmNhcHN1bGF0ZShpcGgtPnRvcywgaXB2Nl9nZXRfZHNmaWVsZChpcHY2aCkpOworCQl0b3BfaXBoLT5mcmFnX29mZiA9IDA7CisJfQorI2VuZGlmCisKIAlpZiAoZmxhZ3MgJiBYRlJNX1NUQVRFX05PRUNOKQogCQlJUF9FQ05fY2xlYXIodG9wX2lwaCk7CiAKLQl0b3BfaXBoLT5mcmFnX29mZiA9IChmbGFncyAmIFhGUk1fU1RBVEVfTk9QTVRVRElTQykgPwotCQkwIDogKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpOwogCWlmICghdG9wX2lwaC0+ZnJhZ19vZmYpCiAJCV9faXBfc2VsZWN0X2lkZW50KHRvcF9pcGgsIGRzdC0+Y2hpbGQsIDApOwogCkBAIC02NCw3ICs4Myw2IEBACiAKIAl0b3BfaXBoLT5zYWRkciA9IHgtPnByb3BzLnNhZGRyLmE0OwogCXRvcF9pcGgtPmRhZGRyID0geC0+aWQuZGFkZHIuYTQ7Ci0JdG9wX2lwaC0+cHJvdG9jb2wgPSBJUFBST1RPX0lQSVA7CiAKIAltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykpOwogCXJldHVybiAwOwpAQCAtNzUsOCArOTMsMTYgQEAKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwogCWludCBlcnIgPSAtRUlOVkFMOwogCi0JaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19JUElQKQotCQlnb3RvIG91dDsKKwlzd2l0Y2goaXBoLT5wcm90b2NvbCl7CisJCWNhc2UgSVBQUk9UT19JUElQOgorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKKwkJY2FzZSBJUFBST1RPX0lQVjY6CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJfQorCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQogCQlnb3RvIG91dDsKIApAQCAtODQsMTAgKzExMCwxOSBAQAogCSAgICAoZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX0RFQ0FQX0RTQ1ApCi0JCWlwdjRfY29weV9kc2NwKGlwaCwgc2tiLT5oLmlwaXBoKTsKLQlpZiAoISh4LT5wcm9wcy5mbGFncyAmIFhGUk1fU1RBVEVfTk9FQ04pKQotCQlpcGlwX2Vjbl9kZWNhcHN1bGF0ZShza2IpOworCWlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fSVBJUCkgeworCQlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX0RFQ0FQX0RTQ1ApCisJCQlpcHY0X2NvcHlfZHNjcChpcGgsIHNrYi0+aC5pcGlwaCk7CisJCWlmICghKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT0VDTikpCisJCQlpcGlwX2Vjbl9kZWNhcHN1bGF0ZShza2IpOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisJZWxzZSB7CisJCWlmICghKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT0VDTikpCisJCQlpcGlwNl9lY25fZGVjYXBzdWxhdGUoaXBoLCBza2IpOworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CisJfQorI2VuZGlmCiAJc2tiLT5tYWMucmF3ID0gbWVtbW92ZShza2ItPmRhdGEgLSBza2ItPm1hY19sZW4sCiAJCQkgICAgICAgc2tiLT5tYWMucmF3LCBza2ItPm1hY19sZW4pOwogCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfcG9saWN5LmMgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwppbmRleCBmYjlmNjljLi42OTlmMjdjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYworKysgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwpAQCAtNzIsMTMgKzcyLDExIEBACiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0LCAqZHN0X3ByZXY7CiAJc3RydWN0IHJ0YWJsZSAqcnQwID0gKHN0cnVjdCBydGFibGUqKSgqZHN0X3ApOwogCXN0cnVjdCBydGFibGUgKnJ0ID0gcnQwOwotCV9fYmUzMiByZW1vdGUgPSBmbC0+Zmw0X2RzdDsKLQlfX2JlMzIgbG9jYWwgID0gZmwtPmZsNF9zcmM7CiAJc3RydWN0IGZsb3dpIGZsX3R1bm5lbCA9IHsKIAkJLm5sX3UgPSB7CiAJCQkuaXA0X3UgPSB7Ci0JCQkJLnNhZGRyID0gbG9jYWwsCi0JCQkJLmRhZGRyID0gcmVtb3RlLAorCQkJCS5zYWRkciA9IGZsLT5mbDRfc3JjLAorCQkJCS5kYWRkciA9IGZsLT5mbDRfZHN0LAogCQkJCS50b3MgPSBmbC0+Zmw0X3RvcwogCQkJfQogCQl9CkBAIC05NCw3ICs5Miw2IEBACiAJZm9yIChpID0gMDsgaSA8IG54OyBpKyspIHsKIAkJc3RydWN0IGRzdF9lbnRyeSAqZHN0MSA9IGRzdF9hbGxvYygmeGZybTRfZHN0X29wcyk7CiAJCXN0cnVjdCB4ZnJtX2RzdCAqeGRzdDsKLQkJaW50IHR1bm5lbCA9IDA7CiAKIAkJaWYgKHVubGlrZWx5KGRzdDEgPT0gTlVMTCkpIHsKIAkJCWVyciA9IC1FTk9CVUZTOwpAQCAtMTE2LDE5ICsxMTMsMjggQEAKIAogCQlkc3QxLT5uZXh0ID0gZHN0X3ByZXY7CiAJCWRzdF9wcmV2ID0gZHN0MTsKLQkJaWYgKHhmcm1baV0tPnByb3BzLm1vZGUgIT0gWEZSTV9NT0RFX1RSQU5TUE9SVCkgewotCQkJcmVtb3RlID0geGZybVtpXS0+aWQuZGFkZHIuYTQ7Ci0JCQlsb2NhbCAgPSB4ZnJtW2ldLT5wcm9wcy5zYWRkci5hNDsKLQkJCXR1bm5lbCA9IDE7Ci0JCX0KKwogCQloZWFkZXJfbGVuICs9IHhmcm1baV0tPnByb3BzLmhlYWRlcl9sZW47CiAJCXRyYWlsZXJfbGVuICs9IHhmcm1baV0tPnByb3BzLnRyYWlsZXJfbGVuOwogCi0JCWlmICh0dW5uZWwpIHsKLQkJCWZsX3R1bm5lbC5mbDRfc3JjID0gbG9jYWw7Ci0JCQlmbF90dW5uZWwuZmw0X2RzdCA9IHJlbW90ZTsKKwkJaWYgKHhmcm1baV0tPnByb3BzLm1vZGUgPT0gWEZSTV9NT0RFX1RVTk5FTCkgeworCQkJdW5zaWduZWQgc2hvcnQgZW5jYXBfZmFtaWx5ID0geGZybVtpXS0+cHJvcHMuZmFtaWx5OworCQkJc3dpdGNoKGVuY2FwX2ZhbWlseSkgeworCQkJY2FzZSBBRl9JTkVUOgorCQkJCWZsX3R1bm5lbC5mbDRfZHN0ID0geGZybVtpXS0+aWQuZGFkZHIuYTQ7CisJCQkJZmxfdHVubmVsLmZsNF9zcmMgPSB4ZnJtW2ldLT5wcm9wcy5zYWRkci5hNDsKKwkJCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisJCQljYXNlIEFGX0lORVQ2OgorCQkJCWlwdjZfYWRkcl9jb3B5KCZmbF90dW5uZWwuZmw2X2RzdCwgKHN0cnVjdCBpbjZfYWRkciopJnhmcm1baV0tPmlkLmRhZGRyLmE2KTsKKwkJCQlpcHY2X2FkZHJfY29weSgmZmxfdHVubmVsLmZsNl9zcmMsIChzdHJ1Y3QgaW42X2FkZHIqKSZ4ZnJtW2ldLT5wcm9wcy5zYWRkci5hNik7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJQlVHX09OKDEpOworCQkJfQogCQkJZXJyID0geGZybV9kc3RfbG9va3VwKChzdHJ1Y3QgeGZybV9kc3QgKiopJnJ0LAotCQkJCQkgICAgICAmZmxfdHVubmVsLCBBRl9JTkVUKTsKKwkJCQkJICAgICAgJmZsX3R1bm5lbCwgZW5jYXBfZmFtaWx5KTsKIAkJCWlmIChlcnIpCiAJCQkJZ290byBlcnJvcjsKIAkJfSBlbHNlCkBAIC0xNDUsNiArMTUxLDcgQEAKIAlpID0gMDsKIAlmb3IgKDsgZHN0X3ByZXYgIT0gJnJ0LT51LmRzdDsgZHN0X3ByZXYgPSBkc3RfcHJldi0+Y2hpbGQpIHsKIAkJc3RydWN0IHhmcm1fZHN0ICp4ID0gKHN0cnVjdCB4ZnJtX2RzdCopZHN0X3ByZXY7CisJCXN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvOwogCQl4LT51LnJ0LmZsID0gKmZsOwogCiAJCWRzdF9wcmV2LT54ZnJtID0geGZybVtpKytdOwpAQCAtMTYyLDggKzE2OSwxOCBAQAogCQkvKiBDb3B5IG5laWdoYm91dCBmb3IgcmVhY2hhYmlsaXR5IGNvbmZpcm1hdGlvbiAqLwogCQlkc3RfcHJldi0+bmVpZ2hib3VyCT0gbmVpZ2hfY2xvbmUocnQtPnUuZHN0Lm5laWdoYm91cik7CiAJCWRzdF9wcmV2LT5pbnB1dAkJPSBydC0+dS5kc3QuaW5wdXQ7Ci0JCWRzdF9wcmV2LT5vdXRwdXQJPSB4ZnJtNF9vdXRwdXQ7Ci0JCWlmIChydC0+cGVlcikKKwkJLyogWFhYOiBXaGVuIElQdjYgbW9kdWxlIGNhbiBiZSB1bmxvYWRlZCwgd2Ugc2hvdWxkIG1hbmFnZSByZWZlcmVuY2UKKwkJICogdG8geGZybTZfb3V0cHV0IGluIGFmaW5mby0+b3V0cHV0LiBNaXlhemF3YQorCQkgKiAqLworCQlhZmluZm8gPSB4ZnJtX3N0YXRlX2dldF9hZmluZm8oZHN0X3ByZXYtPnhmcm0tPnByb3BzLmZhbWlseSk7CisJCWlmICghYWZpbmZvKSB7CisJCQlkc3QgPSAqZHN0X3A7CisJCQllcnIgPSAtRUFGTk9TVVBQT1JUOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkc3RfcHJldi0+b3V0cHV0ID0gYWZpbmZvLT5vdXRwdXQ7CisJCXhmcm1fc3RhdGVfcHV0X2FmaW5mbyhhZmluZm8pOworCQlpZiAoZHN0X3ByZXYtPnhmcm0tPnByb3BzLmZhbWlseSA9PSBBRl9JTkVUICYmIHJ0LT5wZWVyKQogCQkJYXRvbWljX2luYygmcnQtPnBlZXItPnJlZmNudCk7CiAJCXgtPnUucnQucGVlciA9IHJ0LT5wZWVyOwogCQkvKiBTaGVpdC4uLiBJIHJlbWVtYmVyIEkgZGlkIHRoaXMgcmlnaHQuIEFwcGFyZW50bHksCkBAIC0yNzQsNyArMjkxLDcgQEAKIAogCWlmIChsaWtlbHkoeGRzdC0+dS5ydC5pZGV2KSkKIAkJaW5fZGV2X3B1dCh4ZHN0LT51LnJ0LmlkZXYpOwotCWlmIChsaWtlbHkoeGRzdC0+dS5ydC5wZWVyKSkKKwlpZiAoZHN0LT54ZnJtLT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVCAmJiBsaWtlbHkoeGRzdC0+dS5ydC5wZWVyKSkKIAkJaW5ldF9wdXRwZWVyKHhkc3QtPnUucnQucGVlcik7CiAJeGZybV9kc3RfZGVzdHJveSh4ZHN0KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X3N0YXRlLmMgYi9uZXQvaXB2NC94ZnJtNF9zdGF0ZS5jCmluZGV4IDNjYzNkZjAuLjkzZTJjMDYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3N0YXRlLmMKKysrIGIvbmV0L2lwdjQveGZybTRfc3RhdGUuYwpAQCAtNTEsNiArNTEsNyBAQAogCS5mYW1pbHkJCQk9IEFGX0lORVQsCiAJLmluaXRfZmxhZ3MJCT0geGZybTRfaW5pdF9mbGFncywKIAkuaW5pdF90ZW1wc2VsCQk9IF9feGZybTRfaW5pdF90ZW1wc2VsLAorCS5vdXRwdXQJCQk9IHhmcm00X291dHB1dCwKIH07CiAKIHZvaWQgX19pbml0IHhmcm00X3N0YXRlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IGUzODU0NjkuLmZlNWUxZDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtMzExNyw3ICszMTE3LDcgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlwdXRfaWZhZGRybXNnKG5saCwgaWZhLT5wcmVmaXhfbGVuLCBpZmEtPmZsYWdzLCBydF9zY29wZShpZmEtPnNjb3BlKSwKIAkJICAgICAgaWZhLT5pZGV2LT5kZXYtPmlmaW5kZXgpOwpAQCAtMzEzNyw4ICszMTM3LDEwIEBACiAJfQogCiAJaWYgKG5sYV9wdXQoc2tiLCBJRkFfQUREUkVTUywgMTYsICZpZmEtPmFkZHIpIDwgMCB8fAotCSAgICBwdXRfY2FjaGVpbmZvKHNrYiwgaWZhLT5jc3RhbXAsIGlmYS0+dHN0YW1wLCBwcmVmZXJyZWQsIHZhbGlkKSA8IDApCi0JCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCSAgICBwdXRfY2FjaGVpbmZvKHNrYiwgaWZhLT5jc3RhbXAsIGlmYS0+dHN0YW1wLCBwcmVmZXJyZWQsIHZhbGlkKSA8IDApIHsKKwkJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CiAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIH0KQEAgLTMxNTUsMTMgKzMxNTcsMTUgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlwdXRfaWZhZGRybXNnKG5saCwgMTI4LCBJRkFfRl9QRVJNQU5FTlQsIHNjb3BlLCBpZmluZGV4KTsKIAlpZiAobmxhX3B1dChza2IsIElGQV9NVUxUSUNBU1QsIDE2LCAmaWZtY2EtPm1jYV9hZGRyKSA8IDAgfHwKIAkgICAgcHV0X2NhY2hlaW5mbyhza2IsIGlmbWNhLT5tY2FfY3N0YW1wLCBpZm1jYS0+bWNhX3RzdGFtcCwKLQkJCSAgSU5GSU5JVFlfTElGRV9USU1FLCBJTkZJTklUWV9MSUZFX1RJTUUpIDwgMCkKLQkJcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJCQkgIElORklOSVRZX0xJRkVfVElNRSwgSU5GSU5JVFlfTElGRV9USU1FKSA8IDApIHsKKwkJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CiAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIH0KQEAgLTMxNzgsMTMgKzMxODIsMTUgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpLCBmbGFncyk7CiAJaWYgKG5saCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0JVRlM7CisJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlwdXRfaWZhZGRybXNnKG5saCwgMTI4LCBJRkFfRl9QRVJNQU5FTlQsIHNjb3BlLCBpZmluZGV4KTsKIAlpZiAobmxhX3B1dChza2IsIElGQV9BTllDQVNULCAxNiwgJmlmYWNhLT5hY2FfYWRkcikgPCAwIHx8CiAJICAgIHB1dF9jYWNoZWluZm8oc2tiLCBpZmFjYS0+YWNhX2NzdGFtcCwgaWZhY2EtPmFjYV90c3RhbXAsCi0JCQkgIElORklOSVRZX0xJRkVfVElNRSwgSU5GSU5JVFlfTElGRV9USU1FKSA8IDApCi0JCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCQkJICBJTkZJTklUWV9MSUZFX1RJTUUsIElORklOSVRZX0xJRkVfVElNRSkgPCAwKSB7CisJCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJCXJldHVybiAtRU1TR1NJWkU7CisJfQogCiAJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiB9CkBAIC0zMzM0LDkgKzMzNDAsMTIgQEAKIAogCWVyciA9IGluZXQ2X2ZpbGxfaWZhZGRyKHNrYiwgaWZhLCBORVRMSU5LX0NCKGluX3NrYikucGlkLAogCQkJCW5saC0+bmxtc2dfc2VxLCBSVE1fTkVXQUREUiwgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9pZmFkZHJfbXNnc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGluZXQ2X2lmYWRkcl9tc2dzaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0X2lmYTsKKwl9CiAJZXJyID0gcnRubF91bmljYXN0KHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCk7CiBlcnJvdXRfaWZhOgogCWluNl9pZmFfcHV0KGlmYSk7CkBAIC0zMzU0LDkgKzMzNjMsMTIgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX2lmYWRkcihza2IsIGlmYSwgMCwgMCwgZXZlbnQsIDApOwotCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gaW5ldDZfaWZhZGRyX21zZ3NpemUoKSAqLwotCUJVR19PTihlcnIgPCAwKTsKLQorCWlmIChlcnIgPCAwKSB7CisJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9pZmFkZHJfbXNnc2l6ZSgpICovCisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVycm91dDsKKwl9CiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0lQVjZfSUZBRERSLCBOVUxMLCBHRlBfQVRPTUlDKTsKIGVycm91dDoKIAlpZiAoZXJyIDwgMCkKQEAgLTM0MjYsNyArMzQzOCw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqaGRyKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJaGRyID0gbmxtc2dfZGF0YShubGgpOwogCWhkci0+aWZpX2ZhbWlseSA9IEFGX0lORVQ2OwpAQCAtMzQ2OSw3ICszNDgxLDggQEAKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAogbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogc3RhdGljIGludCBpbmV0Nl9kdW1wX2lmaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCkBAIC0zNTA3LDkgKzM1MjAsMTIgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX2lmaW5mbyhza2IsIGlkZXYsIDAsIDAsIGV2ZW50LCAwKTsKLQkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGluZXQ2X2lmX25sbXNnX3NpemUoKSAqLwotCUJVR19PTihlcnIgPCAwKTsKLQorCWlmIChlcnIgPCAwKSB7CisJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9pZl9ubG1zZ19zaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfSVBWNl9JRkFERFIsIE5VTEwsIEdGUF9BVE9NSUMpOwogZXJyb3V0OgogCWlmIChlcnIgPCAwKQpAQCAtMzUzMyw3ICszNTQ5LDcgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpwbXNnKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9CVUZTOworCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJcG1zZyA9IG5sbXNnX2RhdGEobmxoKTsKIAlwbXNnLT5wcmVmaXhfZmFtaWx5ID0gQUZfSU5FVDY7CkBAIC0zNTU4LDcgKzM1NzQsOCBAQAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCiBubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiBzdGF0aWMgdm9pZCBpbmV0Nl9wcmVmaXhfbm90aWZ5KGludCBldmVudCwgc3RydWN0IGluZXQ2X2RldiAqaWRldiwgCkBAIC0zNTcyLDkgKzM1ODksMTIgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX3ByZWZpeChza2IsIGlkZXYsIHBpbmZvLCAwLCAwLCBldmVudCwgMCk7Ci0JLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9wcmVmaXhfbmxtc2dfc2l6ZSgpICovCi0JQlVHX09OKGVyciA8IDApOwotCisJaWYgKGVyciA8IDApIHsKKwkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGluZXQ2X3ByZWZpeF9ubG1zZ19zaXplKCkgKi8KKwkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZXJyb3V0OworCX0KIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfSVBWNl9QUkVGSVgsIE5VTEwsIEdGUF9BVE9NSUMpOwogZXJyb3V0OgogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZGF0YWdyYW0uYyBiL25ldC9pcHY2L2RhdGFncmFtLmMKaW5kZXggNWM5NGZlYS4uZWNkZTMwMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZGF0YWdyYW0uYworKysgYi9uZXQvaXB2Ni9kYXRhZ3JhbS5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAlpZiAoZmluYWxfcCkKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGZpbmFsX3ApOwogCi0JaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKQorCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMSkpIDwgMCkKIAkJZ290byBvdXQ7CiAKIAkvKiBzb3VyY2UgYWRkcmVzcyBsb29rdXAgZG9uZSBpbiBpcDZfZHN0X2xvb2t1cCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaW5ldDZfaGFzaHRhYmxlcy5jIGIvbmV0L2lwdjYvaW5ldDZfaGFzaHRhYmxlcy5jCmluZGV4IGI3ZTViYWUuLmU2MTExNjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2luZXQ2X2hhc2h0YWJsZXMuYworKysgYi9uZXQvaXB2Ni9pbmV0Nl9oYXNodGFibGVzLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAkJCWdvdG8gaGl0OyAvKiBZb3Ugc3VuayBteSBiYXR0bGVzaGlwISAqLwogCX0KIAkvKiBNdXN0IGNoZWNrIGZvciBhIFRJTUVfV0FJVCdlciBiZWZvcmUgZ29pbmcgdG8gbGlzdGVuZXIgaGFzaC4gKi8KLQlza19mb3JfZWFjaChzaywgbm9kZSwgJihoZWFkICsgaGFzaGluZm8tPmVoYXNoX3NpemUpLT5jaGFpbikgeworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmaGVhZC0+dHdjaGFpbikgewogCQljb25zdCBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dyA9IGluZXRfdHdzayhzayk7CiAKIAkJaWYoKigoX19wb3J0cGFpciAqKSYodHctPnR3X2Rwb3J0KSkJPT0gcG9ydHMJJiYKQEAgLTE4Myw3ICsxODMsNyBAQAogCXdyaXRlX2xvY2soJmhlYWQtPmxvY2spOwogCiAJLyogQ2hlY2sgVElNRS1XQUlUIHNvY2tldHMgZmlyc3QuICovCi0Jc2tfZm9yX2VhY2goc2syLCBub2RlLCAmKGhlYWQgKyBoaW5mby0+ZWhhc2hfc2l6ZSktPmNoYWluKSB7CisJc2tfZm9yX2VhY2goc2syLCBub2RlLCAmaGVhZC0+dHdjaGFpbikgewogCQljb25zdCBzdHJ1Y3QgaW5ldDZfdGltZXdhaXRfc29jayAqdHc2ID0gaW5ldDZfdHdzayhzazIpOwogCiAJCXR3ID0gaW5ldF90d3NrKHNrMik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKaW5kZXggOGQ5MTgzNC4uMmI5ZTNiYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwpAQCAtOTk5LDcgKzk5OSw4IEBACiAJCQkJYnJlYWs7CiAJCQlkZXYgPSB0LT5kZXY7CiAJCX0KLQkJZXJyID0gdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJZXJyID0gMDsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IDg4MmNkZTQuLmUzZWMyMTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtMTU4Miw2ICsxNTgyLDggQEAKIAkJCXNrYiA9IGFkZF9ncmhlYWQoc2tiLCBwbWMsIHR5cGUsICZwZ3IpOwogCQkJZmlyc3QgPSAwOwogCQl9CisJCWlmICghc2tiKQorCQkJcmV0dXJuIE5VTEw7CiAJCXBzcmMgPSAoc3RydWN0IGluNl9hZGRyICopc2tiX3B1dChza2IsIHNpemVvZigqcHNyYykpOwogCQkqcHNyYyA9IHBzZi0+c2ZfYWRkcjsKIAkJc2NvdW50Kys7IHN0b3RhbCsrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbWlwNi5jIGIvbmV0L2lwdjYvbWlwNi5jCmluZGV4IGJlN2RkN2QuLjY4MWJiMDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21pcDYuYworKysgYi9uZXQvaXB2Ni9taXA2LmMKQEAgLTg5LDcgKzg5LDYgQEAKIGludCBtaXA2X21oX2ZpbHRlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGlwNl9taCAqbWg7Ci0JaW50IG1obGVuOwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpICsgOCkgfHwKIAkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoKHNrYi0+aC5yYXdbMV0gKyAxKSA8PCAzKSkpCkBAIC0xMDMsMzEgKzEwMiw2IEBACiAJCW1pcDZfcGFyYW1fcHJvYihza2IsIDAsICgmbWgtPmlwNm1oX2hkcmxlbikgLSBza2ItPm5oLnJhdyk7CiAJCXJldHVybiAtMTsKIAl9Ci0JbWhsZW4gPSAobWgtPmlwNm1oX2hkcmxlbiArIDEpIDw8IDM7Ci0KLQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQkJaWYgKGNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJICAgICZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkgICAgbWhsZW4sIElQUFJPVE9fTUgsCi0JCQkJICAgIHNrYi0+Y3N1bSkpIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIm1pcDY6IE1IIGh3IGNoZWNrc3VtIGZhaWxlZFxuIik7Ci0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JCX0KLQl9Ci0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpIHsKLQkJaWYgKGNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJICAgICZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkgICAgbWhsZW4sIElQUFJPVE9fTUgsCi0JCQkJICAgIHNrYl9jaGVja3N1bShza2IsIDAsIG1obGVuLCAwKSkpIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIm1pcDY6IE1IIGNoZWNrc3VtIGZhaWxlZCAiCi0JCQkJICAgICAgICJbIiBOSVA2X0ZNVCAiID4gIiBOSVA2X0ZNVCAiXVxuIiwKLQkJCQkgICAgICAgTklQNihza2ItPm5oLmlwdjZoLT5zYWRkciksCi0JCQkJICAgICAgIE5JUDYoc2tiLT5uaC5pcHY2aC0+ZGFkZHIpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCX0KIAogCWlmIChtaC0+aXA2bWhfcHJvdG8gIT0gSVBQUk9UT19OT05FKSB7CiAJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIm1pcDY6IE1IIGludmFsaWQgcGF5bG9hZCBwcm90byA9ICVkXG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCBhZGNkNjEzLi5jZDU0OWFlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMTE0LDYgKzExNCwxNCBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIElQNl9ORl9NQVRDSF9NSAorCXRyaXN0YXRlICJNSCBtYXRjaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCisJaGVscAorCSAgVGhpcyBtb2R1bGUgYWxsb3dzIG9uZSB0byBtYXRjaCBNSCBwYWNrZXRzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIElQNl9ORl9NQVRDSF9FVUk2NAogCXRyaXN0YXRlICJFVUk2NCBhZGRyZXNzIGNoZWNrIgogCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggYWMxZGZlYi4uNDUxM2VhYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMTksNiArMTksNyBAQAogb2JqLSQoQ09ORklHX0lQNl9ORl9SQVcpICs9IGlwNnRhYmxlX3Jhdy5vCiBvYmotJChDT05GSUdfSVA2X05GX01BVENIX0hMKSArPSBpcDZ0X2hsLm8KIG9iai0kKENPTkZJR19JUDZfTkZfVEFSR0VUX1JFSkVDVCkgKz0gaXA2dF9SRUpFQ1Qubworb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9NSCkgKz0gaXA2dF9taC5vCiAKICMgb2JqZWN0cyBmb3IgbDMgaW5kZXBlbmRlbnQgY29ubnRyYWNrCiBuZl9jb25udHJhY2tfaXB2Ni1vYmpzICA6PSAgbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5vIG5mX2Nvbm50cmFja19wcm90b19pY21wdjYubyBuZl9jb25udHJhY2tfcmVhc20ubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKaW5kZXggOTk1MDJjNS4uNzA4M2UxYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCkBAIC01MzAsNyArNTMwLDcgQEAKIAkgICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLAogCSAgICB1bnNpZ25lZCBpbnQgKmkpCiB7Ci0Jc3RydWN0IGlwNnRfbWF0Y2ggKm1hdGNoOworCXN0cnVjdCB4dF9tYXRjaCAqbWF0Y2g7CiAJaW50IHJldDsKIAogCW1hdGNoID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF9tYXRjaChBRl9JTkVUNiwgbS0+dS51c2VyLm5hbWUsCkBAIC01NjQsMTQgKzU2NCwxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YXJnZXQgaXA2dF9zdGFuZGFyZF90YXJnZXQ7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcDZ0X3N0YW5kYXJkX3RhcmdldDsKIAogc3RhdGljIGlubGluZSBpbnQKIGNoZWNrX2VudHJ5KHN0cnVjdCBpcDZ0X2VudHJ5ICplLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkgICAgdW5zaWduZWQgaW50ICppKQogewogCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCAqdDsKLQlzdHJ1Y3QgaXA2dF90YXJnZXQgKnRhcmdldDsKKwlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgajsKIApAQCAtMTM0OCwxMyArMTM0OCwxMyBAQAogfQogCiAvKiBUaGUgYnVpbHQtaW4gdGFyZ2V0czogc3RhbmRhcmQgKE5VTEwpIGFuZCBlcnJvci4gKi8KLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YXJnZXQgaXA2dF9zdGFuZGFyZF90YXJnZXQgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcDZ0X3N0YW5kYXJkX3RhcmdldCA9IHsKIAkubmFtZQkJPSBJUDZUX1NUQU5EQVJEX1RBUkdFVCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihpbnQpLAogCS5mYW1pbHkJCT0gQUZfSU5FVDYsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFyZ2V0IGlwNnRfZXJyb3JfdGFyZ2V0ID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXA2dF9lcnJvcl90YXJnZXQgPSB7CiAJLm5hbWUJCT0gSVA2VF9FUlJPUl9UQVJHRVQsCiAJLnRhcmdldAkJPSBpcDZ0X2Vycm9yLAogCS50YXJnZXRzaXplCT0gSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOLApAQCAtMTM3MSw3ICsxMzcxLDcgQEAKIAkuZ2V0CQk9IGRvX2lwNnRfZ2V0X2N0bCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBpY21wNl9tYXRjaHN0cnVjdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaWNtcDZfbWF0Y2hzdHJ1Y3QgPSB7CiAJLm5hbWUJCT0gImljbXA2IiwKIAkubWF0Y2gJCT0gJmljbXA2X21hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfaWNtcCksCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfSEwuYwppbmRleCA0MzU3NTBmLi4wNGU1MDAxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMKQEAgLTksMTIgKzksMTMgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X0hMLmg+CiAKIE1PRFVMRV9BVVRIT1IoIk1hY2llaiBTb2x0eXNpYWsgPHNvbHRAZG5zLnRveGljZmlsbXMudHY+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBIb3AgTGltaXQgbW9kaWZpY2F0aW9uIG1vZHVsZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUDYgdGFibGVzIEhvcCBMaW1pdCBtb2RpZmljYXRpb24gbW9kdWxlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2dF9obF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCAKQEAgLTUyLDEwICs1Myw5IEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAobmV3X2hsICE9IGlwNmgtPmhvcF9saW1pdCkKLQkJaXA2aC0+aG9wX2xpbWl0ID0gbmV3X2hsOworCWlwNmgtPmhvcF9saW1pdCA9IG5ld19obDsKIAotCXJldHVybiBJUDZUX0NPTlRJTlVFOworCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBpcDZ0X2hsX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLApAQCAtNzksOCArNzksOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFyZ2V0IGlwNnRfSEwgPSB7IAorc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXA2dF9ITCA9IHsKIAkubmFtZSAJCT0gIkhMIiwgCisJLmZhbWlseQkJPSBBRl9JTkVUNiwKIAkudGFyZ2V0CQk9IGlwNnRfaGxfdGFyZ2V0LCAKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9ITF9pbmZvKSwKIAkudGFibGUJCT0gIm1hbmdsZSIsCkBAIC05MCwxMiArOTEsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXA2dF9obF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X0hMKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X0hMKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwNnRfaGxfZmluaSh2b2lkKQogewotCWlwNnRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwNnRfSEwpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X0hMKTsKIH0KIAogbW9kdWxlX2luaXQoaXA2dF9obF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKaW5kZXggMzNiMWZhYS4uNTU4N2E3NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkphbiBSZWtvcmFqc2tpIDxiYWdnaW5zQHBsZC5vcmcucGw+Iik7CkBAIC00NDIsNyArNDQzLDcgQEAKIAogCWlwNnRfbG9nX3BhY2tldChQRl9JTkVUNiwgaG9va251bSwgKnBza2IsIGluLCBvdXQsICZsaSwKIAkgICAgICAgICAgICAgICAgbG9naW5mby0+cHJlZml4KTsKLQlyZXR1cm4gSVA2VF9DT05USU5VRTsKKwlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKIApAQCAtNDY2LDggKzQ2Nyw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YXJnZXQgaXA2dF9sb2dfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgaXA2dF9sb2dfcmVnID0gewogCS5uYW1lIAkJPSAiTE9HIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAogCS50YXJnZXQgCT0gaXA2dF9sb2dfdGFyZ2V0LCAKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9sb2dfaW5mbyksCiAJLmNoZWNrZW50cnkJPSBpcDZ0X2xvZ19jaGVja2VudHJ5LCAKQEAgLTQ4Miw4ICs0ODQsMTEgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXA2dF9sb2dfaW5pdCh2b2lkKQogewotCWlmIChpcDZ0X3JlZ2lzdGVyX3RhcmdldCgmaXA2dF9sb2dfcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaW50IHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmaXA2dF9sb2dfcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAlpZiAobmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQ2LCAmaXA2dF9sb2dnZXIpIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcDZ0X0xPRzogbm90IGxvZ2dpbmcgdmlhIHN5c3RlbSBjb25zb2xlICIKIAkJICAgICAgICJzaW5jZSBzb21lYm9keSBlbHNlIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgUEZfSU5FVDZcbiIpOwpAQCAtNDk3LDcgKzUwMiw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgaXA2dF9sb2dfZmluaSh2b2lkKQogewogCW5mX2xvZ191bnJlZ2lzdGVyX2xvZ2dlcigmaXA2dF9sb2dnZXIpOwotCWlwNnRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwNnRfbG9nX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwNnRfbG9nX3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGlwNnRfbG9nX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwppbmRleCAzMTFlYWU4Li4yNzgzNDljIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPG5ldC9pcDZfZmliLmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9mbG93Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfUkVKRUNULmg+CiAKQEAgLTIzNCw3ICsyMzUsNyBAQAogCX0gZWxzZSBpZiAocmVqaW5mby0+d2l0aCA9PSBJUDZUX1RDUF9SRVNFVCkgewogCQkvKiBNdXN0IHNwZWNpZnkgdGhhdCBpdCdzIGEgVENQIHBhY2tldCAqLwogCQlpZiAoZS0+aXB2Ni5wcm90byAhPSBJUFBST1RPX1RDUAotCQkgICAgfHwgKGUtPmlwdjYuaW52ZmxhZ3MgJiBJUDZUX0lOVl9QUk9UTykpIHsKKwkJICAgIHx8IChlLT5pcHY2LmludmZsYWdzICYgWFRfSU5WX1BST1RPKSkgewogCQkJREVCVUdQKCJpcDZ0X1JFSkVDVDogVENQX1JFU0VUIGlsbGVnYWwgZm9yIG5vbi10Y3BcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTI0Miw4ICsyNDMsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFyZ2V0IGlwNnRfcmVqZWN0X3JlZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwNnRfcmVqZWN0X3JlZyA9IHsKIAkubmFtZQkJPSAiUkVKRUNUIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAogCS50YXJnZXQJCT0gcmVqZWN0Nl90YXJnZXQsCiAJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfcmVqZWN0X2luZm8pLAogCS50YWJsZQkJPSAiZmlsdGVyIiwKQEAgLTI1NSwxMiArMjU3LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwNnRfcmVqZWN0X2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXA2dF9yZWdpc3Rlcl90YXJnZXQoJmlwNnRfcmVqZWN0X3JlZyk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmaXA2dF9yZWplY3RfcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwNnRfcmVqZWN0X2Zpbmkodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X3JlamVjdF9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X3JlamVjdF9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChpcDZ0X3JlamVjdF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jCmluZGV4IDQ2NDg2NjQuLjQ1NmM3NmEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfYWguYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9haC5oPgogCkBAIC0xMTgsOCArMTE5LDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIGFoX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBhaF9tYXRjaCA9IHsKIAkubmFtZQkJPSAiYWgiLAorCS5mYW1pbHkJCT0gQUZfSU5FVDYsCiAJLm1hdGNoCQk9IG1hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfYWgpLAogCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKQEAgLTEyOCwxMiArMTMwLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwNnRfYWhfaW5pdCh2b2lkKQogewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZhaF9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZhaF9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcDZ0X2FoX2Zpbmkodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmFoX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZhaF9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwNnRfYWhfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYwppbmRleCA0ZjZiODRjLi45NjdiZWQ3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2V1aTY0LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KIAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHY2IEVVSTY0IGFkZHJlc3MgY2hlY2tpbmcgbWF0Y2giKTsKQEAgLTYxLDggKzYyLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIGV1aTY0X21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBldWk2NF9tYXRjaCA9IHsKIAkubmFtZQkJPSAiZXVpNjQiLAorCS5mYW1pbHkJCT0gQUZfSU5FVDYsCiAJLm1hdGNoCQk9IG1hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2YoaW50KSwKIAkuaG9va3MJCT0gKDEgPDwgTkZfSVA2X1BSRV9ST1VUSU5HKSB8ICgxIDw8IE5GX0lQNl9MT0NBTF9JTikgfApAQCAtNzIsMTIgKzc0LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwNnRfZXVpNjRfaW5pdCh2b2lkKQogewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZldWk2NF9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZldWk2NF9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcDZ0X2V1aTY0X2Zpbmkodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmV1aTY0X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZldWk2NF9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwNnRfZXVpNjRfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMKaW5kZXggY2QyMmVhYS4uNWE1ZGE3MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZnJhZy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9mcmFnLmg+CiAKQEAgLTEzNSw4ICsxMzYsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggZnJhZ19tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZnJhZ19tYXRjaCA9IHsKIAkubmFtZQkJPSAiZnJhZyIsCisJLmZhbWlseQkJPSBBRl9JTkVUNiwKIAkubWF0Y2gJCT0gbWF0Y2gsCiAJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9mcmFnKSwKIAkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCkBAIC0xNDUsMTIgKzE0NywxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcDZ0X2ZyYWdfaW5pdCh2b2lkKQogewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZmcmFnX21hdGNoKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmZyYWdfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXA2dF9mcmFnX2Zpbmkodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmZyYWdfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmZyYWdfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpcDZ0X2ZyYWdfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCmluZGV4IDNmMjViYWIuLmQyMzczYzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vcHRzLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hsLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jCmluZGV4IDQ0YTcyOWUuLjYwMWNjMTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hsLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYwpAQCAtOCwxMSArOCwxMiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfaGwuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIE1PRFVMRV9BVVRIT1IoIk1hY2llaiBTb2x0eXNpYWsgPHNvbHRAZG5zLnRveGljZmlsbXMudHY+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBIb3AgTGltaXQgbWF0Y2hpbmcgbW9kdWxlIik7CkBAIC00OCw4ICs0OSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBobF9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggaGxfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gImhsIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2hsX2luZm8pLAogCS5tZQkJPSBUSElTX01PRFVMRSwKQEAgLTU3LDEzICs1OSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcDZ0X2hsX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmaGxfbWF0Y2gpOworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmaGxfbWF0Y2gpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXA2dF9obF9maW5pKHZvaWQpCiB7Ci0JaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZobF9tYXRjaCk7Ci0KKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZobF9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwNnRfaGxfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMKaW5kZXggMzA5M2MzOS4uMjZhYzA4NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2lwdjZoZWFkZXIuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9pcHY2aGVhZGVyLmg+CiAKQEAgLTE0MCw4ICsxNDEsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggaXA2dF9pcHY2aGVhZGVyX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBpcDZ0X2lwdjZoZWFkZXJfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gImlwdjZoZWFkZXIiLAorCS5mYW1pbHkJCT0gQUZfSU5FVDYsCiAJLm1hdGNoCQk9ICZpcHY2aGVhZGVyX21hdGNoLAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfaXB2NmhlYWRlcl9pbmZvKSwKIAkuY2hlY2tlbnRyeQk9ICZpcHY2aGVhZGVyX2NoZWNrZW50cnksCkBAIC0xNTEsMTIgKzE1MywxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpcHY2aGVhZGVyX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmaXA2dF9pcHY2aGVhZGVyX21hdGNoKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmlwNnRfaXB2NmhlYWRlcl9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHY2aGVhZGVyX2V4aXQodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJmlwNnRfaXB2NmhlYWRlcl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXA2dF9pcHY2aGVhZGVyX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXB2NmhlYWRlcl9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21oLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9taC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjN2VmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9taC5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKTIwMDYgVVNBR0kvV0lERSBQcm9qZWN0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBdXRob3I6CisgKglNYXNhaGlkZSBOQUtBTVVSQSBAVVNBR0kgPG1hc2FoaWRlLm5ha2FtdXJhLmN6QGhpdGFjaGkuY29tPgorICoKKyAqIEJhc2VkIG9uIG5ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9taXA2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21oLmg+CisKK01PRFVMRV9ERVNDUklQVElPTigiaXA2dF90YWJsZXMgbWF0Y2ggZm9yIE1IIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBERUJVR19JUF9GSVJFV0FMTF9VU0VSCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBkdXByaW50Zihmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogUmV0dXJucyAxIGlmIHRoZSB0eXBlIGlzIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQKK3R5cGVfbWF0Y2godV9pbnQ4X3QgbWluLCB1X2ludDhfdCBtYXgsIHVfaW50OF90IHR5cGUsIGludCBpbnZlcnQpCit7CisJaW50IHJldDsKKworCXJldCA9ICh0eXBlID49IG1pbiAmJiB0eXBlIDw9IG1heCkgXiBpbnZlcnQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSBjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLAorCSBjb25zdCB2b2lkICptYXRjaGluZm8sCisJIGludCBvZmZzZXQsCisJIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCSBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IGlwNl9taCBfbWgsICptaDsKKwljb25zdCBzdHJ1Y3QgaXA2dF9taCAqbWhpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwlpZiAob2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCW1oID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9taCksICZfbWgpOworCWlmIChtaCA9PSBOVUxMKSB7CisJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCisJCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KKwkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgTUggdGlueWdyYW0uXG4iKTsKKwkJKmhvdGRyb3AgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gdHlwZV9tYXRjaChtaGluZm8tPnR5cGVzWzBdLCBtaGluZm8tPnR5cGVzWzFdLCBtaC0+aXA2bWhfdHlwZSwKKwkJCSAgISEobWhpbmZvLT5pbnZmbGFncyAmIElQNlRfTUhfSU5WX1RZUEUpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAorbWhfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgY29uc3Qgdm9pZCAqZW50cnksCisJICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKKwkgICAgICB2b2lkICptYXRjaGluZm8sCisJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9taCAqbWhpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBzcGVjaWZ5IG5vIHVua25vd24gaW52ZmxhZ3MgKi8KKwlyZXR1cm4gIShtaGluZm8tPmludmZsYWdzICYgfklQNlRfTUhfSU5WX01BU0spOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIG1oX21hdGNoID0geworCS5uYW1lCQk9ICJtaCIsCisJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkuY2hlY2tlbnRyeQk9IG1oX2NoZWNrZW50cnksCisJLm1hdGNoCQk9IG1hdGNoLAorCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IGlwNnRfbWgpLAorCS5wcm90bwkJPSBJUFBST1RPX01ILAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlwNnRfbWhfaW5pdCh2b2lkKQoreworCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmbWhfbWF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXA2dF9taF9maW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmbWhfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpcDZ0X21oX2luaXQpOworbW9kdWxlX2V4aXQoaXA2dF9taF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9vd25lci5jCmluZGV4IDRlYjliYmMuLjQzNzM4YmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vd25lci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQNiB0YWJsZXMgb3duZXIgbWF0Y2hpbmcgbW9kdWxlIik7CkBAIC02OSw4ICs3MCw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBvd25lcl9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggb3duZXJfbWF0Y2ggPSB7CiAJLm5hbWUJCT0gIm93bmVyIiwKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAogCS5tYXRjaAkJPSBtYXRjaCwKIAkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X293bmVyX2luZm8pLAogCS5ob29rcwkJPSAoMSA8PCBORl9JUDZfTE9DQUxfT1VUKSB8ICgxIDw8IE5GX0lQNl9QT1NUX1JPVVRJTkcpLApAQCAtODAsMTIgKzgyLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwNnRfb3duZXJfaW5pdCh2b2lkKQogewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcDZ0X293bmVyX2Zpbmkodm9pZCkKIHsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJm93bmVyX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKCZvd25lcl9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGlwNnRfb3duZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYwppbmRleCA1NGQ3ZDE0Li44MWFiMDBkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3J0Lmg+CiAKQEAgLTIyMSw4ICsyMjIsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggcnRfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHJ0X21hdGNoID0gewogCS5uYW1lCQk9ICJydCIsCisJLmZhbWlseQkJPSBBRl9JTkVUNiwKIAkubWF0Y2gJCT0gbWF0Y2gsCiAJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9ydCksCiAJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LApAQCAtMjMxLDEyICsyMzMsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXA2dF9ydF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwNnRfcnRfZmluaSh2b2lkKQogewotCWlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmcnRfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJnJ0X21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaXA2dF9ydF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwppbmRleCAyZmMwN2M3Li4xMTJhMjFkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCkBAIC0xOSwyNSArMTksNiBAQAogCiAjZGVmaW5lIEZJTFRFUl9WQUxJRF9IT09LUyAoKDEgPDwgTkZfSVA2X0xPQ0FMX0lOKSB8ICgxIDw8IE5GX0lQNl9GT1JXQVJEKSB8ICgxIDw8IE5GX0lQNl9MT0NBTF9PVVQpKQogCi0vKiBTdGFuZGFyZCBlbnRyeS4gKi8KLXN0cnVjdCBpcDZ0X3N0YW5kYXJkCi17Ci0Jc3RydWN0IGlwNnRfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0IHRhcmdldDsKLX07Ci0KLXN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldAotewotCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCB0YXJnZXQ7Ci0JY2hhciBlcnJvcm5hbWVbSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKLX07Ci0KLXN0cnVjdCBpcDZ0X2Vycm9yCi17Ci0Jc3RydWN0IGlwNnRfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGlwNnRfZXJyb3JfdGFyZ2V0IHRhcmdldDsKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QKIHsKIAlzdHJ1Y3QgaXA2dF9yZXBsYWNlIHJlcGw7CkBAIC05Miw3ICs3Myw3IEBACiAgICAgfQogfTsKIAotc3RhdGljIHN0cnVjdCBpcDZ0X3RhYmxlIHBhY2tldF9maWx0ZXIgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhYmxlIHBhY2tldF9maWx0ZXIgPSB7CiAJLm5hbWUJCT0gImZpbHRlciIsCiAJLnZhbGlkX2hvb2tzCT0gRklMVEVSX1ZBTElEX0hPT0tTLAogCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKaW5kZXggNjI1MGU4Ni4uNWY1YWEwZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwpAQCAtMjksMjUgKzI5LDYgQEAKICNkZWZpbmUgREVCVUdQKHgsIGFyZ3MuLi4pCiAjZW5kaWYKIAotLyogU3RhbmRhcmQgZW50cnkuICovCi1zdHJ1Y3QgaXA2dF9zdGFuZGFyZAotewotCXN0cnVjdCBpcDZ0X2VudHJ5IGVudHJ5OwotCXN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCB0YXJnZXQ7Ci19OwotCi1zdHJ1Y3QgaXA2dF9lcnJvcl90YXJnZXQKLXsKLQlzdHJ1Y3QgaXA2dF9lbnRyeV90YXJnZXQgdGFyZ2V0OwotCWNoYXIgZXJyb3JuYW1lW0lQNlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07Ci19OwotCi1zdHJ1Y3QgaXA2dF9lcnJvcgotewotCXN0cnVjdCBpcDZ0X2VudHJ5IGVudHJ5OwotCXN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldCB0YXJnZXQ7Ci19OwotCiBzdGF0aWMgc3RydWN0CiB7CiAJc3RydWN0IGlwNnRfcmVwbGFjZSByZXBsOwpAQCAtMTIyLDcgKzEwMyw3IEBACiAgICAgfQogfTsKIAotc3RhdGljIHN0cnVjdCBpcDZ0X3RhYmxlIHBhY2tldF9tYW5nbGVyID0geworc3RhdGljIHN0cnVjdCB4dF90YWJsZSBwYWNrZXRfbWFuZ2xlciA9IHsKIAkubmFtZQkJPSAibWFuZ2xlIiwKIAkudmFsaWRfaG9va3MJPSBNQU5HTEVfVkFMSURfSE9PS1MsCiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYwppbmRleCBiNDE1NGRhLi4yNzdiZjM0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfcmF3LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3Jhdy5jCkBAIC0xNCwyNSArMTQsNiBAQAogI2RlZmluZSBERUJVR1AoeCwgYXJncy4uLikKICNlbmRpZgogCi0vKiBTdGFuZGFyZCBlbnRyeS4gKi8KLXN0cnVjdCBpcDZ0X3N0YW5kYXJkCi17Ci0Jc3RydWN0IGlwNnRfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0IHRhcmdldDsKLX07Ci0KLXN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldAotewotCXN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCB0YXJnZXQ7Ci0JY2hhciBlcnJvcm5hbWVbSVA2VF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKLX07Ci0KLXN0cnVjdCBpcDZ0X2Vycm9yCi17Ci0Jc3RydWN0IGlwNnRfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGlwNnRfZXJyb3JfdGFyZ2V0IHRhcmdldDsKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QKIHsKIAlzdHJ1Y3QgaXA2dF9yZXBsYWNlIHJlcGw7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IDRhZTFiMTkuLmMyZDgwNTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Jhdy5jCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC04MTUsNyArODE1LDcgQEAKIAlpZiAoZmluYWxfcCkKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGZpbmFsX3ApOwogCi0JaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKSkgPCAwKQorCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMSkpIDwgMCkKIAkJZ290byBvdXQ7CiAKIAlpZiAoaGxpbWl0IDwgMCkgewpAQCAtMTA5NCwxMCArMTA5NCwxOSBAQAogCiBzdGF0aWMgaW50IHJhd3Y2X2luaXRfc2soc3RydWN0IHNvY2sgKnNrKQogewotCWlmIChpbmV0X3NrKHNrKS0+bnVtID09IElQUFJPVE9fSUNNUFY2KSB7Ci0JCXN0cnVjdCByYXc2X3NvY2sgKnJwID0gcmF3Nl9zayhzayk7CisJc3RydWN0IHJhdzZfc29jayAqcnAgPSByYXc2X3NrKHNrKTsKKworCXN3aXRjaCAoaW5ldF9zayhzayktPm51bSkgeworCWNhc2UgSVBQUk9UT19JQ01QVjY6CiAJCXJwLT5jaGVja3N1bSA9IDE7CiAJCXJwLT5vZmZzZXQgICA9IDI7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19NSDoKKwkJcnAtPmNoZWNrc3VtID0gMTsKKwkJcnAtPm9mZnNldCAgID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCXJldHVybigwKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JvdXRlLmMgYi9uZXQvaXB2Ni9yb3V0ZS5jCmluZGV4IDVmMDA0M2MuLjE5YzkwNmYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JvdXRlLmMKKysrIGIvbmV0L2lwdjYvcm91dGUuYwpAQCAtMzExLDEyICszMTEsMjEgQEAKIHN0YXRpYyBpbnQgaW5saW5lIHJ0Nl9jaGVja19kZXYoc3RydWN0IHJ0Nl9pbmZvICpydCwgaW50IG9pZikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcnQtPnJ0NmlfZGV2OwotCWlmICghb2lmIHx8IGRldi0+aWZpbmRleCA9PSBvaWYpCisJaW50IHJldCA9IDA7CisKKwlpZiAoIW9pZikKIAkJcmV0dXJuIDI7Ci0JaWYgKChkZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSAmJgotCSAgICBydC0+cnQ2aV9pZGV2ICYmIHJ0LT5ydDZpX2lkZXYtPmRldi0+aWZpbmRleCA9PSBvaWYpCi0JCXJldHVybiAxOwotCXJldHVybiAwOworCWlmIChkZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSB7CisJCWlmICghV0FSTl9PTihydC0+cnQ2aV9pZGV2ID09IE5VTEwpICYmCisJCSAgICBydC0+cnQ2aV9pZGV2LT5kZXYtPmlmaW5kZXggPT0gb2lmKQorCQkJcmV0ID0gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChkZXYtPmlmaW5kZXggPT0gb2lmKQorCQlyZXR1cm4gMjsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW5saW5lIHJ0Nl9jaGVja19uZWlnaChzdHJ1Y3QgcnQ2X2luZm8gKnJ0KQpAQCAtMjA0MCw3ICsyMDQ5LDcgQEAKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCB0eXBlLCBzaXplb2YoKnJ0bSksIGZsYWdzKTsKIAlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKKwkJcmV0dXJuIC1FTVNHU0laRTsKIAogCXJ0bSA9IG5sbXNnX2RhdGEobmxoKTsKIAlydG0tPnJ0bV9mYW1pbHkgPSBBRl9JTkVUNjsKQEAgLTIxMTEsNyArMjEyMCw4IEBACiAJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CiAKIG5sYV9wdXRfZmFpbHVyZToKLQlyZXR1cm4gbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKIGludCBydDZfZHVtcF9yb3V0ZShzdHJ1Y3QgcnQ2X2luZm8gKnJ0LCB2b2lkICpwX2FyZykKQEAgLTIyMjIsOSArMjIzMiwxMiBAQAogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IHJ0Nl9maWxsX25vZGUoc2tiLCBydCwgTlVMTCwgTlVMTCwgMCwgZXZlbnQsIHBpZCwgc2VxLCAwLCAwKTsKLQkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIHJ0Nl9ubG1zZ19zaXplKCkgKi8KLQlCVUdfT04oZXJyIDwgMCk7Ci0KKwlpZiAoZXJyIDwgMCkgeworCQkvKiAtRU1TR1NJWkUgaW1wbGllcyBCVUcgaW4gcnQ2X25sbXNnX3NpemUoKSAqLworCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBlcnJvdXQ7CisJfQogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgcGlkLCBSVE5MR1JQX0lQVjZfUk9VVEUsIG5saCwgZ2ZwX2FueSgpKTsKIGVycm91dDoKIAlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3NpdC5jIGIvbmV0L2lwdjYvc2l0LmMKaW5kZXggNzdiN2IwOS4uNDdjZmVhZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc2l0LmMKKysrIGIvbmV0L2lwdjYvc2l0LmMKQEAgLTY4Niw3ICs2ODYsOCBAQAogCQkJCWdvdG8gZG9uZTsKIAkJCWRldiA9IHQtPmRldjsKIAkJfQotCQllcnIgPSB1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCQl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCQllcnIgPSAwOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwppbmRleCBjMjVlOTMwLi5kY2I3YjAwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogCWlmIChmaW5hbF9wKQogCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgZmluYWxfcCk7CiAKLQlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDApKSA8IDApCisJaWYgKChlcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAxKSkgPCAwKQogCQlnb3RvIGZhaWx1cmU7CiAKIAlpZiAoc2FkZHIgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCBmNTJhNWMzLi4xNWU1MTk1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtNzM2LDcgKzczNiw3IEBACiAJaWYgKGZpbmFsX3ApCiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBmaW5hbF9wKTsKIAotCWlmICgoZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBzaywgMCkpIDwgMCkKKwlpZiAoKGVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgc2ssIDEpKSA8IDApCiAJCWdvdG8gb3V0OwogCiAJaWYgKGhsaW1pdCA8IDApIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X21vZGVfdHVubmVsLmMgYi9uZXQvaXB2Ni94ZnJtNl9tb2RlX3R1bm5lbC5jCmluZGV4IDVlN2Q4YTcuLjBiYzg2NmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X21vZGVfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYveGZybTZfbW9kZV90dW5uZWwuYwpAQCAtMjUsNiArMjUsMTIgQEAKIAkJSVA2X0VDTl9zZXRfY2UoaW5uZXJfaXBoKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGlwNmlwX2Vjbl9kZWNhcHN1bGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChJTkVUX0VDTl9pc19jZShpcHY2X2dldF9kc2ZpZWxkKHNrYi0+bmguaXB2NmgpKSkKKwkJCUlQX0VDTl9zZXRfY2Uoc2tiLT5oLmlwaXBoKTsKK30KKwogLyogQWRkIGVuY2Fwc3VsYXRpb24gaGVhZGVyLgogICoKICAqIFRoZSB0b3AgSVAgaGVhZGVyIHdpbGwgYmUgY29uc3RydWN0ZWQgcGVyIFJGQyAyNDAxLiAgVGhlIGZvbGxvd2luZyBmaWVsZHMKQEAgLTQwLDYgKzQ2LDcgQEAKIHN0YXRpYyBpbnQgeGZybTZfdHVubmVsX291dHB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKKwlzdHJ1Y3QgeGZybV9kc3QgKnhkc3QgPSAoc3RydWN0IHhmcm1fZHN0Kilkc3Q7CiAJc3RydWN0IGlwdjZoZHIgKmlwaCwgKnRvcF9pcGg7CiAJaW50IGRzZmllbGQ7CiAKQEAgLTUyLDE2ICs1OSwyNCBAQAogCXNrYi0+aC5pcHY2aCA9IHRvcF9pcGggKyAxOwogCiAJdG9wX2lwaC0+dmVyc2lvbiA9IDY7Ci0JdG9wX2lwaC0+cHJpb3JpdHkgPSBpcGgtPnByaW9yaXR5OwotCXRvcF9pcGgtPmZsb3dfbGJsWzBdID0gaXBoLT5mbG93X2xibFswXTsKLQl0b3BfaXBoLT5mbG93X2xibFsxXSA9IGlwaC0+Zmxvd19sYmxbMV07Ci0JdG9wX2lwaC0+Zmxvd19sYmxbMl0gPSBpcGgtPmZsb3dfbGJsWzJdOworCWlmICh4ZHN0LT5yb3V0ZS0+b3BzLT5mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJdG9wX2lwaC0+cHJpb3JpdHkgPSBpcGgtPnByaW9yaXR5OworCQl0b3BfaXBoLT5mbG93X2xibFswXSA9IGlwaC0+Zmxvd19sYmxbMF07CisJCXRvcF9pcGgtPmZsb3dfbGJsWzFdID0gaXBoLT5mbG93X2xibFsxXTsKKwkJdG9wX2lwaC0+Zmxvd19sYmxbMl0gPSBpcGgtPmZsb3dfbGJsWzJdOworCQl0b3BfaXBoLT5uZXh0aGRyID0gSVBQUk9UT19JUFY2OworCX0gZWxzZSB7CisJCXRvcF9pcGgtPnByaW9yaXR5ID0gMDsKKwkJdG9wX2lwaC0+Zmxvd19sYmxbMF0gPSAwOworCQl0b3BfaXBoLT5mbG93X2xibFsxXSA9IDA7CisJCXRvcF9pcGgtPmZsb3dfbGJsWzJdID0gMDsKKwkJdG9wX2lwaC0+bmV4dGhkciA9IElQUFJPVE9fSVBJUDsKKwl9CiAJZHNmaWVsZCA9IGlwdjZfZ2V0X2RzZmllbGQodG9wX2lwaCk7CiAJZHNmaWVsZCA9IElORVRfRUNOX2VuY2Fwc3VsYXRlKGRzZmllbGQsIGRzZmllbGQpOwogCWlmICh4LT5wcm9wcy5mbGFncyAmIFhGUk1fU1RBVEVfTk9FQ04pCiAJCWRzZmllbGQgJj0gfklORVRfRUNOX01BU0s7CiAJaXB2Nl9jaGFuZ2VfZHNmaWVsZCh0b3BfaXBoLCAwLCBkc2ZpZWxkKTsKLQl0b3BfaXBoLT5uZXh0aGRyID0gSVBQUk9UT19JUFY2OyAKIAl0b3BfaXBoLT5ob3BfbGltaXQgPSBkc3RfbWV0cmljKGRzdC0+Y2hpbGQsIFJUQVhfSE9QTElNSVQpOwogCWlwdjZfYWRkcl9jb3B5KCZ0b3BfaXBoLT5zYWRkciwgKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5wcm9wcy5zYWRkcik7CiAJaXB2Nl9hZGRyX2NvcHkoJnRvcF9pcGgtPmRhZGRyLCAoc3RydWN0IGluNl9hZGRyICopJngtPmlkLmRhZGRyKTsKQEAgLTcyLDcgKzg3LDggQEAKIHsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAotCWlmIChza2ItPm5oLnJhd1tJUDZDQihza2IpLT5uaG9mZl0gIT0gSVBQUk9UT19JUFY2KQorCWlmIChza2ItPm5oLnJhd1tJUDZDQihza2IpLT5uaG9mZl0gIT0gSVBQUk9UT19JUFY2CisJICAgICYmIHNrYi0+bmgucmF3W0lQNkNCKHNrYiktPm5ob2ZmXSAhPSBJUFBST1RPX0lQSVApCiAJCWdvdG8gb3V0OwogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKQogCQlnb3RvIG91dDsKQEAgLTgxLDEwICs5NywxNiBAQAogCSAgICAoZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX0RFQ0FQX0RTQ1ApCi0JCWlwdjZfY29weV9kc2NwKHNrYi0+bmguaXB2NmgsIHNrYi0+aC5pcHY2aCk7Ci0JaWYgKCEoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX05PRUNOKSkKLQkJaXBpcDZfZWNuX2RlY2Fwc3VsYXRlKHNrYik7CisJaWYgKHNrYi0+bmgucmF3W0lQNkNCKHNrYiktPm5ob2ZmXSA9PSBJUFBST1RPX0lQVjYpIHsKKwkJaWYgKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9ERUNBUF9EU0NQKQorCQkJaXB2Nl9jb3B5X2RzY3Aoc2tiLT5uaC5pcHY2aCwgc2tiLT5oLmlwdjZoKTsKKwkJaWYgKCEoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX05PRUNOKSkKKwkJCWlwaXA2X2Vjbl9kZWNhcHN1bGF0ZShza2IpOworCX0gZWxzZSB7CisJCWlmICghKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT0VDTikpCisJCQlpcDZpcF9lY25fZGVjYXBzdWxhdGUoc2tiKTsKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwl9CiAJc2tiLT5tYWMucmF3ID0gbWVtbW92ZShza2ItPmRhdGEgLSBza2ItPm1hY19sZW4sCiAJCQkgICAgICAgc2tiLT5tYWMucmF3LCBza2ItPm1hY19sZW4pOwogCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfcG9saWN5LmMgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwppbmRleCA4ZGZmZDRkLi41OTQ4MGU5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwpAQCAtMTMxLDEzICsxMzEsMTEgQEAKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsICpkc3RfcHJldjsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0MCA9IChzdHJ1Y3QgcnQ2X2luZm8qKSgqZHN0X3ApOwogCXN0cnVjdCBydDZfaW5mbyAqcnQgID0gcnQwOwotCXN0cnVjdCBpbjZfYWRkciAqcmVtb3RlID0gJmZsLT5mbDZfZHN0OwotCXN0cnVjdCBpbjZfYWRkciAqbG9jYWwgID0gJmZsLT5mbDZfc3JjOwogCXN0cnVjdCBmbG93aSBmbF90dW5uZWwgPSB7CiAJCS5ubF91ID0gewogCQkJLmlwNl91ID0gewotCQkJCS5zYWRkciA9ICpsb2NhbCwKLQkJCQkuZGFkZHIgPSAqcmVtb3RlCisJCQkJLnNhZGRyID0gZmwtPmZsNl9zcmMsCisJCQkJLmRhZGRyID0gZmwtPmZsNl9kc3QsCiAJCQl9CiAJCX0KIAl9OwpAQCAtMTUzLDcgKzE1MSw2IEBACiAJZm9yIChpID0gMDsgaSA8IG54OyBpKyspIHsKIAkJc3RydWN0IGRzdF9lbnRyeSAqZHN0MSA9IGRzdF9hbGxvYygmeGZybTZfZHN0X29wcyk7CiAJCXN0cnVjdCB4ZnJtX2RzdCAqeGRzdDsKLQkJaW50IHR1bm5lbCA9IDA7CiAKIAkJaWYgKHVubGlrZWx5KGRzdDEgPT0gTlVMTCkpIHsKIAkJCWVyciA9IC1FTk9CVUZTOwpAQCAtMTc3LDE5ICsxNzQsMjcgQEAKIAogCQlkc3QxLT5uZXh0ID0gZHN0X3ByZXY7CiAJCWRzdF9wcmV2ID0gZHN0MTsKLQkJaWYgKHhmcm1baV0tPnByb3BzLm1vZGUgIT0gWEZSTV9NT0RFX1RSQU5TUE9SVCkgewotCQkJcmVtb3RlID0gX194ZnJtNl9idW5kbGVfYWRkcl9yZW1vdGUoeGZybVtpXSwgcmVtb3RlKTsKLQkJCWxvY2FsICA9IF9feGZybTZfYnVuZGxlX2FkZHJfbG9jYWwoeGZybVtpXSwgbG9jYWwpOwotCQkJdHVubmVsID0gMTsKLQkJfQorCiAJCV9feGZybTZfYnVuZGxlX2xlbl9pbmMoJmhlYWRlcl9sZW4sICZuZmhlYWRlcl9sZW4sIHhmcm1baV0pOwogCQl0cmFpbGVyX2xlbiArPSB4ZnJtW2ldLT5wcm9wcy50cmFpbGVyX2xlbjsKIAotCQlpZiAodHVubmVsKSB7Ci0JCQlpcHY2X2FkZHJfY29weSgmZmxfdHVubmVsLmZsNl9kc3QsIHJlbW90ZSk7Ci0JCQlpcHY2X2FkZHJfY29weSgmZmxfdHVubmVsLmZsNl9zcmMsIGxvY2FsKTsKKwkJaWYgKHhmcm1baV0tPnByb3BzLm1vZGUgPT0gWEZSTV9NT0RFX1RVTk5FTCkgeworCQkJdW5zaWduZWQgc2hvcnQgZW5jYXBfZmFtaWx5ID0geGZybVtpXS0+cHJvcHMuZmFtaWx5OworCQkJc3dpdGNoKGVuY2FwX2ZhbWlseSkgeworCQkJY2FzZSBBRl9JTkVUOgorCQkJCWZsX3R1bm5lbC5mbDRfZHN0ID0geGZybVtpXS0+aWQuZGFkZHIuYTQ7CisJCQkJZmxfdHVubmVsLmZsNF9zcmMgPSB4ZnJtW2ldLT5wcm9wcy5zYWRkci5hNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUZfSU5FVDY6CisJCQkJaXB2Nl9hZGRyX2NvcHkoJmZsX3R1bm5lbC5mbDZfZHN0LCAoc3RydWN0IGluNl9hZGRyKikmeGZybVtpXS0+aWQuZGFkZHIuYTYpOworCQkJCWlwdjZfYWRkcl9jb3B5KCZmbF90dW5uZWwuZmw2X3NyYywgKHN0cnVjdCBpbjZfYWRkciopJnhmcm1baV0tPnByb3BzLnNhZGRyLmE2KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQlVHX09OKDEpOworCQkJfQorCiAJCQllcnIgPSB4ZnJtX2RzdF9sb29rdXAoKHN0cnVjdCB4ZnJtX2RzdCAqKikgJnJ0LAotCQkJCQkgICAgICAmZmxfdHVubmVsLCBBRl9JTkVUNik7CisJCQkJCSAgICAgICZmbF90dW5uZWwsIGVuY2FwX2ZhbWlseSk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZXJyb3I7CiAJCX0gZWxzZQpAQCAtMjA4LDYgKzIxMyw3IEBACiAJaSA9IDA7CiAJZm9yICg7IGRzdF9wcmV2ICE9ICZydC0+dS5kc3Q7IGRzdF9wcmV2ID0gZHN0X3ByZXYtPmNoaWxkKSB7CiAJCXN0cnVjdCB4ZnJtX2RzdCAqeCA9IChzdHJ1Y3QgeGZybV9kc3QqKWRzdF9wcmV2OworCQlzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbzsKIAogCQlkc3RfcHJldi0+eGZybSA9IHhmcm1baSsrXTsKIAkJZHN0X3ByZXYtPmRldiA9IHJ0LT51LmRzdC5kZXY7CkBAIC0yMjQsNyArMjMwLDE3IEBACiAJCS8qIENvcHkgbmVpZ2hib3VyIGZvciByZWFjaGFiaWxpdHkgY29uZmlybWF0aW9uICovCiAJCWRzdF9wcmV2LT5uZWlnaGJvdXIJPSBuZWlnaF9jbG9uZShydC0+dS5kc3QubmVpZ2hib3VyKTsKIAkJZHN0X3ByZXYtPmlucHV0CQk9IHJ0LT51LmRzdC5pbnB1dDsKLQkJZHN0X3ByZXYtPm91dHB1dAk9IHhmcm02X291dHB1dDsKKwkJLyogWFhYOiBXaGVuIElQdjQgaXMgaW1wbGVtZW50ZWQgYXMgbW9kdWxlIGFuZCBjYW4gYmUgdW5sb2FkZWQsCisJCSAqIHdlIHNob3VsZCBtYW5hZ2UgcmVmZXJlbmNlIHRvIHhmcm00X291dHB1dCBpbiBhZmluZm8tPm91dHB1dC4KKwkJICogTWl5YXphd2EKKwkJICovCisJCWFmaW5mbyA9IHhmcm1fc3RhdGVfZ2V0X2FmaW5mbyhkc3RfcHJldi0+eGZybS0+cHJvcHMuZmFtaWx5KTsKKwkJaWYgKCFhZmluZm8pIHsKKwkJCWRzdCA9ICpkc3RfcDsKKwkJCWdvdG8gZXJyb3I7CisJCX07CisJCWRzdF9wcmV2LT5vdXRwdXQgPSBhZmluZm8tPm91dHB1dDsKKwkJeGZybV9zdGF0ZV9wdXRfYWZpbmZvKGFmaW5mbyk7CiAJCS8qIFNoZWl0Li4uIEkgcmVtZW1iZXIgSSBkaWQgdGhpcyByaWdodC4gQXBwYXJlbnRseSwKIAkJICogaXQgd2FzIG1hZ2ljYWxseSBsb3N0LCBzbyB0aGlzIGNvZGUgbmVlZHMgYXVkaXQgKi8KIAkJeC0+dS5ydDYucnQ2aV9mbGFncyAgICA9IHJ0MC0+cnQ2aV9mbGFncyYoUlRDRl9CUk9BRENBU1R8UlRDRl9NVUxUSUNBU1R8UlRDRl9MT0NBTCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9zdGF0ZS5jIGIvbmV0L2lwdjYveGZybTZfc3RhdGUuYwppbmRleCA5ZGRhYTlkLi42MGFkNWYwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9zdGF0ZS5jCisrKyBiL25ldC9pcHY2L3hmcm02X3N0YXRlLmMKQEAgLTE3MSw2ICsxNzEsNyBAQAogCS5pbml0X3RlbXBzZWwJCT0gX194ZnJtNl9pbml0X3RlbXBzZWwsCiAJLnRtcGxfc29ydAkJPSBfX3hmcm02X3RtcGxfc29ydCwKIAkuc3RhdGVfc29ydAkJPSBfX3hmcm02X3N0YXRlX3NvcnQsCisJLm91dHB1dAkJCT0geGZybTZfb3V0cHV0LAogfTsKIAogdm9pZCBfX2luaXQgeGZybTZfc3RhdGVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L2lweC9hZl9pcHguYyBiL25ldC9pcHgvYWZfaXB4LmMKaW5kZXggNzZjNjYxNS4uODlmMjgzYyAxMDA2NDQKLS0tIGEvbmV0L2lweC9hZl9pcHguYworKysgYi9uZXQvaXB4L2FmX2lweC5jCkBAIC0yMDM1LDE5ICsyMDM1LDI3IEBACiAKIAlpcHhpdGZfY2xlYW51cCgpOwogCi0JdW5yZWdpc3Rlcl9zbmFwX2NsaWVudChwU05BUF9kYXRhbGluayk7Ci0JcFNOQVBfZGF0YWxpbmsgPSBOVUxMOworCWlmIChwU05BUF9kYXRhbGluaykgeworCQl1bnJlZ2lzdGVyX3NuYXBfY2xpZW50KHBTTkFQX2RhdGFsaW5rKTsKKwkJcFNOQVBfZGF0YWxpbmsgPSBOVUxMOworCX0KIAotCXVucmVnaXN0ZXJfODAyMl9jbGllbnQocDgwMjJfZGF0YWxpbmspOwotCXA4MDIyX2RhdGFsaW5rID0gTlVMTDsKKwlpZiAocDgwMjJfZGF0YWxpbmspIHsKKwkJdW5yZWdpc3Rlcl84MDIyX2NsaWVudChwODAyMl9kYXRhbGluayk7CisJCXA4MDIyX2RhdGFsaW5rID0gTlVMTDsKKwl9CiAKIAlkZXZfcmVtb3ZlX3BhY2soJmlweF84MDIzX3BhY2tldF90eXBlKTsKLQlkZXN0cm95XzgwMjNfY2xpZW50KHA4MDIzX2RhdGFsaW5rKTsKLQlwODAyM19kYXRhbGluayA9IE5VTEw7CisJaWYgKHA4MDIzX2RhdGFsaW5rKSB7CisJCWRlc3Ryb3lfODAyM19jbGllbnQocDgwMjNfZGF0YWxpbmspOworCQlwODAyM19kYXRhbGluayA9IE5VTEw7CisJfQogCiAJZGV2X3JlbW92ZV9wYWNrKCZpcHhfZGl4X3BhY2tldF90eXBlKTsKLQlkZXN0cm95X0VJSV9jbGllbnQocEVJSV9kYXRhbGluayk7Ci0JcEVJSV9kYXRhbGluayA9IE5VTEw7CisJaWYgKHBFSUlfZGF0YWxpbmspIHsKKwkJZGVzdHJveV9FSUlfY2xpZW50KHBFSUlfZGF0YWxpbmspOworCQlwRUlJX2RhdGFsaW5rID0gTlVMTDsKKwl9CiAKIAlwcm90b191bnJlZ2lzdGVyKCZpcHhfcHJvdG8pOwogCXNvY2tfdW5yZWdpc3RlcihpcHhfZmFtaWx5X29wcy5mYW1pbHkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJpYXNfb2JqZWN0LmMgYi9uZXQvaXJkYS9pcmlhc19vYmplY3QuYwppbmRleCBiMWVlOTlhLi4yYTU3MWI0IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmlhc19vYmplY3QuYworKysgYi9uZXQvaXJkYS9pcmlhc19vYmplY3QuYwpAQCAtOTEsNiArOTEsMTIgQEAKIAogCW9iai0+bWFnaWMgPSBJQVNfT0JKRUNUX01BR0lDOwogCW9iai0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9DTEFTU05BTUUpOworCWlmICghb2JqLT5uYW1lKSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgVW5hYmxlIHRvIGFsbG9jYXRlIG5hbWUhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlrZnJlZShvYmopOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJb2JqLT5pZCA9IGlkOwogCiAJLyogTG9ja2luZyBub3RlcyA6IHRoZSBhdHRyaWIgc3BpbmxvY2sgaGFzIGxvd2VyIHByZWNlbmRlbmNlCkBAIC0xMDEsNiArMTA3LDcgQEAKIAlpZiAob2JqLT5hdHRyaWJzID09IE5VTEwpIHsKIAkJSVJEQV9XQVJOSU5HKCIlcygpLCBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlicyFcbiIsCiAJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWtmcmVlKG9iai0+bmFtZSk7CiAJCWtmcmVlKG9iaik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTM1Nyw2ICszNjQsMTUgQEAKIAogCS8qIEluc2VydCB2YWx1ZSAqLwogCWF0dHJpYi0+dmFsdWUgPSBpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSh2YWx1ZSk7CisJaWYgKCFhdHRyaWItPm5hbWUgfHwgIWF0dHJpYi0+dmFsdWUpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWlmIChhdHRyaWItPnZhbHVlKQorCQkJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOworCQlrZnJlZShhdHRyaWItPm5hbWUpOworCQlrZnJlZShhdHRyaWIpOworCQlyZXR1cm47CisJfQogCiAJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOwogfQpAQCAtMzkxLDYgKzQwNywxNSBAQAogCWF0dHJpYi0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9BVFRSSUJOQU1FKTsKIAogCWF0dHJpYi0+dmFsdWUgPSBpcmlhc19uZXdfb2N0c2VxX3ZhbHVlKCBvY3RldHMsIGxlbik7CisJaWYgKCFhdHRyaWItPm5hbWUgfHwgIWF0dHJpYi0+dmFsdWUpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGF0dHJpYnV0ZSFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWlmIChhdHRyaWItPnZhbHVlKQorCQkJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOworCQlrZnJlZShhdHRyaWItPm5hbWUpOworCQlrZnJlZShhdHRyaWIpOworCQlyZXR1cm47CisJfQogCiAJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOwogfQpAQCAtNDI0LDYgKzQ0OSwxNSBAQAogCWF0dHJpYi0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9BVFRSSUJOQU1FKTsKIAogCWF0dHJpYi0+dmFsdWUgPSBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKHZhbHVlKTsKKwlpZiAoIWF0dHJpYi0+bmFtZSB8fCAhYXR0cmliLT52YWx1ZSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlidXRlIVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJaWYgKGF0dHJpYi0+dmFsdWUpCisJCQlpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CisJCWtmcmVlKGF0dHJpYi0+bmFtZSk7CisJCWtmcmVlKGF0dHJpYik7CisJCXJldHVybjsKKwl9CiAKIAlpcmlhc19hZGRfYXR0cmliKG9iaiwgYXR0cmliLCBvd25lcik7CiB9CkBAIC00NzMsNiArNTA3LDEyIEBACiAJdmFsdWUtPnR5cGUgPSBJQVNfU1RSSU5HOwogCXZhbHVlLT5jaGFyc2V0ID0gQ1NfQVNDSUk7CiAJdmFsdWUtPnQuc3RyaW5nID0gc3RybmR1cChzdHJpbmcsIElBU19NQVhfU1RSSU5HKTsKKwlpZiAoIXZhbHVlLT50LnN0cmluZykgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWtmcmVlKHZhbHVlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCiAJdmFsdWUtPmxlbiA9IHN0cmxlbih2YWx1ZS0+dC5zdHJpbmcpOwogCiAJcmV0dXJuIHZhbHVlOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwppbmRleCAyYmIwNGFjLi4zMTA3NzZkIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYworKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwpAQCAtMTQ0LDEyICsxNDQsMTggQEAKIAkvKiBSZWdpc3RlciB3aXRoIElyTE1QIGFzIGEgY2xpZW50ICovCiAJY2tleSA9IGlybG1wX3JlZ2lzdGVyX2NsaWVudChoaW50cywgJmlybGFuX2NsaWVudF9kaXNjb3ZlcnlfaW5kaWNhdGlvbiwKIAkJCQkgICAgIE5VTEwsIE5VTEwpOwotCQorCWlmICghY2tleSkKKwkJZ290byBlcnJfY2tleTsKKwogCS8qIFJlZ2lzdGVyIHdpdGggSXJMTVAgYXMgYSBzZXJ2aWNlICovCi0gCXNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKGhpbnRzKTsKKwlza2V5ID0gaXJsbXBfcmVnaXN0ZXJfc2VydmljZShoaW50cyk7CisJaWYgKCFza2V5KQorCQlnb3RvIGVycl9za2V5OwogCiAJLyogU3RhcnQgdGhlIG1hc3RlciBJckxBTiBpbnN0YW5jZSAodGhlIG9ubHkgb25lIGZvciBub3cpICovCi0gCW5ldyA9IGlybGFuX29wZW4oREVWX0FERFJfQU5ZLCBERVZfQUREUl9BTlkpOworCW5ldyA9IGlybGFuX29wZW4oREVWX0FERFJfQU5ZLCBERVZfQUREUl9BTlkpOworCWlmICghbmV3KQorCQlnb3RvIGVycl9vcGVuOwogCiAJLyogVGhlIG1hc3RlciB3aWxsIG9ubHkgb3BlbiBpdHMgKGxpc3RlbikgY29udHJvbCBUU0FQICovCiAJaXJsYW5fcHJvdmlkZXJfb3Blbl9jdHJsX3RzYXAobmV3KTsKQEAgLTE1OCw2ICsxNjQsMTcgQEAKIAlpcmxtcF9kaXNjb3ZlcnlfcmVxdWVzdChESVNDT1ZFUllfREVGQVVMVF9TTE9UUyk7CiAKIAlyZXR1cm4gMDsKKworZXJyX29wZW46CisJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNrZXkpOworZXJyX3NrZXk6CisJaXJsbXBfdW5yZWdpc3Rlcl9jbGllbnQoY2tleSk7CitlcnJfY2tleToKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJlbW92ZV9wcm9jX2VudHJ5KCJpcmxhbiIsIHByb2NfaXJkYSk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXJsYW5fY2xlYW51cCh2b2lkKSAKZGlmZiAtLWdpdCBhL25ldC9pdWN2L0tjb25maWcgYi9uZXQvaXVjdi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZmNjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXVjdi9LY29uZmlnCkBAIC0wLDAgKzEsMTUgQEAKK2NvbmZpZyBJVUNWCisJdHJpc3RhdGUgIklVQ1Ygc3VwcG9ydCAoVk0gb25seSkiCisJZGVwZW5kcyBvbiBTMzkwCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBpbnRlci11c2VyIGNvbW11bmljYXRpb24gdW5kZXIKKwkgIFZNIG9yIFZJRiBzb2NrZXRzLiBJZiB5b3UgcnVuIG9uIHovVk0sIHNheSAiWSIgdG8gZW5hYmxlIGEgZmFzdAorCSAgY29tbXVuaWNhdGlvbiBsaW5rIGJldHdlZW4gVk0gZ3Vlc3RzLgorCitjb25maWcgQUZJVUNWCisJdHJpc3RhdGUgIkFGX0lVQ1Ygc3VwcG9ydCAoVk0gb25seSkiCisJZGVwZW5kcyBvbiBJVUNWCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBpbnRlci11c2VyIGNvbW11bmljYXRpb24gdW5kZXIKKwkgIFZNIG9yIFZJRiBzb2NrZXRzLiBJZiB5b3UgcnVuIG9uIHovVk0sIHNheSAiWSIgdG8gZW5hYmxlIGEgZmFzdAorCSAgY29tbXVuaWNhdGlvbiBsaW5rIGJldHdlZW4gVk0gZ3Vlc3RzLgpkaWZmIC0tZ2l0IGEvbmV0L2l1Y3YvTWFrZWZpbGUgYi9uZXQvaXVjdi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmZkYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2l1Y3YvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjCisjIE1ha2VmaWxlIGZvciBJVUNWCisjCisKK29iai0kKENPTkZJR19JVUNWKQkrPSBpdWN2Lm8KK29iai0kKENPTkZJR19BRklVQ1YpCSs9IGFmX2l1Y3YubwpkaWZmIC0tZ2l0IGEvbmV0L2l1Y3YvYWZfaXVjdi5jIGIvbmV0L2l1Y3YvYWZfaXVjdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzk0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXVjdi9hZl9pdWN2LmMKQEAgLTAsMCArMSwxMDc3IEBACisvKgorICogIGxpbnV4L25ldC9pdWN2L2FmX2l1Y3YuYworICoKKyAqICBJVUNWIHByb3RvY29sIHN0YWNrIGZvciBMaW51eCBvbiB6U2VyaWVzCisgKgorICogIENvcHlyaWdodCAyMDA2IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqICBBdXRob3Iocyk6CUplbm5pZmVyIEh1bnQgPGplbmh1bnRAdXMuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgorI2luY2x1ZGUgPGFzbS9jcGNtZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKworI2luY2x1ZGUgPG5ldC9pdWN2L2l1Y3YuaD4KKyNpbmNsdWRlIDxuZXQvaXVjdi9hZl9pdWN2Lmg+CisKKyNkZWZpbmUgQ09ORklHX0lVQ1ZfU09DS19ERUJVRyAxCisKKyNkZWZpbmUgSVBSTURBVEEgMHg4MAorI2RlZmluZSBWRVJTSU9OICIxLjAiCisKK3N0YXRpYyBjaGFyIGl1Y3ZfdXNlcmlkWzgwXTsKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgaXVjdl9zb2NrX29wczsKKworc3RhdGljIHN0cnVjdCBwcm90byBpdWN2X3Byb3RvID0geworCS5uYW1lCQk9ICJBRl9JVUNWIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBpdWN2X3NvY2spLAorfTsKKworLyogQ2FsbCBCYWNrIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgaXVjdl9jYWxsYmFja19yeChzdHJ1Y3QgaXVjdl9wYXRoICosIHN0cnVjdCBpdWN2X21lc3NhZ2UgKik7CitzdGF0aWMgdm9pZCBpdWN2X2NhbGxiYWNrX3R4ZG9uZShzdHJ1Y3QgaXVjdl9wYXRoICosIHN0cnVjdCBpdWN2X21lc3NhZ2UgKik7CitzdGF0aWMgdm9pZCBpdWN2X2NhbGxiYWNrX2Nvbm5hY2soc3RydWN0IGl1Y3ZfcGF0aCAqLCB1OCBpcHVzZXJbMTZdKTsKK3N0YXRpYyBpbnQgaXVjdl9jYWxsYmFja19jb25ucmVxKHN0cnVjdCBpdWN2X3BhdGggKiwgdTggaXB2bWlkWzhdLCB1OCBpcHVzZXJbMTZdKTsKK3N0YXRpYyB2b2lkIGl1Y3ZfY2FsbGJhY2tfY29ubnJlaihzdHJ1Y3QgaXVjdl9wYXRoICosIHU4IGlwdXNlclsxNl0pOworCitzdGF0aWMgc3RydWN0IGl1Y3Zfc29ja19saXN0IGl1Y3Zfc2tfbGlzdCA9IHsKKwkubG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQsCisJLmF1dG9iaW5kX25hbWUgPSBBVE9NSUNfSU5JVCgwKQorfTsKKworc3RhdGljIHN0cnVjdCBpdWN2X2hhbmRsZXIgYWZfaXVjdl9oYW5kbGVyID0geworCS5wYXRoX3BlbmRpbmcJICA9IGl1Y3ZfY2FsbGJhY2tfY29ubnJlcSwKKwkucGF0aF9jb21wbGV0ZQkgID0gaXVjdl9jYWxsYmFja19jb25uYWNrLAorCS5wYXRoX3NldmVyZWQJICA9IGl1Y3ZfY2FsbGJhY2tfY29ubnJlaiwKKwkubWVzc2FnZV9wZW5kaW5nICA9IGl1Y3ZfY2FsbGJhY2tfcngsCisJLm1lc3NhZ2VfY29tcGxldGUgPSBpdWN2X2NhbGxiYWNrX3R4ZG9uZQorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGhpZ2hfbm1jcHkodW5zaWduZWQgY2hhciAqZHN0LCBjaGFyICpzcmMpCit7CisgICAgICAgbWVtY3B5KGRzdCwgc3JjLCA4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxvd19ubWNweSh1bnNpZ25lZCBjaGFyICpkc3QsIGNoYXIgKnNyYykKK3sKKyAgICAgICBtZW1jcHkoJmRzdFs4XSwgc3JjLCA4KTsKK30KKworLyogVGltZXJzICovCitzdGF0aWMgdm9pZCBpdWN2X3NvY2tfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilhcmc7CisKKwliaF9sb2NrX3NvY2soc2spOworCXNrLT5za19lcnIgPSBFVElNRURPVVQ7CisJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJYmhfdW5sb2NrX3NvY2soc2spOworCisJaXVjdl9zb2NrX2tpbGwoc2spOworCXNvY2tfcHV0KHNrKTsKK30KKworc3RhdGljIHZvaWQgaXVjdl9zb2NrX2NsZWFyX3RpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlza19zdG9wX3RpbWVyKHNrLCAmc2stPnNrX3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgaXVjdl9zb2NrX2luaXRfdGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCWluaXRfdGltZXIoJnNrLT5za190aW1lcik7CisJc2stPnNrX3RpbWVyLmZ1bmN0aW9uID0gaXVjdl9zb2NrX3RpbWVvdXQ7CisJc2stPnNrX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzazsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICpfX2l1Y3ZfZ2V0X3NvY2tfYnlfbmFtZShjaGFyICpubSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJml1Y3Zfc2tfbGlzdC5oZWFkKQorCQlpZiAoIW1lbWNtcCgmaXVjdl9zayhzayktPnNyY19uYW1lLCBubSwgOCkpCisJCQlyZXR1cm4gc2s7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaXVjdl9zb2NrX2Rlc3RydWN0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7Cit9CisKKy8qIENsZWFudXAgTGlzdGVuICovCitzdGF0aWMgdm9pZCBpdWN2X3NvY2tfY2xlYW51cF9saXN0ZW4oc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwkvKiBDbG9zZSBub24tYWNjZXB0ZWQgY29ubmVjdGlvbnMgKi8KKwl3aGlsZSAoKHNrID0gaXVjdl9hY2NlcHRfZGVxdWV1ZShwYXJlbnQsIE5VTEwpKSkgeworCQlpdWN2X3NvY2tfY2xvc2Uoc2spOworCQlpdWN2X3NvY2tfa2lsbChzayk7CisJfQorCisJcGFyZW50LT5za19zdGF0ZSA9IElVQ1ZfQ0xPU0VEOworCXNvY2tfc2V0X2ZsYWcocGFyZW50LCBTT0NLX1pBUFBFRCk7Cit9CisKKy8qIEtpbGwgc29ja2V0ICovCitzdGF0aWMgdm9pZCBpdWN2X3NvY2tfa2lsbChzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSB8fCBzay0+c2tfc29ja2V0KQorCQlyZXR1cm47CisKKwlpdWN2X3NvY2tfdW5saW5rKCZpdWN2X3NrX2xpc3QsIHNrKTsKKwlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFQUQpOworCXNvY2tfcHV0KHNrKTsKK30KKworLyogQ2xvc2UgYW4gSVVDViBzb2NrZXQgKi8KK3N0YXRpYyB2b2lkIGl1Y3Zfc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2spCit7CisJdW5zaWduZWQgY2hhciB1c2VyX2RhdGFbMTZdOworCXN0cnVjdCBpdWN2X3NvY2sgKml1Y3YgPSBpdWN2X3NrKHNrKTsKKwlpbnQgZXJyOworCisJaXVjdl9zb2NrX2NsZWFyX3RpbWVyKHNrKTsKKwlsb2NrX3NvY2soc2spOworCisJc3dpdGNoKHNrLT5za19zdGF0ZSkgeworCWNhc2UgSVVDVl9MSVNURU46CisJCWl1Y3Zfc29ja19jbGVhbnVwX2xpc3Rlbihzayk7CisJCWJyZWFrOworCisJY2FzZSBJVUNWX0NPTk5FQ1RFRDoKKwljYXNlIElVQ1ZfRElTQ09OTjoKKwkJZXJyID0gMDsKKwkJaWYgKGl1Y3YtPnBhdGgpIHsKKwkJCWxvd19ubWNweSh1c2VyX2RhdGEsIGl1Y3YtPnNyY19uYW1lKTsKKwkJCWhpZ2hfbm1jcHkodXNlcl9kYXRhLCBpdWN2LT5kc3RfbmFtZSk7CisJCQlBU0NFQkModXNlcl9kYXRhLCBzaXplb2YodXNlcl9kYXRhKSk7CisJCQllcnIgPSBpdWN2X3BhdGhfc2V2ZXIoaXVjdi0+cGF0aCwgdXNlcl9kYXRhKTsKKwkJCWl1Y3ZfcGF0aF9mcmVlKGl1Y3YtPnBhdGgpOworCQkJaXVjdi0+cGF0aCA9IE5VTEw7CisJCX0KKworCQlzay0+c2tfc3RhdGUgPSBJVUNWX0NMT1NFRDsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCXNrLT5za19lcnIgPSBFQ09OTlJFU0VUOworCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKworCQlza2JfcXVldWVfcHVyZ2UoJml1Y3YtPnNlbmRfc2tiX3EpOworCisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisJCWJyZWFrOworCX07CisKKwlyZWxlYXNlX3NvY2soc2spOworCWl1Y3Zfc29ja19raWxsKHNrKTsKK30KKworc3RhdGljIHZvaWQgaXVjdl9zb2NrX2luaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGFyZW50KQoreworCWlmIChwYXJlbnQpCisJCXNrLT5za190eXBlID0gcGFyZW50LT5za190eXBlOworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKml1Y3Zfc29ja19hbGxvYyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG8sIGdmcF90IHByaW8pCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBza19hbGxvYyhQRl9JVUNWLCBwcmlvLCAmaXVjdl9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIE5VTEw7CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJSU5JVF9MSVNUX0hFQUQoJml1Y3Zfc2soc2spLT5hY2NlcHRfcSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaXVjdl9zayhzayktPnNlbmRfc2tiX3EpOworCWl1Y3Zfc2soc2spLT5zZW5kX3RhZyA9IDA7CisKKwlzay0+c2tfZGVzdHJ1Y3QgPSBpdWN2X3NvY2tfZGVzdHJ1Y3Q7CisJc2stPnNrX3NuZHRpbWVvID0gSVVDVl9DT05OX1RJTUVPVVQ7CisJc2stPnNrX2FsbG9jYXRpb24gPSBHRlBfRE1BOworCisJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisKKwlzay0+c2tfcHJvdG9jb2wgPSBwcm90bzsKKwlzay0+c2tfc3RhdGUJPSBJVUNWX09QRU47CisKKwlpdWN2X3NvY2tfaW5pdF90aW1lcihzayk7CisKKwlpdWN2X3NvY2tfbGluaygmaXVjdl9za19saXN0LCBzayk7CisJcmV0dXJuIHNrOworfQorCisvKiBDcmVhdGUgYW4gSVVDViBzb2NrZXQgKi8KK3N0YXRpYyBpbnQgaXVjdl9zb2NrX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJaWYgKHNvY2stPnR5cGUgIT0gU09DS19TVFJFQU0pCisJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwlzb2NrLT5vcHMgPSAmaXVjdl9zb2NrX29wczsKKworCXNrID0gaXVjdl9zb2NrX2FsbG9jKHNvY2ssIHByb3RvY29sLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWl1Y3Zfc29ja19pbml0KHNrLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGl1Y3Zfc29ja19saW5rKHN0cnVjdCBpdWN2X3NvY2tfbGlzdCAqbCwgc3RydWN0IHNvY2sgKnNrKQoreworCXdyaXRlX2xvY2tfYmgoJmwtPmxvY2spOworCXNrX2FkZF9ub2RlKHNrLCAmbC0+aGVhZCk7CisJd3JpdGVfdW5sb2NrX2JoKCZsLT5sb2NrKTsKK30KKwordm9pZCBpdWN2X3NvY2tfdW5saW5rKHN0cnVjdCBpdWN2X3NvY2tfbGlzdCAqbCwgc3RydWN0IHNvY2sgKnNrKQoreworCXdyaXRlX2xvY2tfYmgoJmwtPmxvY2spOworCXNrX2RlbF9ub2RlX2luaXQoc2spOworCXdyaXRlX3VubG9ja19iaCgmbC0+bG9jayk7Cit9CisKK3ZvaWQgaXVjdl9hY2NlcHRfZW5xdWV1ZShzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3Qgc29jayAqc2spCit7CisJc29ja19ob2xkKHNrKTsKKwlsaXN0X2FkZF90YWlsKCZpdWN2X3NrKHNrKS0+YWNjZXB0X3EsICZpdWN2X3NrKHBhcmVudCktPmFjY2VwdF9xKTsKKwlpdWN2X3NrKHNrKS0+cGFyZW50ID0gcGFyZW50OworCXBhcmVudC0+c2tfYWNrX2JhY2tsb2crKzsKK30KKwordm9pZCBpdWN2X2FjY2VwdF91bmxpbmsoc3RydWN0IHNvY2sgKnNrKQoreworCWxpc3RfZGVsX2luaXQoJml1Y3Zfc2soc2spLT5hY2NlcHRfcSk7CisJaXVjdl9zayhzayktPnBhcmVudC0+c2tfYWNrX2JhY2tsb2ctLTsKKwlpdWN2X3NrKHNrKS0+cGFyZW50ID0gTlVMTDsKKwlzb2NrX3B1dChzayk7Cit9CisKK3N0cnVjdCBzb2NrICppdWN2X2FjY2VwdF9kZXF1ZXVlKHN0cnVjdCBzb2NrICpwYXJlbnQsIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2spCit7CisJc3RydWN0IGl1Y3Zfc29jayAqaXNrLCAqbjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXNrLCBuLCAmaXVjdl9zayhwYXJlbnQpLT5hY2NlcHRfcSwgYWNjZXB0X3EpeworCQlzayA9IChzdHJ1Y3Qgc29jayAqKSBpc2s7CisJCWxvY2tfc29jayhzayk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBJVUNWX0NMT1NFRCkgeworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCWl1Y3ZfYWNjZXB0X3VubGluayhzayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzay0+c2tfc3RhdGUgPT0gSVVDVl9DT05ORUNURUQgfHwKKwkJICAgIHNrLT5za19zdGF0ZSA9PSBJVUNWX1NFVkVSRUQgfHwKKwkJICAgICFuZXdzb2NrKSB7CisJCQlpdWN2X2FjY2VwdF91bmxpbmsoc2spOworCQkJaWYgKG5ld3NvY2spCisJCQkJc29ja19ncmFmdChzaywgbmV3c29jayk7CisKKwkJCWlmIChzay0+c2tfc3RhdGUgPT0gSVVDVl9TRVZFUkVEKQorCQkJCXNrLT5za19zdGF0ZSA9IElVQ1ZfRElTQ09OTjsKKworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJCXJldHVybiBzazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJfQorCXJldHVybiBOVUxMOworfQorCitpbnQgaXVjdl9zb2NrX3dhaXRfc3RhdGUoc3RydWN0IHNvY2sgKnNrLCBpbnQgc3RhdGUsIGludCBzdGF0ZTIsCisJCQkgdW5zaWduZWQgbG9uZyB0aW1lbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlpbnQgZXJyID0gMDsKKworCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCXdoaWxlIChzay0+c2tfc3RhdGUgIT0gc3RhdGUgJiYgc2stPnNrX3N0YXRlICE9IHN0YXRlMikgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKKwkJbG9ja19zb2NrKHNrKTsKKworCQllcnIgPSBzb2NrX2Vycm9yKHNrKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCXJldHVybiBlcnI7Cit9CisKKy8qIEJpbmQgYW4gdW5ib3VuZCBzb2NrZXQgKi8KK3N0YXRpYyBpbnQgaXVjdl9zb2NrX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJICBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2l1Y3YgKnNhID0gKHN0cnVjdCBzb2NrYWRkcl9pdWN2ICopIGFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGl1Y3Zfc29jayAqaXVjdjsKKwlpbnQgZXJyOworCisJLyogVmVyaWZ5IHRoZSBpbnB1dCBzb2NrYWRkciAqLworCWlmICghYWRkciB8fCBhZGRyLT5zYV9mYW1pbHkgIT0gQUZfSVVDVikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCWlmIChzay0+c2tfc3RhdGUgIT0gSVVDVl9PUEVOKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZpdWN2X3NrX2xpc3QubG9jayk7CisKKwlpdWN2ID0gaXVjdl9zayhzayk7CisJaWYgKF9faXVjdl9nZXRfc29ja19ieV9uYW1lKHNhLT5zaXVjdl9uYW1lKSkgeworCQllcnIgPSAtRUFERFJJTlVTRTsKKwkJZ290byBkb25lX3VubG9jazsKKwl9CisJaWYgKGl1Y3YtPnBhdGgpIHsKKwkJZXJyID0gMDsKKwkJZ290byBkb25lX3VubG9jazsKKwl9CisKKwkvKiBCaW5kIHRoZSBzb2NrZXQgKi8KKwltZW1jcHkoaXVjdi0+c3JjX25hbWUsIHNhLT5zaXVjdl9uYW1lLCA4KTsKKworCS8qIENvcHkgdGhlIHVzZXIgaWQgKi8KKwltZW1jcHkoaXVjdi0+c3JjX3VzZXJfaWQsIGl1Y3ZfdXNlcmlkLCA4KTsKKwlzay0+c2tfc3RhdGUgPSBJVUNWX0JPVU5EOworCWVyciA9IDA7CisKK2RvbmVfdW5sb2NrOgorCS8qIFJlbGVhc2UgdGhlIHNvY2tldCBsaXN0IGxvY2sgKi8KKwl3cml0ZV91bmxvY2tfYmgoJml1Y3Zfc2tfbGlzdC5sb2NrKTsKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBBdXRvbWF0aWNhbGx5IGJpbmQgYW4gdW5ib3VuZCBzb2NrZXQgKi8KK3N0YXRpYyBpbnQgaXVjdl9zb2NrX2F1dG9iaW5kKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaXVjdl9zb2NrICppdWN2ID0gaXVjdl9zayhzayk7CisJY2hhciBxdWVyeV9idWZmZXJbODBdOworCWNoYXIgbmFtZVsxMl07CisJaW50IGVyciA9IDA7CisKKwkvKiBTZXQgdGhlIHVzZXJpZCBhbmQgbmFtZSAqLworCWNwY21kKCJRVUVSWSBVU0VSSUQiLCBxdWVyeV9idWZmZXIsIHNpemVvZihxdWVyeV9idWZmZXIpLCAmZXJyKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJcmV0dXJuIC1FUFJPVE87CisKKwltZW1jcHkoaXVjdi0+c3JjX3VzZXJfaWQsIHF1ZXJ5X2J1ZmZlciwgOCk7CisKKwl3cml0ZV9sb2NrX2JoKCZpdWN2X3NrX2xpc3QubG9jayk7CisKKwlzcHJpbnRmKG5hbWUsICIlMDh4IiwgYXRvbWljX2luY19yZXR1cm4oJml1Y3Zfc2tfbGlzdC5hdXRvYmluZF9uYW1lKSk7CisJd2hpbGUgKF9faXVjdl9nZXRfc29ja19ieV9uYW1lKG5hbWUpKSB7CisJCXNwcmludGYobmFtZSwgIiUwOHgiLAorCQkJYXRvbWljX2luY19yZXR1cm4oJml1Y3Zfc2tfbGlzdC5hdXRvYmluZF9uYW1lKSk7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZpdWN2X3NrX2xpc3QubG9jayk7CisKKwltZW1jcHkoJml1Y3YtPnNyY19uYW1lLCBuYW1lLCA4KTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIENvbm5lY3QgYW4gdW5jb25uZWN0ZWQgc29ja2V0ICovCitzdGF0aWMgaW50IGl1Y3Zfc29ja19jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCSAgICAgaW50IGFsZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaXVjdiAqc2EgPSAoc3RydWN0IHNvY2thZGRyX2l1Y3YgKikgYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaXVjdl9zb2NrICppdWN2OworCXVuc2lnbmVkIGNoYXIgdXNlcl9kYXRhWzE2XTsKKwlpbnQgZXJyOworCisJaWYgKGFkZHItPnNhX2ZhbWlseSAhPSBBRl9JVUNWIHx8IGFsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2l1Y3YpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gSVVDVl9PUEVOICYmIHNrLT5za19zdGF0ZSAhPSBJVUNWX0JPVU5EKQorCQlyZXR1cm4gLUVCQURGRDsKKworCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NUUkVBTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpdWN2ID0gaXVjdl9zayhzayk7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IElVQ1ZfT1BFTikgeworCQllcnIgPSBpdWN2X3NvY2tfYXV0b2JpbmQoc2spOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCXJldHVybiBlcnI7CisJfQorCisJbG9ja19zb2NrKHNrKTsKKworCS8qIFNldCB0aGUgZGVzdGluYXRpb24gaW5mb3JtYXRpb24gKi8KKwltZW1jcHkoaXVjdl9zayhzayktPmRzdF91c2VyX2lkLCBzYS0+c2l1Y3ZfdXNlcl9pZCwgOCk7CisJbWVtY3B5KGl1Y3Zfc2soc2spLT5kc3RfbmFtZSwgc2EtPnNpdWN2X25hbWUsIDgpOworCisJaGlnaF9ubWNweSh1c2VyX2RhdGEsIHNhLT5zaXVjdl9uYW1lKTsKKwlsb3dfbm1jcHkodXNlcl9kYXRhLCBpdWN2X3NrKHNrKS0+c3JjX25hbWUpOworCUFTQ0VCQyh1c2VyX2RhdGEsIHNpemVvZih1c2VyX2RhdGEpKTsKKworCWl1Y3YgPSBpdWN2X3NrKHNrKTsKKwkvKiBDcmVhdGUgcGF0aC4gKi8KKwlpdWN2LT5wYXRoID0gaXVjdl9wYXRoX2FsbG9jKElVQ1ZfUVVFVUVMRU5fREVGQVVMVCwKKwkJCQkgICAgIElQUk1EQVRBLCBHRlBfS0VSTkVMKTsKKwllcnIgPSBpdWN2X3BhdGhfY29ubmVjdChpdWN2LT5wYXRoLCAmYWZfaXVjdl9oYW5kbGVyLAorCQkJCXNhLT5zaXVjdl91c2VyX2lkLCBOVUxMLCB1c2VyX2RhdGEsIHNrKTsKKwlpZiAoZXJyKSB7CisJCWl1Y3ZfcGF0aF9mcmVlKGl1Y3YtPnBhdGgpOworCQlpdWN2LT5wYXRoID0gTlVMTDsKKwkJZXJyID0gLUVDT05OUkVGVVNFRDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChzay0+c2tfc3RhdGUgIT0gSVVDVl9DT05ORUNURUQpIHsKKwkJZXJyID0gaXVjdl9zb2NrX3dhaXRfc3RhdGUoc2ssIElVQ1ZfQ09OTkVDVEVELCBJVUNWX0RJU0NPTk4sCisJCQkJc29ja19zbmR0aW1lbyhzaywgZmxhZ3MgJiBPX05PTkJMT0NLKSk7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBJVUNWX0RJU0NPTk4pIHsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisJfQorZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKKy8qIE1vdmUgYSBzb2NrZXQgaW50byBsaXN0ZW5pbmcgc3RhdGUuICovCitzdGF0aWMgaW50IGl1Y3Zfc29ja19saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVycjsKKworCWxvY2tfc29jayhzayk7CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChzay0+c2tfc3RhdGUgIT0gSVVDVl9CT1VORCB8fCBzb2NrLT50eXBlICE9IFNPQ0tfU1RSRUFNKQorCQlnb3RvIGRvbmU7CisKKwlzay0+c2tfbWF4X2Fja19iYWNrbG9nID0gYmFja2xvZzsKKwlzay0+c2tfYWNrX2JhY2tsb2cgPSAwOworCXNrLT5za19zdGF0ZSA9IElVQ1ZfTElTVEVOOworCWVyciA9IDA7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBBY2NlcHQgYSBwZW5kaW5nIGNvbm5lY3Rpb24gKi8KK3N0YXRpYyBpbnQgaXVjdl9zb2NrX2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrLAorCQkJICAgIGludCBmbGFncykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zaywgKm5zazsKKwlsb25nIHRpbWVvOworCWludCBlcnIgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gSVVDVl9MSVNURU4pIHsKKwkJZXJyID0gLUVCQURGRDsKKwkJZ290byBkb25lOworCX0KKworCXRpbWVvID0gc29ja19yY3Z0aW1lbyhzaywgZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworCS8qIFdhaXQgZm9yIGFuIGluY29taW5nIGNvbm5lY3Rpb24gKi8KKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJd2hpbGUgKCEobnNrID0gaXVjdl9hY2NlcHRfZGVxdWV1ZShzaywgbmV3c29jaykpKXsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKCF0aW1lbykgeworCQkJZXJyID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKKwkJbG9ja19zb2NrKHNrKTsKKworCQlpZiAoc2stPnNrX3N0YXRlICE9IElVQ1ZfTElTVEVOKSB7CisJCQllcnIgPSAtRUJBREZEOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCWVyciA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXVjdl9zb2NrX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJICAgICBpbnQgKmxlbiwgaW50IHBlZXIpCit7CisJc3RydWN0IHNvY2thZGRyX2l1Y3YgKnNpdWN2ID0gKHN0cnVjdCBzb2NrYWRkcl9pdWN2ICopIGFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlhZGRyLT5zYV9mYW1pbHkgPSBBRl9JVUNWOworCSpsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2l1Y3YpOworCisJaWYgKHBlZXIpIHsKKwkJbWVtY3B5KHNpdWN2LT5zaXVjdl91c2VyX2lkLCBpdWN2X3NrKHNrKS0+ZHN0X3VzZXJfaWQsIDgpOworCQltZW1jcHkoc2l1Y3YtPnNpdWN2X25hbWUsICZpdWN2X3NrKHNrKS0+ZHN0X25hbWUsIDgpOworCX0gZWxzZSB7CisJCW1lbWNweShzaXVjdi0+c2l1Y3ZfdXNlcl9pZCwgaXVjdl9zayhzayktPnNyY191c2VyX2lkLCA4KTsKKwkJbWVtY3B5KHNpdWN2LT5zaXVjdl9uYW1lLCBpdWN2X3NrKHNrKS0+c3JjX25hbWUsIDgpOworCX0KKwltZW1zZXQoJnNpdWN2LT5zaXVjdl9wb3J0LCAwLCBzaXplb2Yoc2l1Y3YtPnNpdWN2X3BvcnQpKTsKKwltZW1zZXQoJnNpdWN2LT5zaXVjdl9hZGRyLCAwLCBzaXplb2Yoc2l1Y3YtPnNpdWN2X2FkZHIpKTsKKwltZW1zZXQoc2l1Y3YtPnNpdWN2X25vZGVpZCwgMCwgc2l6ZW9mKHNpdWN2LT5zaXVjdl9ub2RlaWQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl1Y3Zfc29ja19zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBpdWN2X3NvY2sgKml1Y3YgPSBpdWN2X3NrKHNrKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpdWN2X21lc3NhZ2UgdHhtc2c7CisJaW50IGVycjsKKworCWVyciA9IHNvY2tfZXJyb3Ioc2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHNrLT5za19zaHV0ZG93biAmIFNFTkRfU0hVVERPV04pIHsKKwkJZXJyID0gLUVQSVBFOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc2stPnNrX3N0YXRlID09IElVQ1ZfQ09OTkVDVEVEKXsKKwkJaWYoIShza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBsZW4sCisJCQkJICAgICAgIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULAorCQkJCSAgICAgICAmZXJyKSkpCisJCQlyZXR1cm4gZXJyOworCisJCWlmIChtZW1jcHlfZnJvbWlvdmVjKHNrYl9wdXQoc2tiLCBsZW4pLCBtc2ctPm1zZ19pb3YsIGxlbikpeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXR4bXNnLmNsYXNzID0gMDsKKwkJdHhtc2cudGFnID0gaXVjdi0+c2VuZF90YWcrKzsKKwkJbWVtY3B5KHNrYi0+Y2IsICZ0eG1zZy50YWcsIDQpOworCQlza2JfcXVldWVfdGFpbCgmaXVjdi0+c2VuZF9za2JfcSwgc2tiKTsKKwkJZXJyID0gaXVjdl9tZXNzYWdlX3NlbmQoaXVjdi0+cGF0aCwgJnR4bXNnLCAwLCAwLAorCQkJCQkodm9pZCAqKSBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaWYgKGVycikgeworCQkJaWYgKGVyciA9PSAzKQorCQkJCXByaW50ayhLRVJOX0VSUiAiQUZfSVVDViBtc2cgbGltaXQgZXhjZWVkZWRcbiIpOworCQkJc2tiX3VubGluayhza2IsICZpdWN2LT5zZW5kX3NrYl9xKTsKKwkJCWVyciA9IC1FUElQRTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJfSBlbHNlIHsKKwkJZXJyID0gLUVOT1RDT05OOworCQlnb3RvIG91dDsKKwl9CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBsZW47CisKK2ZhaWw6CisJa2ZyZWVfc2tiKHNrYik7CitvdXQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGl1Y3Zfc29ja19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCit7CisJaW50IG5vYmxvY2sgPSBmbGFncyAmIE1TR19ET05UV0FJVDsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgdGFyZ2V0LCBjb3BpZWQgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZmxhZ3MgJiAoTVNHX09PQikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXRhcmdldCA9IHNvY2tfcmN2bG93YXQoc2ssIGZsYWdzICYgTVNHX1dBSVRBTEwsIGxlbik7CisKKwlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MsIG5vYmxvY2ssICZlcnIpOworCWlmICghc2tiKSB7CisJCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwljb3BpZWQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNrYi0+bGVuLCBsZW4pOworCisJaWYgKG1lbWNweV90b2lvdmVjKG1zZy0+bXNnX2lvdiwgc2tiLT5kYXRhLCBjb3BpZWQpKSB7CisJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJaWYgKGNvcGllZCA9PSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbGVuIC09IGNvcGllZDsKKworCS8qIE1hcmsgcmVhZCBwYXJ0IG9mIHNrYiBhcyB1c2VkICovCisJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKKwkJc2tiX3B1bGwoc2tiLCBjb3BpZWQpOworCisJCWlmIChza2ItPmxlbikgeworCQkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCQkJZ290byBkb25lOworCQl9CisKKwkJa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlCisJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKworZG9uZToKKwlyZXR1cm4gZXJyID8gOiBjb3BpZWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGl1Y3ZfYWNjZXB0X3BvbGwoc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgaXVjdl9zb2NrICppc2ssICpuOworCXN0cnVjdCBzb2NrICpzazsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpc2ssIG4sICZpdWN2X3NrKHBhcmVudCktPmFjY2VwdF9xLCBhY2NlcHRfcSl7CisJCXNrID0gKHN0cnVjdCBzb2NrICopIGlzazsKKworCQlpZiAoc2stPnNrX3N0YXRlID09IElVQ1ZfQ09OTkVDVEVEKQorCQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludCBpdWN2X3NvY2tfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgICBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCXBvbGxfd2FpdChmaWxlLCBzay0+c2tfc2xlZXAsIHdhaXQpOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBJVUNWX0xJU1RFTikKKwkJcmV0dXJuIGl1Y3ZfYWNjZXB0X3BvbGwoc2spOworCisJaWYgKHNrLT5za19lcnIgfHwgIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX2Vycm9yX3F1ZXVlKSkKKwkJbWFzayB8PSBQT0xMRVJSOworCisJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikKKwkJbWFzayB8PSBQT0xMUkRIVVA7CisKKwlpZiAoc2stPnNrX3NodXRkb3duID09IFNIVVRET1dOX01BU0spCisJCW1hc2sgfD0gUE9MTEhVUDsKKworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkgfHwKKwkJCShzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlpZiAoc2stPnNrX3N0YXRlID09IElVQ1ZfQ0xPU0VEKQorCQltYXNrIHw9IFBPTExIVVA7CisKKwlpZiAoc29ja193cml0ZWFibGUoc2spKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTFdSQkFORDsKKwllbHNlCisJCXNldF9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgaXVjdl9zb2NrX3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGl1Y3Zfc29jayAqaXVjdiA9IGl1Y3Zfc2soc2spOworCXN0cnVjdCBpdWN2X21lc3NhZ2UgdHhtc2c7CisJaW50IGVyciA9IDA7CisJdTggcHJtbXNnWzhdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDF9OworCisJaG93Kys7CisKKwlpZiAoKGhvdyAmIH5TSFVURE9XTl9NQVNLKSB8fCAhaG93KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2tfc29jayhzayk7CisJc3dpdGNoKHNrLT5za19zdGF0ZSkgeworCWNhc2UgSVVDVl9DTE9TRUQ6CisJCWVyciA9IC1FTk9UQ09OTjsKKwkJZ290byBmYWlsOworCisJZGVmYXVsdDoKKwkJc2stPnNrX3NodXRkb3duIHw9IGhvdzsKKwkJYnJlYWs7CisJfQorCisJaWYgKGhvdyA9PSBTRU5EX1NIVVRET1dOIHx8IGhvdyA9PSBTSFVURE9XTl9NQVNLKSB7CisJCXR4bXNnLmNsYXNzID0gMDsKKwkJdHhtc2cudGFnID0gMDsKKwkJZXJyID0gaXVjdl9tZXNzYWdlX3NlbmQoaXVjdi0+cGF0aCwgJnR4bXNnLCBJVUNWX0lQUk1EQVRBLCAwLAorCQkJCQkodm9pZCAqKSBwcm1tc2csIDgpOworCQlpZiAoZXJyKSB7CisJCQlzd2l0Y2goZXJyKSB7CisJCQljYXNlIDE6CisJCQkJZXJyID0gLUVOT1RDT05OOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWVyciA9IC1FQ09OTlJFU0VUOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQllcnIgPSAtRU5PVENPTk47CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaG93ID09IFJDVl9TSFVURE9XTiB8fCBob3cgPT0gU0hVVERPV05fTUFTSykgeworCQllcnIgPSBpdWN2X3BhdGhfcXVpZXNjZShpdWN2X3NrKHNrKS0+cGF0aCwgTlVMTCk7CisJCWlmIChlcnIpCisJCQllcnIgPSAtRU5PVENPTk47CisKKwkJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJfQorCisJLyogV2FrZSB1cCBhbnlvbmUgc2xlZXBpbmcgaW4gcG9sbCAqLworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCitmYWlsOgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpdWN2X3NvY2tfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlpdWN2X3NvY2tfY2xvc2Uoc2spOworCisJLyogVW5yZWdpc3RlciB3aXRoIElVQ1YgYmFzZSBzdXBwb3J0ICovCisJaWYgKGl1Y3Zfc2soc2spLT5wYXRoKSB7CisJCWl1Y3ZfcGF0aF9zZXZlcihpdWN2X3NrKHNrKS0+cGF0aCwgTlVMTCk7CisJCWl1Y3ZfcGF0aF9mcmVlKGl1Y3Zfc2soc2spLT5wYXRoKTsKKwkJaXVjdl9zayhzayktPnBhdGggPSBOVUxMOworCX0KKworCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfTElOR0VSKSAmJiBzay0+c2tfbGluZ2VydGltZSl7CisJCWxvY2tfc29jayhzayk7CisJCWVyciA9IGl1Y3Zfc29ja193YWl0X3N0YXRlKHNrLCBJVUNWX0NMT1NFRCwgMCwKKwkJCQkJICAgc2stPnNrX2xpbmdlcnRpbWUpOworCQlyZWxlYXNlX3NvY2soc2spOworCX0KKworCXNvY2tfb3JwaGFuKHNrKTsKKwlpdWN2X3NvY2tfa2lsbChzayk7CisJcmV0dXJuIGVycjsKK30KKworLyogQ2FsbGJhY2sgd3JhcHBlcnMgLSBjYWxsZWQgZnJvbSBpdWN2IGJhc2Ugc3VwcG9ydCAqLworc3RhdGljIGludCBpdWN2X2NhbGxiYWNrX2Nvbm5yZXEoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwKKwkJCQkgdTggaXB2bWlkWzhdLCB1OCBpcHVzZXJbMTZdKQoreworCXVuc2lnbmVkIGNoYXIgdXNlcl9kYXRhWzE2XTsKKwl1bnNpZ25lZCBjaGFyIG51c2VyX2RhdGFbMTZdOworCXVuc2lnbmVkIGNoYXIgc3JjX25hbWVbOF07CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IHNvY2sgKnNrLCAqbnNrOworCXN0cnVjdCBpdWN2X3NvY2sgKml1Y3YsICpuaXVjdjsKKwlpbnQgZXJyOworCisJbWVtY3B5KHNyY19uYW1lLCBpcHVzZXIsIDgpOworCUVCQ0FTQyhzcmNfbmFtZSwgOCk7CisJLyogRmluZCBvdXQgaWYgdGhpcyBwYXRoIGJlbG9uZ3MgdG8gYWZfaXVjdi4gKi8KKwlyZWFkX2xvY2soJml1Y3Zfc2tfbGlzdC5sb2NrKTsKKwlpdWN2ID0gTlVMTDsKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJml1Y3Zfc2tfbGlzdC5oZWFkKQorCQlpZiAoc2stPnNrX3N0YXRlID09IElVQ1ZfTElTVEVOICYmCisJCSAgICAhbWVtY21wKCZpdWN2X3NrKHNrKS0+c3JjX25hbWUsIHNyY19uYW1lLCA4KSkgeworCQkJLyoKKwkJCSAqIEZvdW5kIGEgbGlzdGVuaW5nIHNvY2tldCB3aXRoCisJCQkgKiBzcmNfbmFtZSA9PSBpcHVzZXJbMC03XS4KKwkJCSAqLworCQkJaXVjdiA9IGl1Y3Zfc2soc2spOworCQkJYnJlYWs7CisJCX0KKwlyZWFkX3VubG9jaygmaXVjdl9za19saXN0LmxvY2spOworCWlmICghaXVjdikKKwkJLyogTm8gc29ja2V0IGZvdW5kLCBub3Qgb25lIG9mIG91ciBwYXRocy4gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliaF9sb2NrX3NvY2soc2spOworCisJLyogQ2hlY2sgaWYgcGFyZW50IHNvY2tldCBpcyBsaXN0ZW5pbmcgKi8KKwlsb3dfbm1jcHkodXNlcl9kYXRhLCBpdWN2LT5zcmNfbmFtZSk7CisJaGlnaF9ubWNweSh1c2VyX2RhdGEsIGl1Y3YtPmRzdF9uYW1lKTsKKwlBU0NFQkModXNlcl9kYXRhLCBzaXplb2YodXNlcl9kYXRhKSk7CisJaWYgKHNrLT5za19zdGF0ZSAhPSBJVUNWX0xJU1RFTikgeworCQllcnIgPSBpdWN2X3BhdGhfc2V2ZXIocGF0aCwgdXNlcl9kYXRhKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIENoZWNrIGZvciBiYWNrbG9nIHNpemUgKi8KKwlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKHNrKSkgeworCQllcnIgPSBpdWN2X3BhdGhfc2V2ZXIocGF0aCwgdXNlcl9kYXRhKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIENyZWF0ZSB0aGUgbmV3IHNvY2tldCAqLworCW5zayA9IGl1Y3Zfc29ja19hbGxvYyhOVUxMLCBTT0NLX1NUUkVBTSwgR0ZQX0FUT01JQyk7CisJaWYgKCFuc2speworCQllcnIgPSBpdWN2X3BhdGhfc2V2ZXIocGF0aCwgdXNlcl9kYXRhKTsKKwkJZ290byBmYWlsOworCX0KKworCW5pdWN2ID0gaXVjdl9zayhuc2spOworCWl1Y3Zfc29ja19pbml0KG5zaywgc2spOworCisJLyogU2V0IHRoZSBuZXcgaXVjdl9zb2NrICovCisJbWVtY3B5KG5pdWN2LT5kc3RfbmFtZSwgaXB1c2VyICsgOCwgOCk7CisJRUJDQVNDKG5pdWN2LT5kc3RfbmFtZSwgOCk7CisJbWVtY3B5KG5pdWN2LT5kc3RfdXNlcl9pZCwgaXB2bWlkLCA4KTsKKwltZW1jcHkobml1Y3YtPnNyY19uYW1lLCBpdWN2LT5zcmNfbmFtZSwgOCk7CisJbWVtY3B5KG5pdWN2LT5zcmNfdXNlcl9pZCwgaXVjdi0+c3JjX3VzZXJfaWQsIDgpOworCW5pdWN2LT5wYXRoID0gcGF0aDsKKworCS8qIENhbGwgaXVjdl9hY2NlcHQgKi8KKwloaWdoX25tY3B5KG51c2VyX2RhdGEsIGlwdXNlciArIDgpOworCW1lbWNweShudXNlcl9kYXRhICsgOCwgbml1Y3YtPnNyY19uYW1lLCA4KTsKKwlBU0NFQkMobnVzZXJfZGF0YSArIDgsIDgpOworCisJcGF0aC0+bXNnbGltID0gSVVDVl9RVUVVRUxFTl9ERUZBVUxUOworCWVyciA9IGl1Y3ZfcGF0aF9hY2NlcHQocGF0aCwgJmFmX2l1Y3ZfaGFuZGxlciwgbnVzZXJfZGF0YSwgbnNrKTsKKwlpZiAoZXJyKXsKKwkJZXJyID0gaXVjdl9wYXRoX3NldmVyKHBhdGgsIHVzZXJfZGF0YSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpdWN2X2FjY2VwdF9lbnF1ZXVlKHNrLCBuc2spOworCisJLyogV2FrZSB1cCBhY2NlcHQgKi8KKwluc2stPnNrX3N0YXRlID0gSVVDVl9DT05ORUNURUQ7CisJc2stPnNrX2RhdGFfcmVhZHkoc2ssIDEpOworCWVyciA9IDA7CitmYWlsOgorCWJoX3VubG9ja19zb2NrKHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXVjdl9jYWxsYmFja19jb25uYWNrKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IGlwdXNlclsxNl0pCit7CisJc3RydWN0IHNvY2sgKnNrID0gcGF0aC0+cHJpdmF0ZTsKKworCXNrLT5za19zdGF0ZSA9IElVQ1ZfQ09OTkVDVEVEOworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworfQorCitzdGF0aWMgdm9pZCBpdWN2X2NhbGxiYWNrX3J4KHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBwYXRoLT5wcml2YXRlOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJjOworCisJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikKKwkJcmV0dXJuOworCisJc2tiID0gYWxsb2Nfc2tiKG1zZy0+bGVuZ3RoLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CisJaWYgKCFza2IpIHsKKwkJaXVjdl9tZXNzYWdlX3JlamVjdChwYXRoLCBtc2cpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1zZy0+ZmxhZ3MgJiBJUFJNREFUQSkgeworCQlza2ItPmRhdGEgPSBOVUxMOworCQlza2ItPmxlbiA9IDA7CisJfSBlbHNlIHsKKwkJcmMgPSBpdWN2X21lc3NhZ2VfcmVjZWl2ZShwYXRoLCBtc2csIDAsIHNrYi0+ZGF0YSwKKwkJCQkJICBtc2ctPmxlbmd0aCwgTlVMTCk7CisJCWlmIChyYykgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm47CisJCX0KKworCQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5sZW4gPSBtc2ctPmxlbmd0aDsKKwl9CisKKwlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpKQorCQlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIHZvaWQgaXVjdl9jYWxsYmFja190eGRvbmUoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwKKwkJCQkgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHBhdGgtPnByaXZhdGU7CisJc3RydWN0IHNrX2J1ZmYgKnRoaXM7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCA9ICZpdWN2X3NrKHNrKS0+c2VuZF9za2JfcTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdF9za2IgPSBsaXN0LT5uZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdC0+bG9jaywgZmxhZ3MpOworCisJZG8geworCQl0aGlzID0gbGlzdF9za2I7CisJCWxpc3Rfc2tiID0gbGlzdF9za2ItPm5leHQ7CisJfSB3aGlsZSAobWVtY21wKCZtc2ctPnRhZywgdGhpcy0+Y2IsIDQpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3QtPmxvY2ssIGZsYWdzKTsKKworCXNrYl91bmxpbmsodGhpcywgJml1Y3Zfc2soc2spLT5zZW5kX3NrYl9xKTsKKwlrZnJlZV9za2IodGhpcyk7Cit9CisKK3N0YXRpYyB2b2lkIGl1Y3ZfY2FsbGJhY2tfY29ubnJlaihzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCB1OCBpcHVzZXJbMTZdKQoreworCXN0cnVjdCBzb2NrICpzayA9IHBhdGgtPnByaXZhdGU7CisKKwlpZiAoIWxpc3RfZW1wdHkoJml1Y3Zfc2soc2spLT5hY2NlcHRfcSkpCisJCXNrLT5za19zdGF0ZSA9IElVQ1ZfU0VWRVJFRDsKKwllbHNlCisJCXNrLT5za19zdGF0ZSA9IElVQ1ZfRElTQ09OTjsKKworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBpdWN2X3NvY2tfb3BzID0geworCS5mYW1pbHkJCT0gUEZfSVVDViwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UJPSBpdWN2X3NvY2tfcmVsZWFzZSwKKwkuYmluZAkJPSBpdWN2X3NvY2tfYmluZCwKKwkuY29ubmVjdAk9IGl1Y3Zfc29ja19jb25uZWN0LAorCS5saXN0ZW4JCT0gaXVjdl9zb2NrX2xpc3RlbiwKKwkuYWNjZXB0CQk9IGl1Y3Zfc29ja19hY2NlcHQsCisJLmdldG5hbWUJPSBpdWN2X3NvY2tfZ2V0bmFtZSwKKwkuc2VuZG1zZwk9IGl1Y3Zfc29ja19zZW5kbXNnLAorCS5yZWN2bXNnCT0gaXVjdl9zb2NrX3JlY3Ztc2csCisJLnBvbGwJCT0gaXVjdl9zb2NrX3BvbGwsCisJLmlvY3RsCQk9IHNvY2tfbm9faW9jdGwsCisJLm1tYXAJCT0gc29ja19ub19tbWFwLAorCS5zb2NrZXRwYWlyCT0gc29ja19ub19zb2NrZXRwYWlyLAorCS5zaHV0ZG93bgk9IGl1Y3Zfc29ja19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNvY2tfbm9fZ2V0c29ja29wdAorfTsKKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGl1Y3Zfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBBRl9JVUNWLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5jcmVhdGUJPSBpdWN2X3NvY2tfY3JlYXRlLAorfTsKKworc3RhdGljIGludCBhZml1Y3ZfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoIU1BQ0hJTkVfSVNfVk0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBRl9JVUNWIGNvbm5lY3Rpb24gbmVlZHMgVk0gYXMgYmFzZVxuIik7CisJCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJCWdvdG8gb3V0OworCX0KKwljcGNtZCgiUVVFUlkgVVNFUklEIiwgaXVjdl91c2VyaWQsIHNpemVvZihpdWN2X3VzZXJpZCksICZlcnIpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQUZfSVVDViBuZWVkcyB0aGUgVk0gdXNlcmlkXG4iKTsKKwkJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gaXVjdl9yZWdpc3RlcigmYWZfaXVjdl9oYW5kbGVyLCAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSBwcm90b19yZWdpc3RlcigmaXVjdl9wcm90bywgMCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfaXVjdjsKKwllcnIgPSBzb2NrX3JlZ2lzdGVyKCZpdWN2X3NvY2tfZmFtaWx5X29wcyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcHJvdG87CisJcHJpbnRrKEtFUk5fSU5GTyAiQUZfSVVDViBsb3dsZXZlbCBkcml2ZXIgaW5pdGlhbGl6ZWRcbiIpOworCXJldHVybiAwOworCitvdXRfcHJvdG86CisJcHJvdG9fdW5yZWdpc3RlcigmaXVjdl9wcm90byk7CitvdXRfaXVjdjoKKwlpdWN2X3VucmVnaXN0ZXIoJmFmX2l1Y3ZfaGFuZGxlciwgMCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFmaXVjdl9leGl0KHZvaWQpCit7CisJc29ja191bnJlZ2lzdGVyKFBGX0lVQ1YpOworCXByb3RvX3VucmVnaXN0ZXIoJml1Y3ZfcHJvdG8pOworCWl1Y3ZfdW5yZWdpc3RlcigmYWZfaXVjdl9oYW5kbGVyLCAwKTsKKworCXByaW50ayhLRVJOX0lORk8gIkFGX0lVQ1YgbG93bGV2ZWwgZHJpdmVyIHVubG9hZGVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoYWZpdWN2X2luaXQpOworbW9kdWxlX2V4aXQoYWZpdWN2X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJKZW5uaWZlciBIdW50IDxqZW5odW50QHVzLmlibS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklVQ1YgU29ja2V0cyB2ZXIgIiBWRVJTSU9OKTsKK01PRFVMRV9WRVJTSU9OKFZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX0lVQ1YpOwpkaWZmIC0tZ2l0IGEvbmV0L2l1Y3YvaXVjdi5jIGIvbmV0L2l1Y3YvaXVjdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMTBkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXVjdi9pdWN2LmMKQEAgLTAsMCArMSwxNjE5IEBACisvKgorICogSVVDViBiYXNlIGluZnJhc3RydWN0dXJlLgorICoKKyAqIENvcHlyaWdodCAyMDAxLCAyMDA2IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqIEF1dGhvcihzKToKKyAqICAgIE9yaWdpbmFsIHNvdXJjZToKKyAqCUFsYW4gQWx0bWFyayAoQWxhbl9BbHRtYXJrQHVzLmlibS5jb20pCVNlcHQuIDIwMDAKKyAqCVhlbmlhIFRrYXRzY2hvdyAoeGVuaWFAdXMuaWJtLmNvbSkKKyAqICAgIDJHYiBhd2FyZW5lc3MgYW5kIGdlbmVyYWwgY2xlYW51cDoKKyAqCUZyaXR6IEVsZmVydCAoZWxmZXJ0QGRlLmlibS5jb20sIGZlbGZlcnRAbWlsbGVudXguY29tKQorICogICAgUmV3cml0dGVuIGZvciBhZl9pdWN2OgorICoJTWFydGluIFNjaHdpZGVmc2t5IDxzY2h3aWRlZnNreUBkZS5pYm0uY29tPgorICoKKyAqIERvY3VtZW50YXRpb24gdXNlZDoKKyAqICAgIFRoZSBvcmlnaW5hbCBzb3VyY2UKKyAqICAgIENQIFByb2dyYW1taW5nIFNlcnZpY2UsIElCTSBkb2N1bWVudCAjIFNDMjQtNTc2MAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPG5ldC9pdWN2L2l1Y3YuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zMzkwX2V4dC5oPgorI2luY2x1ZGUgPGFzbS9zMzkwX3JkZXYuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisKKy8qCisgKiBGTEFHUzoKKyAqIEFsbCBmbGFncyBhcmUgZGVmaW5lZCBpbiB0aGUgZmllbGQgSVBGTEFHUzEgb2YgZWFjaCBmdW5jdGlvbgorICogYW5kIGNhbiBiZSBmb3VuZCBpbiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcy4KKyAqIElQU1JDQ0xTIC0gSW5kaWNhdGVzIHlvdSBoYXZlIHNwZWNpZmllZCBhIHNvdXJjZSBjbGFzcy4KKyAqIElQVFJHQ0xTIC0gSW5kaWNhdGVzIHlvdSBoYXZlIHNwZWNpZmllZCBhIHRhcmdldCBjbGFzcy4KKyAqIElQRkdQSUQgIC0gSW5kaWNhdGVzIHlvdSBoYXZlIHNwZWNpZmllZCBhIHBhdGhpZC4KKyAqIElQRkdNSUQgIC0gSW5kaWNhdGVzIHlvdSBoYXZlIHNwZWNpZmllZCBhIG1lc3NhZ2UgSUQuCisgKiBJUE5PUlBZICAtIEluZGljYXRlcyBhIG9uZS13YXkgbWVzc2FnZS4gTm8gcmVwbHkgZXhwZWN0ZWQuCisgKiBJUEFMTCAgICAtIEluZGljYXRlcyB0aGF0IGFsbCBwYXRocyBhcmUgYWZmZWN0ZWQuCisgKi8KKyNkZWZpbmUgSVVDVl9JUFNSQ0NMUwkweDAxCisjZGVmaW5lIElVQ1ZfSVBUUkdDTFMJMHgwMQorI2RlZmluZSBJVUNWX0lQRkdQSUQJMHgwMgorI2RlZmluZSBJVUNWX0lQRkdNSUQJMHgwNAorI2RlZmluZSBJVUNWX0lQTk9SUFkJMHgxMAorI2RlZmluZSBJVUNWX0lQQUxMCTB4ODAKKworc3RhdGljIGludCBpdWN2X2J1c19tYXRjaCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYnVzX3R5cGUgaXVjdl9idXMgPSB7CisJLm5hbWUgPSAiaXVjdiIsCisJLm1hdGNoID0gaXVjdl9idXNfbWF0Y2gsCit9OworCitzdHJ1Y3QgZGV2aWNlICppdWN2X3Jvb3Q7CitzdGF0aWMgaW50IGl1Y3ZfYXZhaWxhYmxlOworCisvKiBHZW5lcmFsIElVQ1YgaW50ZXJydXB0IHN0cnVjdHVyZSAqLworc3RydWN0IGl1Y3ZfaXJxX2RhdGEgeworCXUxNiBpcHBhdGhpZDsKKwl1OCAgaXBmbGFnczE7CisJdTggIGlwdHlwZTsKKwl1MzIgcmVzMls4XTsKK307CisKK3N0cnVjdCBpdWN2X3dvcmsgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgaXVjdl9pcnFfZGF0YSBkYXRhOworfTsKKworc3RhdGljIExJU1RfSEVBRChpdWN2X3dvcmtfcXVldWUpOworc3RhdGljIERFRklORV9TUElOTE9DSyhpdWN2X3dvcmtfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqaXVjdl9pcnFfZGF0YTsKK3N0YXRpYyBjcHVtYXNrX3QgaXVjdl9idWZmZXJfY3B1bWFzayA9IENQVV9NQVNLX05PTkU7CitzdGF0aWMgY3B1bWFza190IGl1Y3ZfaXJxX2NwdW1hc2sgPSBDUFVfTUFTS19OT05FOworCitzdGF0aWMgdm9pZCBpdWN2X3Rhc2tsZXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBERUNMQVJFX1RBU0tMRVQoaXVjdl90YXNrbGV0LCBpdWN2X3Rhc2tsZXRfaGFuZGxlciwwKTsKKworZW51bSBpdWN2X2NvbW1hbmRfY29kZXMgeworCUlVQ1ZfUVVFUlkgPSAwLAorCUlVQ1ZfUkVUUklFVkVfQlVGRkVSID0gMiwKKwlJVUNWX1NFTkQgPSA0LAorCUlVQ1ZfUkVDRUlWRSA9IDUsCisJSVVDVl9SRVBMWSA9IDYsCisJSVVDVl9SRUpFQ1QgPSA4LAorCUlVQ1ZfUFVSR0UgPSA5LAorCUlVQ1ZfQUNDRVBUID0gMTAsCisJSVVDVl9DT05ORUNUID0gMTEsCisJSVVDVl9ERUNMQVJFX0JVRkZFUiA9IDEyLAorCUlVQ1ZfUVVJRVNDRSA9IDEzLAorCUlVQ1ZfUkVTVU1FID0gMTQsCisJSVVDVl9TRVZFUiA9IDE1LAorCUlVQ1ZfU0VUTUFTSyA9IDE2LAorfTsKKworLyoKKyAqIEVycm9yIG1lc3NhZ2VzIHRoYXQgYXJlIHVzZWQgd2l0aCB0aGUgaXVjdl9zZXZlciBmdW5jdGlvbi4gVGhleSBnZXQKKyAqIGNvbnZlcnRlZCB0byBFQkNESUMuCisgKi8KK3N0YXRpYyBjaGFyIGl1Y3ZfZXJyb3Jfbm9fbGlzdGVuZXJbMTZdID0gIk5PIExJU1RFTkVSIjsKK3N0YXRpYyBjaGFyIGl1Y3ZfZXJyb3Jfbm9fbWVtb3J5WzE2XSA9ICJOTyBNRU1PUlkiOworc3RhdGljIGNoYXIgaXVjdl9lcnJvcl9wYXRoaWRbMTZdID0gIklOVkFMSUQgUEFUSElEIjsKKworLyoKKyAqIGl1Y3ZfaGFuZGxlcl9saXN0OiBMaXN0IG9mIHJlZ2lzdGVyZWQgaGFuZGxlcnMuCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoaXVjdl9oYW5kbGVyX2xpc3QpOworCisvKgorICogaXVjdl9wYXRoX3RhYmxlOiBhbiBhcnJheSBvZiBpdWN2X3BhdGggc3RydWN0dXJlcy4KKyAqLworc3RhdGljIHN0cnVjdCBpdWN2X3BhdGggKippdWN2X3BhdGhfdGFibGU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpdWN2X21heF9wYXRoaWQ7CisKKy8qCisgKiBpdWN2X2xvY2s6IHNwaW5sb2NrIHByb3RlY3RpbmcgaXVjdl9oYW5kbGVyX2xpc3QgYW5kIGl1Y3ZfcGF0aGlkX3RhYmxlCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXVjdl90YWJsZV9sb2NrKTsKKworLyoKKyAqIGl1Y3ZfdGFza2xldF9jcHU6IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgdGhlIGNwdSBleGVjdXRpbmcgdGhlIHRhc2tsZXQuCisgKiBOZWVkZWQgZm9yIGl1Y3ZfcGF0aF9zZXZlciBjYWxsZWQgZnJvbSB0YXNrbGV0LgorICovCitzdGF0aWMgaW50IGl1Y3ZfdGFza2xldF9jcHUgPSAtMTsKKworLyoKKyAqIE11dGV4IGFuZCB3YWl0IHF1ZXVlIGZvciBpdWN2X3JlZ2lzdGVyL2l1Y3ZfdW5yZWdpc3Rlci4KKyAqLworc3RhdGljIERFRklORV9NVVRFWChpdWN2X3JlZ2lzdGVyX211dGV4KTsKKworLyoKKyAqIENvdW50ZXIgZm9yIG51bWJlciBvZiBub24tc21wIGNhcGFibGUgaGFuZGxlcnMuCisgKi8KK3N0YXRpYyBpbnQgaXVjdl9ub25zbXBfaGFuZGxlcjsKKworLyoKKyAqIElVQ1YgY29udHJvbCBkYXRhIHN0cnVjdHVyZS4gVXNlZCBieSBpdWN2X3BhdGhfYWNjZXB0LCBpdWN2X3BhdGhfY29ubmVjdCwKKyAqIGl1Y3ZfcGF0aF9xdWllc2NlIGFuZCBpdWN2X3BhdGhfc2V2ZXIuCisgKi8KK3N0cnVjdCBpdWN2X2NtZF9jb250cm9sIHsKKwl1MTYgaXBwYXRoaWQ7CisJdTggIGlwZmxhZ3MxOworCXU4ICBpcHJjb2RlOworCXUxNiBpcG1zZ2xpbTsKKwl1MTYgcmVzMTsKKwl1OCAgaXB2bWlkWzhdOworCXU4ICBpcHVzZXJbMTZdOworCXU4ICBpcHRhcmdldFs4XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCxhbGlnbmVkKDgpKSk7CisKKy8qCisgKiBEYXRhIGluIHBhcmFtZXRlciBsaXN0IGl1Y3Ygc3RydWN0dXJlLiBVc2VkIGJ5IGl1Y3ZfbWVzc2FnZV9zZW5kLAorICogaXVjdl9tZXNzYWdlX3NlbmQyd2F5IGFuZCBpdWN2X21lc3NhZ2VfcmVwbHkuCisgKi8KK3N0cnVjdCBpdWN2X2NtZF9kcGwgeworCXUxNiBpcHBhdGhpZDsKKwl1OCAgaXBmbGFnczE7CisJdTggIGlwcmNvZGU7CisJdTMyIGlwbXNnaWQ7CisJdTMyIGlwdHJnY2xzOworCXU4ICBpcHJtbXNnWzhdOworCXUzMiBpcHNyY2NsczsKKwl1MzIgaXBtc2d0YWc7CisJdTMyIGlwYmZhZHIyOworCXUzMiBpcGJmbG4yZjsKKwl1MzIgcmVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLGFsaWduZWQoOCkpKTsKKworLyoKKyAqIERhdGEgaW4gYnVmZmVyIGl1Y3Ygc3RydWN0dXJlLiBVc2VkIGJ5IGl1Y3ZfbWVzc2FnZV9yZWNlaXZlLAorICogaXVjdl9tZXNzYWdlX3JlamVjdCwgaXVjdl9tZXNzYWdlX3NlbmQsIGl1Y3ZfbWVzc2FnZV9zZW5kMndheQorICogYW5kIGl1Y3ZfZGVjbGFyZV9jcHUuCisgKi8KK3N0cnVjdCBpdWN2X2NtZF9kYiB7CisJdTE2IGlwcGF0aGlkOworCXU4ICBpcGZsYWdzMTsKKwl1OCAgaXByY29kZTsKKwl1MzIgaXBtc2dpZDsKKwl1MzIgaXB0cmdjbHM7CisJdTMyIGlwYmZhZHIxOworCXUzMiBpcGJmbG4xZjsKKwl1MzIgaXBzcmNjbHM7CisJdTMyIGlwbXNndGFnOworCXUzMiBpcGJmYWRyMjsKKwl1MzIgaXBiZmxuMmY7CisJdTMyIHJlczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCxhbGlnbmVkKDgpKSk7CisKKy8qCisgKiBQdXJnZSBtZXNzYWdlIGl1Y3Ygc3RydWN0dXJlLiBVc2VkIGJ5IGl1Y3ZfbWVzc2FnZV9wdXJnZS4KKyAqLworc3RydWN0IGl1Y3ZfY21kX3B1cmdlIHsKKwl1MTYgaXBwYXRoaWQ7CisJdTggIGlwZmxhZ3MxOworCXU4ICBpcHJjb2RlOworCXUzMiBpcG1zZ2lkOworCXU4ICBpcGF1ZGl0WzNdOworCXU4ICByZXMxWzVdOworCXUzMiByZXMyOworCXUzMiBpcHNyY2NsczsKKwl1MzIgaXBtc2d0YWc7CisJdTMyIHJlczNbM107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsYWxpZ25lZCg4KSkpOworCisvKgorICogU2V0IG1hc2sgaXVjdiBzdHJ1Y3R1cmUuIFVzZWQgYnkgaXVjdl9lbmFibGVfY3B1LgorICovCitzdHJ1Y3QgaXVjdl9jbWRfc2V0X21hc2sgeworCXU4ICBpcG1hc2s7CisJdTggIHJlczFbMl07CisJdTggIGlwcmNvZGU7CisJdTMyIHJlczJbOV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsYWxpZ25lZCg4KSkpOworCit1bmlvbiBpdWN2X3BhcmFtIHsKKwlzdHJ1Y3QgaXVjdl9jbWRfY29udHJvbCBjdHJsOworCXN0cnVjdCBpdWN2X2NtZF9kcGwgZHBsOworCXN0cnVjdCBpdWN2X2NtZF9kYiBkYjsKKwlzdHJ1Y3QgaXVjdl9jbWRfcHVyZ2UgcHVyZ2U7CisJc3RydWN0IGl1Y3ZfY21kX3NldF9tYXNrIHNldF9tYXNrOworfTsKKworLyoKKyAqIEFuY2hvciBmb3IgcGVyLWNwdSBJVUNWIGNvbW1hbmQgcGFyYW1ldGVyIGJsb2NrLgorICovCitzdGF0aWMgdW5pb24gaXVjdl9wYXJhbSAqaXVjdl9wYXJhbTsKKworLyoqCisgKiBpdWN2X2NhbGxfYjJmMAorICogQGNvZGU6IGlkZW50aWZpZXIgb2YgSVVDViBjYWxsIHRvIENQLgorICogQHBhcm06IHBvaW50ZXIgdG8gYSBzdHJ1Y3QgaXVjdl9wYXJtIGJsb2NrCisgKgorICogQ2FsbHMgQ1AgdG8gZXhlY3V0ZSBJVUNWIGNvbW1hbmRzLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgQ1AgSVVDViBjYWxsLgorICovCitzdGF0aWMgaW5saW5lIGludCBpdWN2X2NhbGxfYjJmMChpbnQgY29tbWFuZCwgdW5pb24gaXVjdl9wYXJhbSAqcGFybSkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzAgYXNtICgiMCIpOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMSBhc20gKCIxIik7CisJaW50IGNjb2RlOworCisJcmVnMCA9IGNvbW1hbmQ7CisJcmVnMSA9IHZpcnRfdG9fcGh5cyhwYXJtKTsKKwlhc20gdm9sYXRpbGUoCisJCSIJLmxvbmcgMHhiMmYwMTAwMFxuIgorCQkiCWlwbQklMFxuIgorCQkiCXNybAklMCwyOFxuIgorCQk6ICI9ZCIgKGNjb2RlKSwgIj1tIiAoKnBhcm0pLCAiK2QiIChyZWcwKSwgIithIiAocmVnMSkKKwkJOiAgIm0iICgqcGFybSkgOiAiY2MiKTsKKwlyZXR1cm4gKGNjb2RlID09IDEpID8gcGFybS0+Y3RybC5pcHJjb2RlIDogY2NvZGU7Cit9CisKKy8qKgorICogaXVjdl9xdWVyeV9tYXhjb25uCisgKgorICogRGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBtYXkgYmUgZXN0YWJsaXNoZWQuCisgKgorICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgb3IgLUVQRVJNIGlzIElVQ1YgaXMgbm90CisgKiBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQgaXVjdl9xdWVyeV9tYXhjb25uKHZvaWQpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWcwIGFzbSAoIjAiKTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzEgYXNtICgiMSIpOworCXZvaWQgKnBhcmFtOworCWludCBjY29kZTsKKworCXBhcmFtID0ga3phbGxvYyhzaXplb2YodW5pb24gaXVjdl9wYXJhbSksIEdGUF9LRVJORUx8R0ZQX0RNQSk7CisJaWYgKCFwYXJhbSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmVnMCA9IElVQ1ZfUVVFUlk7CisJcmVnMSA9ICh1bnNpZ25lZCBsb25nKSBwYXJhbTsKKwlhc20gdm9sYXRpbGUgKAorCQkiCS5sb25nCTB4YjJmMDEwMDBcbiIKKwkJIglpcG0JJTBcbiIKKwkJIglzcmwJJTAsMjhcbiIKKwkJOiAiPWQiIChjY29kZSksICIrZCIgKHJlZzApLCAiK2QiIChyZWcxKSA6IDogImNjIik7CisJaWYgKGNjb2RlID09IDApCisJCWl1Y3ZfbWF4X3BhdGhpZCA9IHJlZzA7CisJa2ZyZWUocGFyYW0pOworCXJldHVybiBjY29kZSA/IC1FUEVSTSA6IDA7Cit9CisKKy8qKgorICogaXVjdl9hbGxvd19jcHUKKyAqIEBkYXRhOiB1bnVzZWQKKyAqCisgKiBBbGxvdyBpdWN2IGludGVycnVwdHMgb24gdGhpcyBjcHUuCisgKi8KK3N0YXRpYyB2b2lkIGl1Y3ZfYWxsb3dfY3B1KHZvaWQgKmRhdGEpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bmlvbiBpdWN2X3BhcmFtICpwYXJtOworCisJLyoKKwkgKiBFbmFibGUgYWxsIGl1Y3YgaW50ZXJydXB0cy4KKwkgKiBpcG1hc2sgY29udGFpbnMgYml0cyBmb3IgdGhlIGRpZmZlcmVudCBpbnRlcnJ1cHRzCisJICoJMHg4MCAtIEZsYWcgdG8gYWxsb3cgbm9ucHJpb3JpdHkgbWVzc2FnZSBwZW5kaW5nIGludGVycnVwdHMKKwkgKgkweDQwIC0gRmxhZyB0byBhbGxvdyBwcmlvcml0eSBtZXNzYWdlIHBlbmRpbmcgaW50ZXJydXB0cworCSAqCTB4MjAgLSBGbGFnIHRvIGFsbG93IG5vbnByaW9yaXR5IG1lc3NhZ2UgY29tcGxldGlvbiBpbnRlcnJ1cHRzCisJICoJMHgxMCAtIEZsYWcgdG8gYWxsb3cgcHJpb3JpdHkgbWVzc2FnZSBjb21wbGV0aW9uIGludGVycnVwdHMKKwkgKgkweDA4IC0gRmxhZyB0byBhbGxvdyBJVUNWIGNvbnRyb2wgaW50ZXJydXB0cworCSAqLworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CisJcGFybS0+c2V0X21hc2suaXBtYXNrID0gMHhmODsKKwlpdWN2X2NhbGxfYjJmMChJVUNWX1NFVE1BU0ssIHBhcm0pOworCisJLyogU2V0IGluZGljYXRpb24gdGhhdCBpdWN2IGludGVycnVwdHMgYXJlIGFsbG93ZWQgZm9yIHRoaXMgY3B1LiAqLworCWNwdV9zZXQoY3B1LCBpdWN2X2lycV9jcHVtYXNrKTsKK30KKworLyoqCisgKiBpdWN2X2Jsb2NrX2NwdQorICogQGRhdGE6IHVudXNlZAorICoKKyAqIEJsb2NrIGl1Y3YgaW50ZXJydXB0cyBvbiB0aGlzIGNwdS4KKyAqLworc3RhdGljIHZvaWQgaXVjdl9ibG9ja19jcHUodm9pZCAqZGF0YSkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm07CisKKwkvKiBEaXNhYmxlIGFsbCBpdWN2IGludGVycnVwdHMuICovCisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwltZW1zZXQocGFybSwgMCwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pKTsKKwlpdWN2X2NhbGxfYjJmMChJVUNWX1NFVE1BU0ssIHBhcm0pOworCisJLyogQ2xlYXIgaW5kaWNhdGlvbiB0aGF0IGl1Y3YgaW50ZXJydXB0cyBhcmUgYWxsb3dlZCBmb3IgdGhpcyBjcHUuICovCisJY3B1X2NsZWFyKGNwdSwgaXVjdl9pcnFfY3B1bWFzayk7Cit9CisKKy8qKgorICogaXVjdl9kZWNsYXJlX2NwdQorICogQGRhdGE6IHVudXNlZAorICoKKyAqIERlY2xhcmUgYSBpbnRlcnVwdCBidWZmZXIgb24gdGhpcyBjcHUuCisgKi8KK3N0YXRpYyB2b2lkIGl1Y3ZfZGVjbGFyZV9jcHUodm9pZCAqZGF0YSkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm07CisJaW50IHJjOworCisJaWYgKGNwdV9pc3NldChjcHUsIGl1Y3ZfYnVmZmVyX2NwdW1hc2spKQorCQlyZXR1cm47CisKKwkvKiBEZWNsYXJlIGludGVycnVwdCBidWZmZXIuICovCisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgY3B1KTsKKwltZW1zZXQocGFybSwgMCwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pKTsKKwlwYXJtLT5kYi5pcGJmYWRyMSA9IHZpcnRfdG9fcGh5cyhwZXJjcHVfcHRyKGl1Y3ZfaXJxX2RhdGEsIGNwdSkpOworCXJjID0gaXVjdl9jYWxsX2IyZjAoSVVDVl9ERUNMQVJFX0JVRkZFUiwgcGFybSk7CisJaWYgKHJjKSB7CisJCWNoYXIgKmVyciA9ICJVbmtub3duIjsKKwkJc3dpdGNoKHJjKSB7CisJCWNhc2UgMHgwMzoKKwkJCWVyciA9ICJEaXJlY3RvcnkgZXJyb3IiOworCQkJYnJlYWs7CisJCWNhc2UgMHgwYToKKwkJCWVyciA9ICJJbnZhbGlkIGxlbmd0aCI7CisJCQlicmVhazsKKwkJY2FzZSAweDEzOgorCQkJZXJyID0gIkJ1ZmZlciBhbHJlYWR5IGV4aXN0cyI7CisJCQlicmVhazsKKwkJY2FzZSAweDNlOgorCQkJZXJyID0gIkJ1ZmZlciBvdmVybGFwIjsKKwkJCWJyZWFrOworCQljYXNlIDB4NWM6CisJCQllcnIgPSAiUGFnaW5nIG9yIHN0b3JhZ2UgZXJyb3IiOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXVjdl9yZWdpc3RlcjogaXVjdl9kZWNsYXJlX2J1ZmZlciAiCisJCSAgICAgICAib24gY3B1ICVpIHJldHVybmVkIGVycm9yIDB4JTAyeCAoJXMpXG4iLCBjcHUsIHJjLCBlcnIpOworCQlyZXR1cm47CisJfQorCisJLyogU2V0IGluZGljYXRpb24gdGhhdCBhbiBpdWN2IGJ1ZmZlciBleGlzdHMgZm9yIHRoaXMgY3B1LiAqLworCWNwdV9zZXQoY3B1LCBpdWN2X2J1ZmZlcl9jcHVtYXNrKTsKKworCWlmIChpdWN2X25vbnNtcF9oYW5kbGVyID09IDAgfHwgY3B1c19lbXB0eShpdWN2X2lycV9jcHVtYXNrKSkKKwkJLyogRW5hYmxlIGl1Y3YgaW50ZXJydXB0cyBvbiB0aGlzIGNwdS4gKi8KKwkJaXVjdl9hbGxvd19jcHUoTlVMTCk7CisJZWxzZQorCQkvKiBEaXNhYmxlIGl1Y3YgaW50ZXJydXB0cyBvbiB0aGlzIGNwdS4gKi8KKwkJaXVjdl9ibG9ja19jcHUoTlVMTCk7Cit9CisKKy8qKgorICogaXVjdl9yZXRyaWV2ZV9jcHUKKyAqIEBkYXRhOiB1bnVzZWQKKyAqCisgKiBSZXRyaWV2ZSBpbnRlcnJ1cHQgYnVmZmVyIG9uIHRoaXMgY3B1LgorICovCitzdGF0aWMgdm9pZCBpdWN2X3JldHJpZXZlX2NwdSh2b2lkICpkYXRhKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKworCWlmICghY3B1X2lzc2V0KGNwdSwgaXVjdl9idWZmZXJfY3B1bWFzaykpCisJCXJldHVybjsKKworCS8qIEJsb2NrIGl1Y3YgaW50ZXJydXB0cy4gKi8KKwlpdWN2X2Jsb2NrX2NwdShOVUxMKTsKKworCS8qIFJldHJpZXZlIGludGVycnVwdCBidWZmZXIuICovCisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgY3B1KTsKKwlpdWN2X2NhbGxfYjJmMChJVUNWX1JFVFJJRVZFX0JVRkZFUiwgcGFybSk7CisKKwkvKiBDbGVhciBpbmRpY2F0aW9uIHRoYXQgYW4gaXVjdiBidWZmZXIgZXhpc3RzIGZvciB0aGlzIGNwdS4gKi8KKwljcHVfY2xlYXIoY3B1LCBpdWN2X2J1ZmZlcl9jcHVtYXNrKTsKK30KKworLyoqCisgKiBpdWN2X3NldG1hc2tfc21wCisgKgorICogQWxsb3cgaXVjdiBpbnRlcnJ1cHRzIG9uIGFsbCBjcHVzLgorICovCitzdGF0aWMgdm9pZCBpdWN2X3NldG1hc2tfbXAodm9pZCkKK3sKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCS8qIEVuYWJsZSBhbGwgY3B1cyB3aXRoIGEgZGVjbGFyZWQgYnVmZmVyLiAqLworCQlpZiAoY3B1X2lzc2V0KGNwdSwgaXVjdl9idWZmZXJfY3B1bWFzaykgJiYKKwkJICAgICFjcHVfaXNzZXQoY3B1LCBpdWN2X2lycV9jcHVtYXNrKSkKKwkJCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfYWxsb3dfY3B1LCBOVUxMLCAwLCAxLCBjcHUpOworfQorCisvKioKKyAqIGl1Y3Zfc2V0bWFza191cAorICoKKyAqIEFsbG93IGl1Y3YgaW50ZXJydXB0cyBvbiBhIHNpbmdsZSBjcHVzLgorICovCitzdGF0aWMgdm9pZCBpdWN2X3NldG1hc2tfdXAodm9pZCkKK3sKKwljcHVtYXNrX3QgY3B1bWFzazsKKwlpbnQgY3B1OworCisJLyogRGlzYWJsZSBhbGwgY3B1IGJ1dCB0aGUgZmlyc3QgaW4gY3B1X2lycV9jcHVtYXNrLiAqLworCWNwdW1hc2sgPSBpdWN2X2lycV9jcHVtYXNrOworCWNwdV9jbGVhcihmaXJzdF9jcHUoaXVjdl9pcnFfY3B1bWFzayksIGNwdW1hc2spOworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgY3B1bWFzaykKKwkJc21wX2NhbGxfZnVuY3Rpb25fb24oaXVjdl9ibG9ja19jcHUsIE5VTEwsIDAsIDEsIGNwdSk7Cit9CisKKy8qKgorICogaXVjdl9lbmFibGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIGl1Y3YgcmVhZHkgZm9yIHVzZS4gSXQgYWxsb2NhdGVzIHRoZSBwYXRoaWQKKyAqIHRhYmxlLCBkZWNsYXJlcyBhbiBpdWN2IGludGVycnVwdCBidWZmZXIgYW5kIGVuYWJsZXMgdGhlIGl1Y3YKKyAqIGludGVycnVwdHMuIENhbGxlZCB3aGVuIHRoZSBmaXJzdCB1c2VyIGhhcyByZWdpc3RlcmVkIGFuIGl1Y3YKKyAqIGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpbnQgaXVjdl9lbmFibGUodm9pZCkKK3sKKwlzaXplX3QgYWxsb2Nfc2l6ZTsKKwlpbnQgY3B1LCByYzsKKworCXJjID0gLUVOT01FTTsKKwlhbGxvY19zaXplID0gaXVjdl9tYXhfcGF0aGlkICogc2l6ZW9mKHN0cnVjdCBpdWN2X3BhdGgpOworCWl1Y3ZfcGF0aF90YWJsZSA9IGt6YWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpdWN2X3BhdGhfdGFibGUpCisJCWdvdG8gb3V0OworCS8qIERlY2xhcmUgcGVyIGNwdSBidWZmZXJzLiAqLworCXJjID0gLUVJTzsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJc21wX2NhbGxfZnVuY3Rpb25fb24oaXVjdl9kZWNsYXJlX2NwdSwgTlVMTCwgMCwgMSwgY3B1KTsKKwlpZiAoY3B1c19lbXB0eShpdWN2X2J1ZmZlcl9jcHVtYXNrKSkKKwkJLyogTm8gY3B1IGNvdWxkIGRlY2xhcmUgYW4gaXVjdiBidWZmZXIuICovCisJCWdvdG8gb3V0X3BhdGg7CisJcmV0dXJuIDA7CisKK291dF9wYXRoOgorCWtmcmVlKGl1Y3ZfcGF0aF90YWJsZSk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGl1Y3ZfZGlzYWJsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2h1dHMgZG93biBpdWN2LiBJdCBkaXNhYmxlcyBpdWN2IGludGVycnVwdHMsIHJldHJpZXZlcworICogdGhlIGl1Y3YgaW50ZXJydXB0IGJ1ZmZlciBhbmQgZnJlZXMgdGhlIHBhdGhpZCB0YWJsZS4gQ2FsbGVkIGFmdGVyIHRoZQorICogbGFzdCB1c2VyIHVucmVnaXN0ZXIgaXRzIGl1Y3YgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgaXVjdl9kaXNhYmxlKHZvaWQpCit7CisJb25fZWFjaF9jcHUoaXVjdl9yZXRyaWV2ZV9jcHUsIE5VTEwsIDAsIDEpOworCWtmcmVlKGl1Y3ZfcGF0aF90YWJsZSk7Cit9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBpbnQgX19jcHVpbml0IGl1Y3ZfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwljcHVtYXNrX3QgY3B1bWFzazsKKwlsb25nIGNwdSA9IChsb25nKSBoY3B1OworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9VUF9QUkVQQVJFOgorCQlpZiAoIXBlcmNwdV9wb3B1bGF0ZShpdWN2X2lycV9kYXRhLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpdWN2X2lycV9kYXRhKSwKKwkJCQkgICAgIEdGUF9LRVJORUx8R0ZQX0RNQSwgY3B1KSkKKwkJCXJldHVybiBOT1RJRllfQkFEOworCQlpZiAoIXBlcmNwdV9wb3B1bGF0ZShpdWN2X3BhcmFtLCBzaXplb2YodW5pb24gaXVjdl9wYXJhbSksCisJCQkJICAgICBHRlBfS0VSTkVMfEdGUF9ETUEsIGNwdSkpIHsKKwkJCXBlcmNwdV9kZXBvcHVsYXRlKGl1Y3ZfaXJxX2RhdGEsIGNwdSk7CisJCQlyZXR1cm4gTk9USUZZX0JBRDsKKwkJfQorCQlicmVhazsKKwljYXNlIENQVV9VUF9DQU5DRUxFRDoKKwljYXNlIENQVV9ERUFEOgorCQlwZXJjcHVfZGVwb3B1bGF0ZShpdWN2X3BhcmFtLCBjcHUpOworCQlwZXJjcHVfZGVwb3B1bGF0ZShpdWN2X2lycV9kYXRhLCBjcHUpOworCQlicmVhazsKKwljYXNlIENQVV9PTkxJTkU6CisJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CisJCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfZGVjbGFyZV9jcHUsIE5VTEwsIDAsIDEsIGNwdSk7CisJCWJyZWFrOworCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKKwkJY3B1bWFzayA9IGl1Y3ZfYnVmZmVyX2NwdW1hc2s7CisJCWNwdV9jbGVhcihjcHUsIGNwdW1hc2spOworCQlpZiAoY3B1c19lbXB0eShjcHVtYXNrKSkKKwkJCS8qIENhbid0IG9mZmxpbmUgbGFzdCBJVUNWIGVuYWJsZWQgY3B1LiAqLworCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisJCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfcmV0cmlldmVfY3B1LCBOVUxMLCAwLCAxLCBjcHUpOworCQlpZiAoY3B1c19lbXB0eShpdWN2X2lycV9jcHVtYXNrKSkKKwkJCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfYWxsb3dfY3B1LCBOVUxMLCAwLCAxLAorCQkJCQkgICAgIGZpcnN0X2NwdShpdWN2X2J1ZmZlcl9jcHVtYXNrKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGl1Y3ZfY3B1X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gaXVjdl9jcHVfbm90aWZ5LAorfTsKKyNlbmRpZgorCisvKioKKyAqIGl1Y3Zfc2V2ZXJfcGF0aGlkCisgKiBAcGF0aGlkOiBwYXRoIGlkZW50aWZpY2F0aW9uIG51bWJlci4KKyAqIEB1c2VyZGF0YTogMTYtYnl0ZXMgb2YgdXNlciBkYXRhLgorICoKKyAqIFNldmVyIGFuIGl1Y3YgcGF0aCB0byBmcmVlIHVwIHRoZSBwYXRoaWQuIFVzZWQgaW50ZXJuYWxseS4KKyAqLworc3RhdGljIGludCBpdWN2X3NldmVyX3BhdGhpZCh1MTYgcGF0aGlkLCB1OCB1c2VyZGF0YVsxNl0pCit7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CisJaWYgKHVzZXJkYXRhKQorCQltZW1jcHkocGFybS0+Y3RybC5pcHVzZXIsIHVzZXJkYXRhLCBzaXplb2YocGFybS0+Y3RybC5pcHVzZXIpKTsKKwlwYXJtLT5jdHJsLmlwcGF0aGlkID0gcGF0aGlkOworCXJldHVybiBpdWN2X2NhbGxfYjJmMChJVUNWX1NFVkVSLCBwYXJtKTsKK30KKworLyoqCisgKiBfX2l1Y3ZfY2xlYW51cF9wYXRoaWQKKyAqIEBkdW1teTogdW51c2VkIGR1bW15IGFyZ3VtZW50CisgKgorICogTm9wIGZ1bmN0aW9uIGNhbGxlZCB2aWEgc21wX2NhbGxfZnVuY3Rpb24gdG8gZm9yY2Ugd29yayBpdGVtcyBmcm9tCisgKiBwZW5kaW5nIGV4dGVybmFsIGl1Y3YgaW50ZXJydXB0cyB0byB0aGUgd29yayBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgX19pdWN2X2NsZWFudXBfcGF0aGlkKHZvaWQgKmR1bW15KQoreworfQorCisvKioKKyAqIGl1Y3ZfY2xlYW51cF9wYXRoaWQKKyAqIEBwYXRoaWQ6IDE2IGJpdCBwYXRoaWQKKyAqCisgKiBGdW5jdGlvbiBjYWxsZWQgYWZ0ZXIgYSBwYXRoIGhhcyBiZWVuIHNldmVyZWQgdG8gZmluZCBhbGwgcmVtYWluaW5nCisgKiB3b3JrIGl0ZW1zIGZvciB0aGUgbm93IHN0YWxlIHBhdGhpZC4gVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZQorICogaXVjdl90YWJsZV9sb2NrLgorICovCitzdGF0aWMgdm9pZCBpdWN2X2NsZWFudXBfcGF0aGlkKHUxNiBwYXRoaWQpCit7CisJc3RydWN0IGl1Y3Zfd29yayAqcCwgKm47CisKKwkvKgorCSAqIFBhdGggaXMgc2V2ZXJlZCwgdGhlIHBhdGhpZCBjYW4gYmUgcmV1c2VkIGltbWVkaWF0bHkgb24KKwkgKiBhIGl1Y3YgY29ubmVjdCBvciBhIGNvbm5lY3Rpb24gcGVuZGluZyBpbnRlcnJ1cHQuCisJICogaXVjdl9wYXRoX2Nvbm5lY3QgYW5kIGNvbm5lY3Rpb24gcGVuZGluZyBpbnRlcnJ1cHQgd2lsbAorCSAqIHdhaXQgdW50aWwgdGhlIGl1Y3ZfdGFibGVfbG9jayBpcyByZWxlYXNlZCBiZWZvcmUgdGhlCisJICogcmVjeWNsZWQgcGF0aGlkIGVudGVycyB0aGUgc3lzdGVtLgorCSAqIEZvcmNlIHJlbWFpbmluZyBpbnRlcnJ1cHRzIHRvIHRoZSB3b3JrIHF1ZXVlLCB0aGVuCisJICogc2NhbiB0aGUgd29yayBxdWV1ZSBmb3IgaXRlbXMgb2YgdGhpcyBwYXRoLgorCSAqLworCXNtcF9jYWxsX2Z1bmN0aW9uKF9faXVjdl9jbGVhbnVwX3BhdGhpZCwgTlVMTCwgMCwgMSk7CisJc3Bpbl9sb2NrX2lycSgmaXVjdl93b3JrX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmaXVjdl93b3JrX3F1ZXVlLCBsaXN0KSB7CisJCS8qIFJlbW92ZSB3b3JrIGl0ZW1zIGZvciBwYXRoaWQgZXhjZXB0IGNvbm5lY3Rpb24gcGVuZGluZyAqLworCQlpZiAocC0+ZGF0YS5pcHBhdGhpZCA9PSBwYXRoaWQgJiYgcC0+ZGF0YS5pcHR5cGUgIT0gMHgwMSkgeworCQkJbGlzdF9kZWwoJnAtPmxpc3QpOworCQkJa2ZyZWUocCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZpdWN2X3dvcmtfbG9jayk7Cit9CisKKy8qKgorICogaXVjdl9yZWdpc3RlcjoKKyAqIEBoYW5kbGVyOiBhZGRyZXNzIG9mIGl1Y3YgaGFuZGxlciBzdHJ1Y3R1cmUKKyAqIEBzbXA6ICE9IDAgaW5kaWNhdGVzIHRoYXQgdGhlIGhhbmRsZXIgY2FuIGRlYWwgd2l0aCBvdXQgb2Ygb3JkZXIgbWVzc2FnZXMKKyAqCisgKiBSZWdpc3RlcnMgYSBkcml2ZXIgd2l0aCBJVUNWLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRU5PTUVNIGlmIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIHBhdGhpZAorICogdGFibGUgZmFpbGVkLCBvciAtRUlPIGlmIElVQ1ZfREVDTEFSRV9CVUZGRVIgZmFpbGVkIG9uIGFsbCBjcHVzLgorICovCitpbnQgaXVjdl9yZWdpc3RlcihzdHJ1Y3QgaXVjdl9oYW5kbGVyICpoYW5kbGVyLCBpbnQgc21wKQoreworCWludCByYzsKKworCWlmICghaXVjdl9hdmFpbGFibGUpCisJCXJldHVybiAtRU5PU1lTOworCW11dGV4X2xvY2soJml1Y3ZfcmVnaXN0ZXJfbXV0ZXgpOworCWlmICghc21wKQorCQlpdWN2X25vbnNtcF9oYW5kbGVyKys7CisJaWYgKGxpc3RfZW1wdHkoJml1Y3ZfaGFuZGxlcl9saXN0KSkgeworCQlyYyA9IGl1Y3ZfZW5hYmxlKCk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0X211dGV4OworCX0gZWxzZSBpZiAoIXNtcCAmJiBpdWN2X25vbnNtcF9oYW5kbGVyID09IDEpCisJCWl1Y3Zfc2V0bWFza191cCgpOworCUlOSVRfTElTVF9IRUFEKCZoYW5kbGVyLT5wYXRocyk7CisKKwlzcGluX2xvY2tfaXJxKCZpdWN2X3RhYmxlX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmhhbmRsZXItPmxpc3QsICZpdWN2X2hhbmRsZXJfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZpdWN2X3RhYmxlX2xvY2spOworCXJjID0gMDsKK291dF9tdXRleDoKKwltdXRleF91bmxvY2soJml1Y3ZfcmVnaXN0ZXJfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X3VucmVnaXN0ZXIKKyAqIEBoYW5kbGVyOiAgYWRkcmVzcyBvZiBpdWN2IGhhbmRsZXIgc3RydWN0dXJlCisgKiBAc21wOiAhPSAwIGluZGljYXRlcyB0aGF0IHRoZSBoYW5kbGVyIGNhbiBkZWFsIHdpdGggb3V0IG9mIG9yZGVyIG1lc3NhZ2VzCisgKgorICogVW5yZWdpc3RlciBkcml2ZXIgZnJvbSBJVUNWLgorICovCit2b2lkIGl1Y3ZfdW5yZWdpc3RlcihzdHJ1Y3QgaXVjdl9oYW5kbGVyICpoYW5kbGVyLCBpbnQgc21wKQoreworCXN0cnVjdCBpdWN2X3BhdGggKnAsICpuOworCisJbXV0ZXhfbG9jaygmaXVjdl9yZWdpc3Rlcl9tdXRleCk7CisJc3Bpbl9sb2NrX2JoKCZpdWN2X3RhYmxlX2xvY2spOworCS8qIFJlbW92ZSBoYW5kbGVyIGZyb20gdGhlIGl1Y3ZfaGFuZGxlcl9saXN0LiAqLworCWxpc3RfZGVsX2luaXQoJmhhbmRsZXItPmxpc3QpOworCS8qIFNldmVyIGFsbCBwYXRoaWRzIHN0aWxsIHJlZmVyaW5nIHRvIHRoZSBoYW5kbGVyLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmaGFuZGxlci0+cGF0aHMsIGxpc3QpIHsKKwkJaXVjdl9zZXZlcl9wYXRoaWQocC0+cGF0aGlkLCBOVUxMKTsKKwkJaXVjdl9wYXRoX3RhYmxlW3AtPnBhdGhpZF0gPSBOVUxMOworCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCWl1Y3ZfY2xlYW51cF9wYXRoaWQocC0+cGF0aGlkKTsKKwkJaXVjdl9wYXRoX2ZyZWUocCk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZpdWN2X3RhYmxlX2xvY2spOworCWlmICghc21wKQorCQlpdWN2X25vbnNtcF9oYW5kbGVyLS07CisJaWYgKGxpc3RfZW1wdHkoJml1Y3ZfaGFuZGxlcl9saXN0KSkKKwkJaXVjdl9kaXNhYmxlKCk7CisJZWxzZSBpZiAoIXNtcCAmJiBpdWN2X25vbnNtcF9oYW5kbGVyID09IDApCisJCWl1Y3Zfc2V0bWFza19tcCgpOworCW11dGV4X3VubG9jaygmaXVjdl9yZWdpc3Rlcl9tdXRleCk7Cit9CisKKy8qKgorICogaXVjdl9wYXRoX2FjY2VwdAorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQGhhbmRsZXI6IGFkZHJlc3Mgb2YgaXVjdiBoYW5kbGVyIHN0cnVjdHVyZQorICogQHVzZXJkYXRhOiAxNiBieXRlcyBvZiBkYXRhIHJlZmxlY3RlZCB0byB0aGUgY29tbXVuaWNhdGlvbiBwYXJ0bmVyCisgKiBAcHJpdmF0ZTogcHJpdmF0ZSBkYXRhIHBhc3NlZCB0byBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIHRoaXMgcGF0aAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaXNzdWVkIGFmdGVyIHRoZSB1c2VyIHJlY2VpdmVkIGEgY29ubmVjdGlvbiBwZW5kaW5nCisgKiBleHRlcm5hbCBpbnRlcnJ1cHQgYW5kIG5vdyB3aXNoZXMgdG8gY29tcGxldGUgdGhlIElVQ1YgY29tbXVuaWNhdGlvbiBwYXRoLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9wYXRoX2FjY2VwdChzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9oYW5kbGVyICpoYW5kbGVyLAorCQkgICAgIHU4IHVzZXJkYXRhWzE2XSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwl1bmlvbiBpdWN2X3BhcmFtICpwYXJtOworCWludCByYzsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkvKiBQcmVwYXJlIHBhcmFtZXRlciBibG9jay4gKi8KKwlwYXJtID0gcGVyY3B1X3B0cihpdWN2X3BhcmFtLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCW1lbXNldChwYXJtLCAwLCBzaXplb2YodW5pb24gaXVjdl9wYXJhbSkpOworCXBhcm0tPmN0cmwuaXBwYXRoaWQgPSBwYXRoLT5wYXRoaWQ7CisJcGFybS0+Y3RybC5pcG1zZ2xpbSA9IHBhdGgtPm1zZ2xpbTsKKwlpZiAodXNlcmRhdGEpCisJCW1lbWNweShwYXJtLT5jdHJsLmlwdXNlciwgdXNlcmRhdGEsIHNpemVvZihwYXJtLT5jdHJsLmlwdXNlcikpOworCXBhcm0tPmN0cmwuaXBmbGFnczEgPSBwYXRoLT5mbGFnczsKKworCXJjID0gaXVjdl9jYWxsX2IyZjAoSVVDVl9BQ0NFUFQsIHBhcm0pOworCWlmICghcmMpIHsKKwkJcGF0aC0+cHJpdmF0ZSA9IHByaXZhdGU7CisJCXBhdGgtPm1zZ2xpbSA9IHBhcm0tPmN0cmwuaXBtc2dsaW07CisJCXBhdGgtPmZsYWdzID0gcGFybS0+Y3RybC5pcGZsYWdzMTsKKwl9CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9jb25uZWN0CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAaGFuZGxlcjogYWRkcmVzcyBvZiBpdWN2IGhhbmRsZXIgc3RydWN0dXJlCisgKiBAdXNlcmlkOiA4LWJ5dGUgdXNlciBpZGVudGlmaWNhdGlvbgorICogQHN5c3RlbTogOC1ieXRlIHRhcmdldCBzeXN0ZW0gaWRlbnRpZmljYXRpb24KKyAqIEB1c2VyZGF0YTogMTYgYnl0ZXMgb2YgZGF0YSByZWZsZWN0ZWQgdG8gdGhlIGNvbW11bmljYXRpb24gcGFydG5lcgorICogQHByaXZhdGU6IHByaXZhdGUgZGF0YSBwYXNzZWQgdG8gaW50ZXJydXB0IGhhbmRsZXJzIGZvciB0aGlzIHBhdGgKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVzdGFibGlzaGVzIGFuIElVQ1YgcGF0aC4gQWx0aG91Z2ggdGhlIGNvbm5lY3QgbWF5IGNvbXBsZXRlCisgKiBzdWNjZXNzZnVsbHksIHlvdSBhcmUgbm90IGFibGUgdG8gdXNlIHRoZSBwYXRoIHVudGlsIHlvdSByZWNlaXZlIGFuIElVQ1YKKyAqIENvbm5lY3Rpb24gQ29tcGxldGUgZXh0ZXJuYWwgaW50ZXJydXB0LgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9wYXRoX2Nvbm5lY3Qoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfaGFuZGxlciAqaGFuZGxlciwKKwkJICAgICAgdTggdXNlcmlkWzhdLCB1OCBzeXN0ZW1bOF0sIHU4IHVzZXJkYXRhWzE2XSwKKwkJICAgICAgdm9pZCAqcHJpdmF0ZSkKK3sKKwl1bmlvbiBpdWN2X3BhcmFtICpwYXJtOworCWludCByYzsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmIChpdWN2X3Rhc2tsZXRfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJc3Bpbl9sb2NrX2JoKCZpdWN2X3RhYmxlX2xvY2spOworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CisJcGFybS0+Y3RybC5pcG1zZ2xpbSA9IHBhdGgtPm1zZ2xpbTsKKwlwYXJtLT5jdHJsLmlwZmxhZ3MxID0gcGF0aC0+ZmxhZ3M7CisJaWYgKHVzZXJpZCkgeworCQltZW1jcHkocGFybS0+Y3RybC5pcHZtaWQsIHVzZXJpZCwgc2l6ZW9mKHBhcm0tPmN0cmwuaXB2bWlkKSk7CisJCUFTQ0VCQyhwYXJtLT5jdHJsLmlwdm1pZCwgc2l6ZW9mKHBhcm0tPmN0cmwuaXB2bWlkKSk7CisJCUVCQ19UT1VQUEVSKHBhcm0tPmN0cmwuaXB2bWlkLCBzaXplb2YocGFybS0+Y3RybC5pcHZtaWQpKTsKKwl9CisJaWYgKHN5c3RlbSkgeworCQltZW1jcHkocGFybS0+Y3RybC5pcHRhcmdldCwgc3lzdGVtLAorCQkgICAgICAgc2l6ZW9mKHBhcm0tPmN0cmwuaXB0YXJnZXQpKTsKKwkJQVNDRUJDKHBhcm0tPmN0cmwuaXB0YXJnZXQsIHNpemVvZihwYXJtLT5jdHJsLmlwdGFyZ2V0KSk7CisJCUVCQ19UT1VQUEVSKHBhcm0tPmN0cmwuaXB0YXJnZXQsIHNpemVvZihwYXJtLT5jdHJsLmlwdGFyZ2V0KSk7CisJfQorCWlmICh1c2VyZGF0YSkKKwkJbWVtY3B5KHBhcm0tPmN0cmwuaXB1c2VyLCB1c2VyZGF0YSwgc2l6ZW9mKHBhcm0tPmN0cmwuaXB1c2VyKSk7CisKKwlyYyA9IGl1Y3ZfY2FsbF9iMmYwKElVQ1ZfQ09OTkVDVCwgcGFybSk7CisJaWYgKCFyYykgeworCQlpZiAocGFybS0+Y3RybC5pcHBhdGhpZCA8IGl1Y3ZfbWF4X3BhdGhpZCkgeworCQkJcGF0aC0+cGF0aGlkID0gcGFybS0+Y3RybC5pcHBhdGhpZDsKKwkJCXBhdGgtPm1zZ2xpbSA9IHBhcm0tPmN0cmwuaXBtc2dsaW07CisJCQlwYXRoLT5mbGFncyA9IHBhcm0tPmN0cmwuaXBmbGFnczE7CisJCQlwYXRoLT5oYW5kbGVyID0gaGFuZGxlcjsKKwkJCXBhdGgtPnByaXZhdGUgPSBwcml2YXRlOworCQkJbGlzdF9hZGRfdGFpbCgmcGF0aC0+bGlzdCwgJmhhbmRsZXItPnBhdGhzKTsKKwkJCWl1Y3ZfcGF0aF90YWJsZVtwYXRoLT5wYXRoaWRdID0gcGF0aDsKKwkJfSBlbHNlIHsKKwkJCWl1Y3Zfc2V2ZXJfcGF0aGlkKHBhcm0tPmN0cmwuaXBwYXRoaWQsCisJCQkJCSAgaXVjdl9lcnJvcl9wYXRoaWQpOworCQkJcmMgPSAtRUlPOworCQl9CisJfQorCWlmIChpdWN2X3Rhc2tsZXRfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJc3Bpbl91bmxvY2tfYmgoJml1Y3ZfdGFibGVfbG9jayk7CisJcHJlZW1wdF9lbmFibGUoKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXVjdl9wYXRoX3F1aWVzY2U6CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAdXNlcmRhdGE6IDE2IGJ5dGVzIG9mIGRhdGEgcmVmbGVjdGVkIHRvIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRlbXBvcmFyaWx5IHN1c3BlbmRzIGluY29taW5nIG1lc3NhZ2VzIG9uIGFuIElVQ1YgcGF0aC4KKyAqIFlvdSBjYW4gbGF0ZXIgcmVhY3RpdmF0ZSB0aGUgcGF0aCBieSBpbnZva2luZyB0aGUgaXVjdl9yZXN1bWUgZnVuY3Rpb24uCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfcGF0aF9xdWllc2NlKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IHVzZXJkYXRhWzE2XSkKK3sKKwl1bmlvbiBpdWN2X3BhcmFtICpwYXJtOworCWludCByYzsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlwYXJtID0gcGVyY3B1X3B0cihpdWN2X3BhcmFtLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCW1lbXNldChwYXJtLCAwLCBzaXplb2YodW5pb24gaXVjdl9wYXJhbSkpOworCWlmICh1c2VyZGF0YSkKKwkJbWVtY3B5KHBhcm0tPmN0cmwuaXB1c2VyLCB1c2VyZGF0YSwgc2l6ZW9mKHBhcm0tPmN0cmwuaXB1c2VyKSk7CisJcGFybS0+Y3RybC5pcHBhdGhpZCA9IHBhdGgtPnBhdGhpZDsKKwlyYyA9IGl1Y3ZfY2FsbF9iMmYwKElVQ1ZfUVVJRVNDRSwgcGFybSk7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9yZXN1bWU6CisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAdXNlcmRhdGE6IDE2IGJ5dGVzIG9mIGRhdGEgcmVmbGVjdGVkIHRvIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc3VtZXMgaW5jb21pbmcgbWVzc2FnZXMgb24gYW4gSVVDViBwYXRoIHRoYXQgaGFzCisgKiBiZWVuIHN0b3BwZWQgd2l0aCBpdWN2X3BhdGhfcXVpZXNjZS4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgZnJvbSB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9wYXRoX3Jlc3VtZShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCB1OCB1c2VyZGF0YVsxNl0pCit7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKwlpbnQgcmM7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwltZW1zZXQocGFybSwgMCwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pKTsKKwlpZiAodXNlcmRhdGEpCisJCW1lbWNweShwYXJtLT5jdHJsLmlwdXNlciwgdXNlcmRhdGEsIHNpemVvZihwYXJtLT5jdHJsLmlwdXNlcikpOworCXBhcm0tPmN0cmwuaXBwYXRoaWQgPSBwYXRoLT5wYXRoaWQ7CisJcmMgPSBpdWN2X2NhbGxfYjJmMChJVUNWX1JFU1VNRSwgcGFybSk7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9zZXZlcgorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQHVzZXJkYXRhOiAxNiBieXRlcyBvZiBkYXRhIHJlZmxlY3RlZCB0byB0aGUgY29tbXVuaWNhdGlvbiBwYXJ0bmVyCisgKgorICogVGhpcyBmdW5jdGlvbiB0ZXJtaW5hdGVzIGFuIElVQ1YgcGF0aC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgZnJvbSB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9wYXRoX3NldmVyKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHU4IHVzZXJkYXRhWzE2XSkKK3sKKwlpbnQgcmM7CisKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmIChpdWN2X3Rhc2tsZXRfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJc3Bpbl9sb2NrX2JoKCZpdWN2X3RhYmxlX2xvY2spOworCXJjID0gaXVjdl9zZXZlcl9wYXRoaWQocGF0aC0+cGF0aGlkLCB1c2VyZGF0YSk7CisJaWYgKCFyYykgeworCQlpdWN2X3BhdGhfdGFibGVbcGF0aC0+cGF0aGlkXSA9IE5VTEw7CisJCWxpc3RfZGVsX2luaXQoJnBhdGgtPmxpc3QpOworCQlpdWN2X2NsZWFudXBfcGF0aGlkKHBhdGgtPnBhdGhpZCk7CisJfQorCWlmIChpdWN2X3Rhc2tsZXRfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJc3Bpbl91bmxvY2tfYmgoJml1Y3ZfdGFibGVfbG9jayk7CisJcHJlZW1wdF9lbmFibGUoKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXVjdl9tZXNzYWdlX3B1cmdlCisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAbXNnOiBhZGRyZXNzIG9mIGl1Y3YgbXNnIHN0cnVjdHVyZQorICogQHNyY2Nsczogc291cmNlIGNsYXNzIG9mIG1lc3NhZ2UKKyAqCisgKiBDYW5jZWxzIGEgbWVzc2FnZSB5b3UgaGF2ZSBzZW50LgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBDUCBJVUNWIGNhbGwuCisgKi8KK2ludCBpdWN2X21lc3NhZ2VfcHVyZ2Uoc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCwgc3RydWN0IGl1Y3ZfbWVzc2FnZSAqbXNnLAorCQkgICAgICAgdTMyIHNyY2NscykKK3sKKwl1bmlvbiBpdWN2X3BhcmFtICpwYXJtOworCWludCByYzsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlwYXJtID0gcGVyY3B1X3B0cihpdWN2X3BhcmFtLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCW1lbXNldChwYXJtLCAwLCBzaXplb2YodW5pb24gaXVjdl9wYXJhbSkpOworCXBhcm0tPnB1cmdlLmlwcGF0aGlkID0gcGF0aC0+cGF0aGlkOworCXBhcm0tPnB1cmdlLmlwbXNnaWQgPSBtc2ctPmlkOworCXBhcm0tPnB1cmdlLmlwc3JjY2xzID0gc3JjY2xzOworCXBhcm0tPnB1cmdlLmlwZmxhZ3MxID0gSVVDVl9JUFNSQ0NMUyB8IElVQ1ZfSVBGR01JRCB8IElVQ1ZfSVBGR1BJRDsKKwlyYyA9IGl1Y3ZfY2FsbF9iMmYwKElVQ1ZfUFVSR0UsIHBhcm0pOworCWlmICghcmMpIHsKKwkJbXNnLT5hdWRpdCA9ICgqKHUzMiAqKSAmcGFybS0+cHVyZ2UuaXBhdWRpdCkgPj4gODsKKwkJbXNnLT50YWcgPSBwYXJtLT5wdXJnZS5pcG1zZ3RhZzsKKwl9CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGl1Y3ZfbWVzc2FnZV9yZWNlaXZlCisgKiBAcGF0aDogYWRkcmVzcyBvZiBpdWN2IHBhdGggc3RydWN0dXJlCisgKiBAbXNnOiBhZGRyZXNzIG9mIGl1Y3YgbXNnIHN0cnVjdHVyZQorICogQGZsYWdzOiBob3cgdGhlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgKElVQ1ZfSVBCVUZMU1QpCisgKiBAYnVmZmVyOiBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIG9yIGFkZHJlc3Mgb2Ygc3RydWN0IGl1Y3ZfYXJyYXkKKyAqIEBzaXplOiBsZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqIEByZXNpZHVhbDoKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlY2VpdmVzIG1lc3NhZ2VzIHRoYXQgYXJlIGJlaW5nIHNlbnQgdG8geW91IG92ZXIKKyAqIGVzdGFibGlzaGVkIHBhdGhzLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGVhbCB3aXRoIFJNREFUQSBtZXNzYWdlcworICogZW1iZWRkZWQgaW4gc3RydWN0IGl1Y3ZfbWVzc2FnZSBhcyB3ZWxsLgorICoKKyAqIFJldHVybnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBDUCBJVUNWIGNhbGwuCisgKi8KK2ludCBpdWN2X21lc3NhZ2VfcmVjZWl2ZShzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2csCisJCQkgdTggZmxhZ3MsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHNpemVfdCAqcmVzaWR1YWwpCit7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKwlzdHJ1Y3QgaXVjdl9hcnJheSAqYXJyYXk7CisJdTggKnJtbXNnOworCXNpemVfdCBjb3B5OworCWludCByYzsKKworCWlmIChtc2ctPmZsYWdzICYgSVVDVl9JUFJNREFUQSkgeworCQkvKgorCQkgKiBNZXNzYWdlIGlzIDggYnl0ZXMgbG9uZyBhbmQgaGFzIGJlZW4gc3RvcmVkIHRvIHRoZQorCQkgKiBtZXNzYWdlIGRlc2NyaXB0b3IgaXRzZWxmLgorCQkgKi8KKwkJcmMgPSAoc2l6ZSA8IDgpID8gNSA6IDA7CisJCWlmIChyZXNpZHVhbCkKKwkJCSpyZXNpZHVhbCA9IGFicyhzaXplIC0gOCk7CisJCXJtbXNnID0gbXNnLT5ybW1zZzsKKwkJaWYgKGZsYWdzICYgSVVDVl9JUEJVRkxTVCkgeworCQkJLyogQ29weSB0byBzdHJ1Y3QgaXVjdl9hcnJheS4gKi8KKwkJCXNpemUgPSAoc2l6ZSA8IDgpID8gc2l6ZSA6IDg7CisJCQlmb3IgKGFycmF5ID0gYnVmZmVyOyBzaXplID4gMDsgYXJyYXkrKykgeworCQkJCWNvcHkgPSBtaW5fdChzaXplX3QsIHNpemUsIGFycmF5LT5sZW5ndGgpOworCQkJCW1lbWNweSgodTggKikoYWRkcl90KSBhcnJheS0+YWRkcmVzcywKKwkJCQkgICAgICAgcm1tc2csIGNvcHkpOworCQkJCXJtbXNnICs9IGNvcHk7CisJCQkJc2l6ZSAtPSBjb3B5OworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQ29weSB0byBkaXJlY3QgYnVmZmVyLiAqLworCQkJbWVtY3B5KGJ1ZmZlciwgcm1tc2csIG1pbl90KHNpemVfdCwgc2l6ZSwgOCkpOworCQl9CisJCXJldHVybiAwOworCX0KKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlwYXJtID0gcGVyY3B1X3B0cihpdWN2X3BhcmFtLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCW1lbXNldChwYXJtLCAwLCBzaXplb2YodW5pb24gaXVjdl9wYXJhbSkpOworCXBhcm0tPmRiLmlwYmZhZHIxID0gKHUzMikoYWRkcl90KSBidWZmZXI7CisJcGFybS0+ZGIuaXBiZmxuMWYgPSAodTMyKSBzaXplOworCXBhcm0tPmRiLmlwbXNnaWQgPSBtc2ctPmlkOworCXBhcm0tPmRiLmlwcGF0aGlkID0gcGF0aC0+cGF0aGlkOworCXBhcm0tPmRiLmlwdHJnY2xzID0gbXNnLT5jbGFzczsKKwlwYXJtLT5kYi5pcGZsYWdzMSA9IChmbGFncyB8IElVQ1ZfSVBGR1BJRCB8CisJCQkgICAgIElVQ1ZfSVBGR01JRCB8IElVQ1ZfSVBUUkdDTFMpOworCXJjID0gaXVjdl9jYWxsX2IyZjAoSVVDVl9SRUNFSVZFLCBwYXJtKTsKKwlpZiAoIXJjIHx8IHJjID09IDUpIHsKKwkJbXNnLT5mbGFncyA9IHBhcm0tPmRiLmlwZmxhZ3MxOworCQlpZiAocmVzaWR1YWwpCisJCQkqcmVzaWR1YWwgPSBwYXJtLT5kYi5pcGJmbG4xZjsKKwl9CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGl1Y3ZfbWVzc2FnZV9yZWplY3QKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBtc2c6IGFkZHJlc3Mgb2YgaXVjdiBtc2cgc3RydWN0dXJlCisgKgorICogVGhlIHJlamVjdCBmdW5jdGlvbiByZWZ1c2VzIGEgc3BlY2lmaWVkIG1lc3NhZ2UuIEJldHdlZW4gdGhlIHRpbWUgeW91CisgKiBhcmUgbm90aWZpZWQgb2YgYSBtZXNzYWdlIGFuZCB0aGUgdGltZSB0aGF0IHlvdSBjb21wbGV0ZSB0aGUgbWVzc2FnZSwKKyAqIHRoZSBtZXNzYWdlIG1heSBiZSByZWplY3RlZC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgZnJvbSB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9tZXNzYWdlX3JlamVjdChzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoLCBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2cpCit7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKwlpbnQgcmM7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwltZW1zZXQocGFybSwgMCwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pKTsKKwlwYXJtLT5kYi5pcHBhdGhpZCA9IHBhdGgtPnBhdGhpZDsKKwlwYXJtLT5kYi5pcG1zZ2lkID0gbXNnLT5pZDsKKwlwYXJtLT5kYi5pcHRyZ2NscyA9IG1zZy0+Y2xhc3M7CisJcGFybS0+ZGIuaXBmbGFnczEgPSAoSVVDVl9JUFRSR0NMUyB8IElVQ1ZfSVBGR01JRCB8IElVQ1ZfSVBGR1BJRCk7CisJcmMgPSBpdWN2X2NhbGxfYjJmMChJVUNWX1JFSkVDVCwgcGFybSk7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGl1Y3ZfbWVzc2FnZV9yZXBseQorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQG1zZzogYWRkcmVzcyBvZiBpdWN2IG1zZyBzdHJ1Y3R1cmUKKyAqIEBmbGFnczogaG93IHRoZSByZXBseSBpcyBzZW50IChJVUNWX0lQUk1EQVRBLCBJVUNWX0lQUFJUWSwgSVVDVl9JUEJVRkxTVCkKKyAqIEByZXBseTogYWRkcmVzcyBvZiByZXBseSBkYXRhIGJ1ZmZlciBvciBhZGRyZXNzIG9mIHN0cnVjdCBpdWN2X2FycmF5CisgKiBAc2l6ZTogbGVuZ3RoIG9mIHJlcGx5IGRhdGEgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZXNwb25kcyB0byB0aGUgdHdvLXdheSBtZXNzYWdlcyB0aGF0IHlvdSByZWNlaXZlLiBZb3UKKyAqIG11c3QgaWRlbnRpZnkgY29tcGxldGVseSB0aGUgbWVzc2FnZSB0byB3aGljaCB5b3Ugd2lzaCB0byByZXBseS4gaWUsCisgKiBwYXRoaWQsIG1zZ2lkLCBhbmQgdHJnY2xzLiBQcm1tc2cgc2lnbmlmaWVzIHRoZSBkYXRhIGlzIG1vdmVkIGludG8KKyAqIHRoZSBwYXJhbWV0ZXIgbGlzdC4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgZnJvbSB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9tZXNzYWdlX3JlcGx5KHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZywKKwkJICAgICAgIHU4IGZsYWdzLCB2b2lkICpyZXBseSwgc2l6ZV90IHNpemUpCit7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKwlpbnQgcmM7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwltZW1zZXQocGFybSwgMCwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pKTsKKwlpZiAoZmxhZ3MgJiBJVUNWX0lQUk1EQVRBKSB7CisJCXBhcm0tPmRwbC5pcHBhdGhpZCA9IHBhdGgtPnBhdGhpZDsKKwkJcGFybS0+ZHBsLmlwZmxhZ3MxID0gZmxhZ3M7CisJCXBhcm0tPmRwbC5pcG1zZ2lkID0gbXNnLT5pZDsKKwkJcGFybS0+ZHBsLmlwdHJnY2xzID0gbXNnLT5jbGFzczsKKwkJbWVtY3B5KHBhcm0tPmRwbC5pcHJtbXNnLCByZXBseSwgbWluX3Qoc2l6ZV90LCBzaXplLCA4KSk7CisJfSBlbHNlIHsKKwkJcGFybS0+ZGIuaXBiZmFkcjEgPSAodTMyKShhZGRyX3QpIHJlcGx5OworCQlwYXJtLT5kYi5pcGJmbG4xZiA9ICh1MzIpIHNpemU7CisJCXBhcm0tPmRiLmlwcGF0aGlkID0gcGF0aC0+cGF0aGlkOworCQlwYXJtLT5kYi5pcGZsYWdzMSA9IGZsYWdzOworCQlwYXJtLT5kYi5pcG1zZ2lkID0gbXNnLT5pZDsKKwkJcGFybS0+ZGIuaXB0cmdjbHMgPSBtc2ctPmNsYXNzOworCX0KKwlyYyA9IGl1Y3ZfY2FsbF9iMmYwKElVQ1ZfUkVQTFksIHBhcm0pOworCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X21lc3NhZ2Vfc2VuZAorICogQHBhdGg6IGFkZHJlc3Mgb2YgaXVjdiBwYXRoIHN0cnVjdHVyZQorICogQG1zZzogYWRkcmVzcyBvZiBpdWN2IG1zZyBzdHJ1Y3R1cmUKKyAqIEBmbGFnczogaG93IHRoZSBtZXNzYWdlIGlzIHNlbnQgKElVQ1ZfSVBSTURBVEEsIElVQ1ZfSVBQUlRZLCBJVUNWX0lQQlVGTFNUKQorICogQHNyY2Nsczogc291cmNlIGNsYXNzIG9mIG1lc3NhZ2UKKyAqIEBidWZmZXI6IGFkZHJlc3Mgb2Ygc2VuZCBidWZmZXIgb3IgYWRkcmVzcyBvZiBzdHJ1Y3QgaXVjdl9hcnJheQorICogQHNpemU6IGxlbmd0aCBvZiBzZW5kIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4gRGF0YSB0byBiZQorICogdHJhbnNtaXR0ZWQgaXMgaW4gYSBidWZmZXIgYW5kIHRoaXMgaXMgYSBvbmUtd2F5IG1lc3NhZ2UgYW5kIHRoZQorICogcmVjZWl2ZXIgd2lsbCBub3QgcmVwbHkgdG8gdGhlIG1lc3NhZ2UuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IGZyb20gdGhlIENQIElVQ1YgY2FsbC4KKyAqLworaW50IGl1Y3ZfbWVzc2FnZV9zZW5kKHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZywKKwkJICAgICAgdTggZmxhZ3MsIHUzMiBzcmNjbHMsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJdW5pb24gaXVjdl9wYXJhbSAqcGFybTsKKwlpbnQgcmM7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJcGFybSA9IHBlcmNwdV9wdHIoaXVjdl9wYXJhbSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwltZW1zZXQocGFybSwgMCwgc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pKTsKKwlpZiAoZmxhZ3MgJiBJVUNWX0lQUk1EQVRBKSB7CisJCS8qIE1lc3NhZ2Ugb2YgOCBieXRlcyBjYW4gYmUgcGxhY2VkIGludG8gdGhlIHBhcmFtZXRlciBsaXN0LiAqLworCQlwYXJtLT5kcGwuaXBwYXRoaWQgPSBwYXRoLT5wYXRoaWQ7CisJCXBhcm0tPmRwbC5pcGZsYWdzMSA9IGZsYWdzIHwgSVVDVl9JUE5PUlBZOworCQlwYXJtLT5kcGwuaXB0cmdjbHMgPSBtc2ctPmNsYXNzOworCQlwYXJtLT5kcGwuaXBzcmNjbHMgPSBzcmNjbHM7CisJCXBhcm0tPmRwbC5pcG1zZ3RhZyA9IG1zZy0+dGFnOworCQltZW1jcHkocGFybS0+ZHBsLmlwcm1tc2csIGJ1ZmZlciwgOCk7CisJfSBlbHNlIHsKKwkJcGFybS0+ZGIuaXBiZmFkcjEgPSAodTMyKShhZGRyX3QpIGJ1ZmZlcjsKKwkJcGFybS0+ZGIuaXBiZmxuMWYgPSAodTMyKSBzaXplOworCQlwYXJtLT5kYi5pcHBhdGhpZCA9IHBhdGgtPnBhdGhpZDsKKwkJcGFybS0+ZGIuaXBmbGFnczEgPSBmbGFncyB8IElVQ1ZfSVBOT1JQWTsKKwkJcGFybS0+ZGIuaXB0cmdjbHMgPSBtc2ctPmNsYXNzOworCQlwYXJtLT5kYi5pcHNyY2NscyA9IHNyY2NsczsKKwkJcGFybS0+ZGIuaXBtc2d0YWcgPSBtc2ctPnRhZzsKKwl9CisJcmMgPSBpdWN2X2NhbGxfYjJmMChJVUNWX1NFTkQsIHBhcm0pOworCWlmICghcmMpCisJCW1zZy0+aWQgPSBwYXJtLT5kYi5pcG1zZ2lkOworCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X21lc3NhZ2Vfc2VuZDJ3YXkKKyAqIEBwYXRoOiBhZGRyZXNzIG9mIGl1Y3YgcGF0aCBzdHJ1Y3R1cmUKKyAqIEBtc2c6IGFkZHJlc3Mgb2YgaXVjdiBtc2cgc3RydWN0dXJlCisgKiBAZmxhZ3M6IGhvdyB0aGUgbWVzc2FnZSBpcyBzZW50IGFuZCB0aGUgcmVwbHkgaXMgcmVjZWl2ZWQKKyAqCSAgIChJVUNWX0lQUk1EQVRBLCBJVUNWX0lQQlVGTFNULCBJVUNWX0lQUFJUWSwgSVVDVl9BTlNMU1QpCisgKiBAc3JjY2xzOiBzb3VyY2UgY2xhc3Mgb2YgbWVzc2FnZQorICogQGJ1ZmZlcjogYWRkcmVzcyBvZiBzZW5kIGJ1ZmZlciBvciBhZGRyZXNzIG9mIHN0cnVjdCBpdWN2X2FycmF5CisgKiBAc2l6ZTogbGVuZ3RoIG9mIHNlbmQgYnVmZmVyCisgKiBAYW5zYnVmOiBhZGRyZXNzIG9mIGFuc3dlciBidWZmZXIgb3IgYWRkcmVzcyBvZiBzdHJ1Y3QgaXVjdl9hcnJheQorICogQGFzaXplOiBzaXplIG9mIHJlcGx5IGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJhbnNtaXRzIGRhdGEgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4gRGF0YSB0byBiZQorICogdHJhbnNtaXR0ZWQgaXMgaW4gYSBidWZmZXIuIFRoZSByZWNlaXZlciBvZiB0aGUgc2VuZCBpcyBleHBlY3RlZCB0bworICogcmVwbHkgdG8gdGhlIG1lc3NhZ2UgYW5kIGEgYnVmZmVyIGlzIHByb3ZpZGVkIGludG8gd2hpY2ggSVVDViBtb3ZlcworICogdGhlIHJlcGx5IHRvIHRoaXMgbWVzc2FnZS4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgZnJvbSB0aGUgQ1AgSVVDViBjYWxsLgorICovCitpbnQgaXVjdl9tZXNzYWdlX3NlbmQyd2F5KHN0cnVjdCBpdWN2X3BhdGggKnBhdGgsIHN0cnVjdCBpdWN2X21lc3NhZ2UgKm1zZywKKwkJCSAgdTggZmxhZ3MsIHUzMiBzcmNjbHMsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCisJCQkgIHZvaWQgKmFuc3dlciwgc2l6ZV90IGFzaXplLCBzaXplX3QgKnJlc2lkdWFsKQoreworCXVuaW9uIGl1Y3ZfcGFyYW0gKnBhcm07CisJaW50IHJjOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CisJaWYgKGZsYWdzICYgSVVDVl9JUFJNREFUQSkgeworCQlwYXJtLT5kcGwuaXBwYXRoaWQgPSBwYXRoLT5wYXRoaWQ7CisJCXBhcm0tPmRwbC5pcGZsYWdzMSA9IHBhdGgtPmZsYWdzOwkvKiBwcmlvcml0eSBtZXNzYWdlICovCisJCXBhcm0tPmRwbC5pcHRyZ2NscyA9IG1zZy0+Y2xhc3M7CisJCXBhcm0tPmRwbC5pcHNyY2NscyA9IHNyY2NsczsKKwkJcGFybS0+ZHBsLmlwbXNndGFnID0gbXNnLT50YWc7CisJCXBhcm0tPmRwbC5pcGJmYWRyMiA9ICh1MzIpKGFkZHJfdCkgYW5zd2VyOworCQlwYXJtLT5kcGwuaXBiZmxuMmYgPSAodTMyKSBhc2l6ZTsKKwkJbWVtY3B5KHBhcm0tPmRwbC5pcHJtbXNnLCBidWZmZXIsIDgpOworCX0gZWxzZSB7CisJCXBhcm0tPmRiLmlwcGF0aGlkID0gcGF0aC0+cGF0aGlkOworCQlwYXJtLT5kYi5pcGZsYWdzMSA9IHBhdGgtPmZsYWdzOwkvKiBwcmlvcml0eSBtZXNzYWdlICovCisJCXBhcm0tPmRiLmlwdHJnY2xzID0gbXNnLT5jbGFzczsKKwkJcGFybS0+ZGIuaXBzcmNjbHMgPSBzcmNjbHM7CisJCXBhcm0tPmRiLmlwbXNndGFnID0gbXNnLT50YWc7CisJCXBhcm0tPmRiLmlwYmZhZHIxID0gKHUzMikoYWRkcl90KSBidWZmZXI7CisJCXBhcm0tPmRiLmlwYmZsbjFmID0gKHUzMikgc2l6ZTsKKwkJcGFybS0+ZGIuaXBiZmFkcjIgPSAodTMyKShhZGRyX3QpIGFuc3dlcjsKKwkJcGFybS0+ZGIuaXBiZmxuMmYgPSAodTMyKSBhc2l6ZTsKKwl9CisJcmMgPSBpdWN2X2NhbGxfYjJmMChJVUNWX1NFTkQsIHBhcm0pOworCWlmICghcmMpCisJCW1zZy0+aWQgPSBwYXJtLT5kYi5pcG1zZ2lkOworCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X3BhdGhfcGVuZGluZworICogQGRhdGE6IFBvaW50ZXIgdG8gZXh0ZXJuYWwgaW50ZXJydXB0IGJ1ZmZlcgorICoKKyAqIFByb2Nlc3MgY29ubmVjdGlvbiBwZW5kaW5nIHdvcmsgaXRlbS4gQ2FsbGVkIGZyb20gdGFza2xldCB3aGlsZSBob2xkaW5nCisgKiBpdWN2X3RhYmxlX2xvY2suCisgKi8KK3N0cnVjdCBpdWN2X3BhdGhfcGVuZGluZyB7CisJdTE2IGlwcGF0aGlkOworCXU4ICBpcGZsYWdzMTsKKwl1OCAgaXB0eXBlOworCXUxNiBpcG1zZ2xpbTsKKwl1MTYgcmVzMTsKKwl1OCAgaXB2bWlkWzhdOworCXU4ICBpcHVzZXJbMTZdOworCXUzMiByZXMzOworCXU4ICBpcHBvbGxmZzsKKwl1OCAgcmVzNFszXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBpdWN2X3BhdGhfcGVuZGluZyhzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXVjdl9wYXRoX3BlbmRpbmcgKmlwcCA9ICh2b2lkICopIGRhdGE7CisJc3RydWN0IGl1Y3ZfaGFuZGxlciAqaGFuZGxlcjsKKwlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoOworCWNoYXIgKmVycm9yOworCisJQlVHX09OKGl1Y3ZfcGF0aF90YWJsZVtpcHAtPmlwcGF0aGlkXSk7CisJLyogTmV3IHBhdGhpZCwgaGFuZGxlciBmb3VuZC4gQ3JlYXRlIGEgbmV3IHBhdGggc3RydWN0LiAqLworCWVycm9yID0gaXVjdl9lcnJvcl9ub19tZW1vcnk7CisJcGF0aCA9IGl1Y3ZfcGF0aF9hbGxvYyhpcHAtPmlwbXNnbGltLCBpcHAtPmlwZmxhZ3MxLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBhdGgpCisJCWdvdG8gb3V0X3NldmVyOworCXBhdGgtPnBhdGhpZCA9IGlwcC0+aXBwYXRoaWQ7CisJaXVjdl9wYXRoX3RhYmxlW3BhdGgtPnBhdGhpZF0gPSBwYXRoOworCUVCQ0FTQyhpcHAtPmlwdm1pZCwgOCk7CisKKwkvKiBDYWxsIHJlZ2lzdGVyZWQgaGFuZGxlciB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCB3YW50cyB0aGUgcGF0aC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhbmRsZXIsICZpdWN2X2hhbmRsZXJfbGlzdCwgbGlzdCkgeworCQlpZiAoIWhhbmRsZXItPnBhdGhfcGVuZGluZykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBBZGQgcGF0aCB0byBoYW5kbGVyIHRvIGFsbG93IGEgY2FsbCB0byBpdWN2X3BhdGhfc2V2ZXIKKwkJICogaW5zaWRlIHRoZSBwYXRoX3BlbmRpbmcgZnVuY3Rpb24uIElmIHRoZSBoYW5kbGVyIHJldHVybnMKKwkJICogYW4gZXJyb3IgcmVtb3ZlIHRoZSBwYXRoIGZyb20gdGhlIGhhbmRsZXIgYWdhaW4uCisJCSAqLworCQlsaXN0X2FkZCgmcGF0aC0+bGlzdCwgJmhhbmRsZXItPnBhdGhzKTsKKwkJcGF0aC0+aGFuZGxlciA9IGhhbmRsZXI7CisJCWlmICghaGFuZGxlci0+cGF0aF9wZW5kaW5nKHBhdGgsIGlwcC0+aXB2bWlkLCBpcHAtPmlwdXNlcikpCisJCQlyZXR1cm47CisJCWxpc3RfZGVsKCZwYXRoLT5saXN0KTsKKwkJcGF0aC0+aGFuZGxlciA9IE5VTEw7CisJfQorCS8qIE5vIGhhbmRsZXIgd2FudGVkIHRoZSBwYXRoLiAqLworCWl1Y3ZfcGF0aF90YWJsZVtwYXRoLT5wYXRoaWRdID0gTlVMTDsKKwlpdWN2X3BhdGhfZnJlZShwYXRoKTsKKwllcnJvciA9IGl1Y3ZfZXJyb3Jfbm9fbGlzdGVuZXI7CitvdXRfc2V2ZXI6CisJaXVjdl9zZXZlcl9wYXRoaWQoaXBwLT5pcHBhdGhpZCwgZXJyb3IpOworfQorCisvKioKKyAqIGl1Y3ZfcGF0aF9jb21wbGV0ZQorICogQGRhdGE6IFBvaW50ZXIgdG8gZXh0ZXJuYWwgaW50ZXJydXB0IGJ1ZmZlcgorICoKKyAqIFByb2Nlc3MgY29ubmVjdGlvbiBjb21wbGV0ZSB3b3JrIGl0ZW0uIENhbGxlZCBmcm9tIHRhc2tsZXQgd2hpbGUgaG9sZGluZworICogaXVjdl90YWJsZV9sb2NrLgorICovCitzdHJ1Y3QgaXVjdl9wYXRoX2NvbXBsZXRlIHsKKwl1MTYgaXBwYXRoaWQ7CisJdTggIGlwZmxhZ3MxOworCXU4ICBpcHR5cGU7CisJdTE2IGlwbXNnbGltOworCXUxNiByZXMxOworCXU4ICByZXMyWzhdOworCXU4ICBpcHVzZXJbMTZdOworCXUzMiByZXMzOworCXU4ICBpcHBvbGxmZzsKKwl1OCAgcmVzNFszXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBpdWN2X3BhdGhfY29tcGxldGUoc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGl1Y3ZfcGF0aF9jb21wbGV0ZSAqaXBjID0gKHZvaWQgKikgZGF0YTsKKwlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoID0gaXVjdl9wYXRoX3RhYmxlW2lwYy0+aXBwYXRoaWRdOworCisJQlVHX09OKCFwYXRoIHx8ICFwYXRoLT5oYW5kbGVyKTsKKwlpZiAocGF0aC0+aGFuZGxlci0+cGF0aF9jb21wbGV0ZSkKKwkJcGF0aC0+aGFuZGxlci0+cGF0aF9jb21wbGV0ZShwYXRoLCBpcGMtPmlwdXNlcik7Cit9CisKKy8qKgorICogaXVjdl9wYXRoX3NldmVyZWQKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGV4dGVybmFsIGludGVycnVwdCBidWZmZXIKKyAqCisgKiBQcm9jZXNzIGNvbm5lY3Rpb24gc2V2ZXJlZCB3b3JrIGl0ZW0uIENhbGxlZCBmcm9tIHRhc2tsZXQgd2hpbGUgaG9sZGluZworICogaXVjdl90YWJsZV9sb2NrLgorICovCitzdHJ1Y3QgaXVjdl9wYXRoX3NldmVyZWQgeworCXUxNiBpcHBhdGhpZDsKKwl1OCAgcmVzMTsKKwl1OCAgaXB0eXBlOworCXUzMiByZXMyOworCXU4ICByZXMzWzhdOworCXU4ICBpcHVzZXJbMTZdOworCXUzMiByZXM0OworCXU4ICBpcHBvbGxmZzsKKwl1OCAgcmVzNVszXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBpdWN2X3BhdGhfc2V2ZXJlZChzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXVjdl9wYXRoX3NldmVyZWQgKmlwcyA9ICh2b2lkICopIGRhdGE7CisJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCA9IGl1Y3ZfcGF0aF90YWJsZVtpcHMtPmlwcGF0aGlkXTsKKworCUJVR19PTighcGF0aCB8fCAhcGF0aC0+aGFuZGxlcik7CisJaWYgKHBhdGgtPmhhbmRsZXItPnBhdGhfc2V2ZXJlZCkKKwkJcGF0aC0+aGFuZGxlci0+cGF0aF9zZXZlcmVkKHBhdGgsIGlwcy0+aXB1c2VyKTsKKwllbHNlIHsKKwkJaXVjdl9zZXZlcl9wYXRoaWQocGF0aC0+cGF0aGlkLCBOVUxMKTsKKwkJaXVjdl9wYXRoX3RhYmxlW3BhdGgtPnBhdGhpZF0gPSBOVUxMOworCQlsaXN0X2RlbF9pbml0KCZwYXRoLT5saXN0KTsKKwkJaXVjdl9jbGVhbnVwX3BhdGhpZChwYXRoLT5wYXRoaWQpOworCQlpdWN2X3BhdGhfZnJlZShwYXRoKTsKKwl9Cit9CisKKy8qKgorICogaXVjdl9wYXRoX3F1aWVzY2VkCisgKiBAZGF0YTogUG9pbnRlciB0byBleHRlcm5hbCBpbnRlcnJ1cHQgYnVmZmVyCisgKgorICogUHJvY2VzcyBjb25uZWN0aW9uIHF1aWVzY2VkIHdvcmsgaXRlbS4gQ2FsbGVkIGZyb20gdGFza2xldCB3aGlsZSBob2xkaW5nCisgKiBpdWN2X3RhYmxlX2xvY2suCisgKi8KK3N0cnVjdCBpdWN2X3BhdGhfcXVpZXNjZWQgeworCXUxNiBpcHBhdGhpZDsKKwl1OCAgcmVzMTsKKwl1OCAgaXB0eXBlOworCXUzMiByZXMyOworCXU4ICByZXMzWzhdOworCXU4ICBpcHVzZXJbMTZdOworCXUzMiByZXM0OworCXU4ICBpcHBvbGxmZzsKKwl1OCAgcmVzNVszXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBpdWN2X3BhdGhfcXVpZXNjZWQoc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGl1Y3ZfcGF0aF9xdWllc2NlZCAqaXBxID0gKHZvaWQgKikgZGF0YTsKKwlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoID0gaXVjdl9wYXRoX3RhYmxlW2lwcS0+aXBwYXRoaWRdOworCisJQlVHX09OKCFwYXRoIHx8ICFwYXRoLT5oYW5kbGVyKTsKKwlpZiAocGF0aC0+aGFuZGxlci0+cGF0aF9xdWllc2NlZCkKKwkJcGF0aC0+aGFuZGxlci0+cGF0aF9xdWllc2NlZChwYXRoLCBpcHEtPmlwdXNlcik7Cit9CisKKy8qKgorICogaXVjdl9wYXRoX3Jlc3VtZWQKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGV4dGVybmFsIGludGVycnVwdCBidWZmZXIKKyAqCisgKiBQcm9jZXNzIGNvbm5lY3Rpb24gcmVzdW1lZCB3b3JrIGl0ZW0uIENhbGxlZCBmcm9tIHRhc2tsZXQgd2hpbGUgaG9sZGluZworICogaXVjdl90YWJsZV9sb2NrLgorICovCitzdHJ1Y3QgaXVjdl9wYXRoX3Jlc3VtZWQgeworCXUxNiBpcHBhdGhpZDsKKwl1OCAgcmVzMTsKKwl1OCAgaXB0eXBlOworCXUzMiByZXMyOworCXU4ICByZXMzWzhdOworCXU4ICBpcHVzZXJbMTZdOworCXUzMiByZXM0OworCXU4ICBpcHBvbGxmZzsKKwl1OCAgcmVzNVszXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgdm9pZCBpdWN2X3BhdGhfcmVzdW1lZChzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXVjdl9wYXRoX3Jlc3VtZWQgKmlwciA9ICh2b2lkICopIGRhdGE7CisJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCA9IGl1Y3ZfcGF0aF90YWJsZVtpcHItPmlwcGF0aGlkXTsKKworCUJVR19PTighcGF0aCB8fCAhcGF0aC0+aGFuZGxlcik7CisJaWYgKHBhdGgtPmhhbmRsZXItPnBhdGhfcmVzdW1lZCkKKwkJcGF0aC0+aGFuZGxlci0+cGF0aF9yZXN1bWVkKHBhdGgsIGlwci0+aXB1c2VyKTsKK30KKworLyoqCisgKiBpdWN2X21lc3NhZ2VfY29tcGxldGUKKyAqIEBkYXRhOiBQb2ludGVyIHRvIGV4dGVybmFsIGludGVycnVwdCBidWZmZXIKKyAqCisgKiBQcm9jZXNzIG1lc3NhZ2UgY29tcGxldGUgd29yayBpdGVtLiBDYWxsZWQgZnJvbSB0YXNrbGV0IHdoaWxlIGhvbGRpbmcKKyAqIGl1Y3ZfdGFibGVfbG9jay4KKyAqLworc3RydWN0IGl1Y3ZfbWVzc2FnZV9jb21wbGV0ZSB7CisJdTE2IGlwcGF0aGlkOworCXU4ICBpcGZsYWdzMTsKKwl1OCAgaXB0eXBlOworCXUzMiBpcG1zZ2lkOworCXUzMiBpcGF1ZGl0OworCXU4ICBpcHJtbXNnWzhdOworCXUzMiBpcHNyY2NsczsKKwl1MzIgaXBtc2d0YWc7CisJdTMyIHJlczsKKwl1MzIgaXBiZmxuMmY7CisJdTggIGlwcG9sbGZnOworCXU4ICByZXMyWzNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyB2b2lkIGl1Y3ZfbWVzc2FnZV9jb21wbGV0ZShzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlX2NvbXBsZXRlICppbWMgPSAodm9pZCAqKSBkYXRhOworCXN0cnVjdCBpdWN2X3BhdGggKnBhdGggPSBpdWN2X3BhdGhfdGFibGVbaW1jLT5pcHBhdGhpZF07CisJc3RydWN0IGl1Y3ZfbWVzc2FnZSBtc2c7CisKKwlCVUdfT04oIXBhdGggfHwgIXBhdGgtPmhhbmRsZXIpOworCWlmIChwYXRoLT5oYW5kbGVyLT5tZXNzYWdlX2NvbXBsZXRlKSB7CisJCW1zZy5mbGFncyA9IGltYy0+aXBmbGFnczE7CisJCW1zZy5pZCA9IGltYy0+aXBtc2dpZDsKKwkJbXNnLmF1ZGl0ID0gaW1jLT5pcGF1ZGl0OworCQltZW1jcHkobXNnLnJtbXNnLCBpbWMtPmlwcm1tc2csIDgpOworCQltc2cuY2xhc3MgPSBpbWMtPmlwc3JjY2xzOworCQltc2cudGFnID0gaW1jLT5pcG1zZ3RhZzsKKwkJbXNnLmxlbmd0aCA9IGltYy0+aXBiZmxuMmY7CisJCXBhdGgtPmhhbmRsZXItPm1lc3NhZ2VfY29tcGxldGUocGF0aCwgJm1zZyk7CisJfQorfQorCisvKioKKyAqIGl1Y3ZfbWVzc2FnZV9wZW5kaW5nCisgKiBAZGF0YTogUG9pbnRlciB0byBleHRlcm5hbCBpbnRlcnJ1cHQgYnVmZmVyCisgKgorICogUHJvY2VzcyBtZXNzYWdlIHBlbmRpbmcgd29yayBpdGVtLiBDYWxsZWQgZnJvbSB0YXNrbGV0IHdoaWxlIGhvbGRpbmcKKyAqIGl1Y3ZfdGFibGVfbG9jay4KKyAqLworc3RydWN0IGl1Y3ZfbWVzc2FnZV9wZW5kaW5nIHsKKwl1MTYgaXBwYXRoaWQ7CisJdTggIGlwZmxhZ3MxOworCXU4ICBpcHR5cGU7CisJdTMyIGlwbXNnaWQ7CisJdTMyIGlwdHJnY2xzOworCXVuaW9uIHsKKwkJdTMyIGlwcm1tc2cxX3UzMjsKKwkJdTggIGlwcm1tc2cxWzRdOworCX0gbG4xbXNnMTsKKwl1bmlvbiB7CisJCXUzMiBpcGJmbG4xZjsKKwkJdTggIGlwcm1tc2cyWzRdOworCX0gbG4xbXNnMjsKKwl1MzIgcmVzMVszXTsKKwl1MzIgaXBiZmxuMmY7CisJdTggIGlwcG9sbGZnOworCXU4ICByZXMyWzNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyB2b2lkIGl1Y3ZfbWVzc2FnZV9wZW5kaW5nKHN0cnVjdCBpdWN2X2lycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBpdWN2X21lc3NhZ2VfcGVuZGluZyAqaW1wID0gKHZvaWQgKikgZGF0YTsKKwlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoID0gaXVjdl9wYXRoX3RhYmxlW2ltcC0+aXBwYXRoaWRdOworCXN0cnVjdCBpdWN2X21lc3NhZ2UgbXNnOworCisJQlVHX09OKCFwYXRoIHx8ICFwYXRoLT5oYW5kbGVyKTsKKwlpZiAocGF0aC0+aGFuZGxlci0+bWVzc2FnZV9wZW5kaW5nKSB7CisJCW1zZy5mbGFncyA9IGltcC0+aXBmbGFnczE7CisJCW1zZy5pZCA9IGltcC0+aXBtc2dpZDsKKwkJbXNnLmNsYXNzID0gaW1wLT5pcHRyZ2NsczsKKwkJaWYgKGltcC0+aXBmbGFnczEgJiBJVUNWX0lQUk1EQVRBKSB7CisJCQltZW1jcHkobXNnLnJtbXNnLCBpbXAtPmxuMW1zZzEuaXBybW1zZzEsIDgpOworCQkJbXNnLmxlbmd0aCA9IDg7CisJCX0gZWxzZQorCQkJbXNnLmxlbmd0aCA9IGltcC0+bG4xbXNnMi5pcGJmbG4xZjsKKwkJbXNnLnJlcGx5X3NpemUgPSBpbXAtPmlwYmZsbjJmOworCQlwYXRoLT5oYW5kbGVyLT5tZXNzYWdlX3BlbmRpbmcocGF0aCwgJm1zZyk7CisJfQorfQorCisvKioKKyAqIGl1Y3ZfdGFza2xldF9oYW5kbGVyOgorICoKKyAqIFRoaXMgdGFza2xldCBsb29wcyBvdmVyIHRoZSBxdWV1ZSBvZiBpcnEgYnVmZmVycyBjcmVhdGVkIGJ5CisgKiBpdWN2X2V4dGVybmFsX2ludGVycnVwdCwgY2FsbHMgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiBoYW5kbGVyCisgKiBhbmQgdGhlbiBmcmVlcyB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBpdWN2X3Rhc2tsZXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGlnbm9yZWQpCit7CisJdHlwZWRlZiB2b2lkIGl1Y3ZfaXJxX2ZuKHN0cnVjdCBpdWN2X2lycV9kYXRhICopOworCXN0YXRpYyBpdWN2X2lycV9mbiAqaXJxX2ZuW10gPSB7CisJCVsweDAxXSA9IGl1Y3ZfcGF0aF9wZW5kaW5nLAorCQlbMHgwMl0gPSBpdWN2X3BhdGhfY29tcGxldGUsCisJCVsweDAzXSA9IGl1Y3ZfcGF0aF9zZXZlcmVkLAorCQlbMHgwNF0gPSBpdWN2X3BhdGhfcXVpZXNjZWQsCisJCVsweDA1XSA9IGl1Y3ZfcGF0aF9yZXN1bWVkLAorCQlbMHgwNl0gPSBpdWN2X21lc3NhZ2VfY29tcGxldGUsCisJCVsweDA3XSA9IGl1Y3ZfbWVzc2FnZV9jb21wbGV0ZSwKKwkJWzB4MDhdID0gaXVjdl9tZXNzYWdlX3BlbmRpbmcsCisJCVsweDA5XSA9IGl1Y3ZfbWVzc2FnZV9wZW5kaW5nLAorCX07CisJc3RydWN0IGl1Y3Zfd29yayAqcDsKKworCS8qIFNlcmlhbGl6ZSB0YXNrbGV0LCBpdWN2X3BhdGhfc2V2ZXIgYW5kIGl1Y3ZfcGF0aF9jb25uZWN0LiAqLworCXNwaW5fbG9jaygmaXVjdl90YWJsZV9sb2NrKTsKKwlpdWN2X3Rhc2tsZXRfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJc3Bpbl9sb2NrX2lycSgmaXVjdl93b3JrX2xvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmaXVjdl93b3JrX3F1ZXVlKSkgeworCQlwID0gbGlzdF9lbnRyeShpdWN2X3dvcmtfcXVldWUubmV4dCwgc3RydWN0IGl1Y3Zfd29yaywgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJnAtPmxpc3QpOworCQlzcGluX3VubG9ja19pcnEoJml1Y3Zfd29ya19sb2NrKTsKKwkJaXJxX2ZuW3AtPmRhdGEuaXB0eXBlXSgmcC0+ZGF0YSk7CisJCWtmcmVlKHApOworCQlzcGluX2xvY2tfaXJxKCZpdWN2X3dvcmtfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmaXVjdl93b3JrX2xvY2spOworCisJaXVjdl90YXNrbGV0X2NwdSA9IC0xOworCXNwaW5fdW5sb2NrKCZpdWN2X3RhYmxlX2xvY2spOworfQorCisvKioKKyAqIGl1Y3ZfZXh0ZXJuYWxfaW50ZXJydXB0CisgKiBAY29kZTogaXJxIGNvZGUKKyAqCisgKiBIYW5kbGVzIGV4dGVybmFsIGludGVycnVwdHMgY29taW5nIGluIGZyb20gQ1AuCisgKiBQbGFjZXMgdGhlIGludGVycnVwdCBidWZmZXIgb24gYSBxdWV1ZSBhbmQgc2NoZWR1bGVzIGl1Y3ZfdGFza2xldF9oYW5kbGVyKCkuCisgKi8KK3N0YXRpYyB2b2lkIGl1Y3ZfZXh0ZXJuYWxfaW50ZXJydXB0KHUxNiBjb2RlKQoreworCXN0cnVjdCBpdWN2X2lycV9kYXRhICpwOworCXN0cnVjdCBpdWN2X3dvcmsgKndvcms7CisKKwlwID0gcGVyY3B1X3B0cihpdWN2X2lycV9kYXRhLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWlmIChwLT5pcHBhdGhpZCA+PSBpdWN2X21heF9wYXRoaWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXVjdl9kb19pbnQ6IEdvdCBpbnRlcnJ1cHQgd2l0aCAiCisJCSAgICAgICAicGF0aGlkICVkID4gbWF4X2Nvbm5lY3Rpb25zICglbGQpXG4iLAorCQkgICAgICAgcC0+aXBwYXRoaWQsIGl1Y3ZfbWF4X3BhdGhpZCAtIDEpOworCQlpdWN2X3NldmVyX3BhdGhpZChwLT5pcHBhdGhpZCwgaXVjdl9lcnJvcl9ub19saXN0ZW5lcik7CisJCXJldHVybjsKKwl9CisJaWYgKHAtPmlwdHlwZSAgPCAweDAxIHx8IHAtPmlwdHlwZSA+IDB4MDkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpdWN2X2RvX2ludDogdW5rbm93biBpdWN2IGludGVycnVwdFxuIik7CisJCXJldHVybjsKKwl9CisJd29yayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpdWN2X3dvcmspLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXdvcmspIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQ6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm47CisJfQorCW1lbWNweSgmd29yay0+ZGF0YSwgcCwgc2l6ZW9mKHdvcmstPmRhdGEpKTsKKwlzcGluX2xvY2soJml1Y3Zfd29ya19sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZ3b3JrLT5saXN0LCAmaXVjdl93b3JrX3F1ZXVlKTsKKwlzcGluX3VubG9jaygmaXVjdl93b3JrX2xvY2spOworCXRhc2tsZXRfc2NoZWR1bGUoJml1Y3ZfdGFza2xldCk7Cit9CisKKy8qKgorICogaXVjdl9pbml0CisgKgorICogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcy4KKyAqLworc3RhdGljIGludCBpdWN2X2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoIU1BQ0hJTkVfSVNfVk0pIHsKKwkJcmMgPSAtRVBST1RPTk9TVVBQT1JUOworCQlnb3RvIG91dDsKKwl9CisJcmMgPSBpdWN2X3F1ZXJ5X21heGNvbm4oKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXJjID0gcmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0ICgweDQwMDAsIGl1Y3ZfZXh0ZXJuYWxfaW50ZXJydXB0KTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXJjID0gYnVzX3JlZ2lzdGVyKCZpdWN2X2J1cyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9pbnQ7CisJaXVjdl9yb290ID0gczM5MF9yb290X2Rldl9yZWdpc3RlcigiaXVjdiIpOworCWlmIChJU19FUlIoaXVjdl9yb290KSkgeworCQlyYyA9IFBUUl9FUlIoaXVjdl9yb290KTsKKwkJZ290byBvdXRfYnVzOworCX0KKwkvKiBOb3RlOiBHRlBfRE1BIHVzZWQgdXNlZCB0byBnZXQgbWVtb3J5IGJlbG93IDJHICovCisJaXVjdl9pcnFfZGF0YSA9IHBlcmNwdV9hbGxvYyhzaXplb2Yoc3RydWN0IGl1Y3ZfaXJxX2RhdGEpLAorCQkJCSAgICAgR0ZQX0tFUk5FTHxHRlBfRE1BKTsKKwlpZiAoIWl1Y3ZfaXJxX2RhdGEpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yb290OworCX0KKwkvKiBBbGxvY2F0ZSBwYXJhbWV0ZXIgYmxvY2tzLiAqLworCWl1Y3ZfcGFyYW0gPSBwZXJjcHVfYWxsb2Moc2l6ZW9mKHVuaW9uIGl1Y3ZfcGFyYW0pLAorCQkJCSAgR0ZQX0tFUk5FTHxHRlBfRE1BKTsKKwlpZiAoIWl1Y3ZfcGFyYW0pIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9leHRpbnQ7CisJfQorCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmaXVjdl9jcHVfbm90aWZpZXIpOworCUFTQ0VCQyhpdWN2X2Vycm9yX25vX2xpc3RlbmVyLCAxNik7CisJQVNDRUJDKGl1Y3ZfZXJyb3Jfbm9fbWVtb3J5LCAxNik7CisJQVNDRUJDKGl1Y3ZfZXJyb3JfcGF0aGlkLCAxNik7CisJaXVjdl9hdmFpbGFibGUgPSAxOworCXJldHVybiAwOworCitvdXRfZXh0aW50OgorCXBlcmNwdV9mcmVlKGl1Y3ZfaXJxX2RhdGEpOworb3V0X3Jvb3Q6CisJczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7CitvdXRfYnVzOgorCWJ1c191bnJlZ2lzdGVyKCZpdWN2X2J1cyk7CitvdXRfaW50OgorCXVucmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4NDAwMCwgaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQpOworb3V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKiBpdWN2X2V4aXQKKyAqCisgKiBGcmVlcyBldmVyeXRoaW5nIGFsbG9jYXRlZCBmcm9tIGl1Y3ZfaW5pdC4KKyAqLworc3RhdGljIHZvaWQgaXVjdl9leGl0KHZvaWQpCit7CisJc3RydWN0IGl1Y3Zfd29yayAqcCwgKm47CisKKwlzcGluX2xvY2tfaXJxKCZpdWN2X3dvcmtfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG4sICZpdWN2X3dvcmtfcXVldWUsIGxpc3QpCisJCWtmcmVlKHApOworCXNwaW5fdW5sb2NrX2lycSgmaXVjdl93b3JrX2xvY2spOworCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZpdWN2X2NwdV9ub3RpZmllcik7CisJcGVyY3B1X2ZyZWUoaXVjdl9wYXJhbSk7CisJcGVyY3B1X2ZyZWUoaXVjdl9pcnFfZGF0YSk7CisJczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7CisJYnVzX3VucmVnaXN0ZXIoJml1Y3ZfYnVzKTsKKwl1bnJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCgweDQwMDAsIGl1Y3ZfZXh0ZXJuYWxfaW50ZXJydXB0KTsKK30KKworc3Vic3lzX2luaXRjYWxsKGl1Y3ZfaW5pdCk7Cittb2R1bGVfZXhpdChpdWN2X2V4aXQpOworCisvKioKKyAqIEV4cG9ydCBhbGwgcHVibGljIHN0dWZmCisgKi8KK0VYUE9SVF9TWU1CT0wgKGl1Y3ZfYnVzKTsKK0VYUE9SVF9TWU1CT0wgKGl1Y3Zfcm9vdCk7CitFWFBPUlRfU1lNQk9MIChpdWN2X3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wgKGl1Y3ZfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MIChpdWN2X3BhdGhfYWNjZXB0KTsKK0VYUE9SVF9TWU1CT0wgKGl1Y3ZfcGF0aF9jb25uZWN0KTsKK0VYUE9SVF9TWU1CT0wgKGl1Y3ZfcGF0aF9xdWllc2NlKTsKK0VYUE9SVF9TWU1CT0wgKGl1Y3ZfcGF0aF9zZXZlcik7CitFWFBPUlRfU1lNQk9MIChpdWN2X21lc3NhZ2VfcHVyZ2UpOworRVhQT1JUX1NZTUJPTCAoaXVjdl9tZXNzYWdlX3JlY2VpdmUpOworRVhQT1JUX1NZTUJPTCAoaXVjdl9tZXNzYWdlX3JlamVjdCk7CitFWFBPUlRfU1lNQk9MIChpdWN2X21lc3NhZ2VfcmVwbHkpOworRVhQT1JUX1NZTUJPTCAoaXVjdl9tZXNzYWdlX3NlbmQpOworRVhQT1JUX1NZTUJPTCAoaXVjdl9tZXNzYWdlX3NlbmQyd2F5KTsKKworTU9EVUxFX0FVVEhPUigiKEMpIDIwMDEgSUJNIENvcnAuIGJ5IEZyaXR6IEVsZmVydCAoZmVsZmVydEBtaWxsZW51eC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxpbnV4IGZvciBTLzM5MCBJVUNWIGxvd2xldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2tleS9hZl9rZXkuYyBiL25ldC9rZXkvYWZfa2V5LmMKaW5kZXggNWRkNTA5NC4uYjRlNDQ0MCAxMDA2NDQKLS0tIGEvbmV0L2tleS9hZl9rZXkuYworKysgYi9uZXQva2V5L2FmX2tleS5jCkBAIC0yMzQ1LDYgKzIzNDUsMTk2IEBACiAJcmV0dXJuIGVycjsKIH0KIAorI2lmZGVmIENPTkZJR19ORVRfS0VZX01JR1JBVEUKK3N0YXRpYyBpbnQgcGZrZXlfc29ja2FkZHJfcGFpcl9zaXplKHNhX2ZhbWlseV90IGZhbWlseSkKK3sKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIFBGS0VZX0FMSUdOOChzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSAqIDIpOworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBQRktFWV9BTElHTjgoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpICogMik7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgaW50IHBhcnNlX3NvY2thZGRyX3BhaXIoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKnJxLAorCQkJICAgICAgIHhmcm1fYWRkcmVzc190ICpzYWRkciwgeGZybV9hZGRyZXNzX3QgKmRhZGRyLAorCQkJICAgICAgIHUxNiAqZmFtaWx5KQoreworCXN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopKHJxICsgMSk7CisJaWYgKHJxLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X2xlbiA8CisJICAgIHBma2V5X3NvY2thZGRyX3BhaXJfc2l6ZShzYS0+c2FfZmFtaWx5KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworCQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhOworCQkJaWYgKChzaW4rMSktPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW1lbWNweSgmc2FkZHItPmE0LCAmc2luLT5zaW5fYWRkciwgc2l6ZW9mKHNhZGRyLT5hNCkpOworCQkJc2luKys7CisJCQltZW1jcHkoJmRhZGRyLT5hNCwgJnNpbi0+c2luX2FkZHIsIHNpemVvZihkYWRkci0+YTQpKTsKKwkJCSpmYW1pbHkgPSBBRl9JTkVUOworCQkJYnJlYWs7CisJCX0KKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwljYXNlIEFGX0lORVQ2OgorCQl7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworCQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2E7CisJCQlpZiAoKHNpbjYrMSktPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJbWVtY3B5KCZzYWRkci0+YTYsICZzaW42LT5zaW42X2FkZHIsCisJCQkgICAgICAgc2l6ZW9mKHNhZGRyLT5hNikpOworCQkJc2luNisrOworCQkJbWVtY3B5KCZkYWRkci0+YTYsICZzaW42LT5zaW42X2FkZHIsCisJCQkgICAgICAgc2l6ZW9mKGRhZGRyLT5hNikpOworCQkJKmZhbWlseSA9IEFGX0lORVQ2OworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwc2VjcmVxdWVzdHNfdG9fbWlncmF0ZShzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCAqcnExLCBpbnQgbGVuLAorCQkJCSAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptKQoreworCWludCBlcnI7CisJc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKnJxMjsKKworCWlmIChsZW4gPD0gc2l6ZW9mKHN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0KSB8fAorCSAgICBsZW4gPCBycTEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9sZCBlbmRvaW50cyAqLworCWVyciA9IHBhcnNlX3NvY2thZGRyX3BhaXIocnExLCAmbS0+b2xkX3NhZGRyLCAmbS0+b2xkX2RhZGRyLAorCQkJCSAgJm0tPm9sZF9mYW1pbHkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlycTIgPSAoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKikoKHU4ICopcnExICsgcnExLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X2xlbik7CisJbGVuIC09IHJxMS0+c2FkYl94X2lwc2VjcmVxdWVzdF9sZW47CisKKwlpZiAobGVuIDw9IHNpemVvZihzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCkgfHwKKwkgICAgbGVuIDwgcnEyLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBuZXcgZW5kcG9pbnRzICovCisJZXJyID0gcGFyc2Vfc29ja2FkZHJfcGFpcihycTIsICZtLT5uZXdfc2FkZHIsICZtLT5uZXdfZGFkZHIsCisJCQkJICAmbS0+bmV3X2ZhbWlseSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChycTEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfcHJvdG8gIT0gcnEyLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X3Byb3RvIHx8CisJICAgIHJxMS0+c2FkYl94X2lwc2VjcmVxdWVzdF9tb2RlICE9IHJxMi0+c2FkYl94X2lwc2VjcmVxdWVzdF9tb2RlIHx8CisJICAgIHJxMS0+c2FkYl94X2lwc2VjcmVxdWVzdF9yZXFpZCAhPSBycTItPnNhZGJfeF9pcHNlY3JlcXVlc3RfcmVxaWQpCisJCXJldHVybiAtRUlOVkFMOworCisJbS0+cHJvdG8gPSBycTEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfcHJvdG87CisJbS0+bW9kZSA9IHJxMS0+c2FkYl94X2lwc2VjcmVxdWVzdF9tb2RlIC0gMTsKKwltLT5yZXFpZCA9IHJxMS0+c2FkYl94X2lwc2VjcmVxdWVzdF9yZXFpZDsKKworCXJldHVybiAoKGludCkocnExLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X2xlbiArCisJCSAgICAgIHJxMi0+c2FkYl94X2lwc2VjcmVxdWVzdF9sZW4pKTsKK30KKworc3RhdGljIGludCBwZmtleV9taWdyYXRlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSBzdHJ1Y3Qgc2FkYl9tc2cgKmhkciwgdm9pZCAqKmV4dF9oZHJzKQoreworCWludCBpLCBsZW4sIHJldCwgZXJyID0gLUVJTlZBTDsKKwl1OCBkaXI7CisJc3RydWN0IHNhZGJfYWRkcmVzcyAqc2E7CisJc3RydWN0IHNhZGJfeF9wb2xpY3kgKnBvbDsKKwlzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCAqcnE7CisJc3RydWN0IHhmcm1fc2VsZWN0b3Igc2VsOworCXN0cnVjdCB4ZnJtX21pZ3JhdGUgbVtYRlJNX01BWF9ERVBUSF07CisKKwlpZiAoIXByZXNlbnRfYW5kX3NhbWVfZmFtaWx5KGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfU1JDIC0gMV0sCisJICAgIGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfRFNUIC0gMV0pIHx8CisJICAgICFleHRfaGRyc1tTQURCX1hfRVhUX1BPTElDWSAtIDFdKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXBvbCA9IGV4dF9oZHJzW1NBREJfWF9FWFRfUE9MSUNZIC0gMV07CisJaWYgKCFwb2wpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHBvbC0+c2FkYl94X3BvbGljeV9kaXIgPj0gSVBTRUNfRElSX01BWCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlkaXIgPSBwb2wtPnNhZGJfeF9wb2xpY3lfZGlyIC0gMTsKKwltZW1zZXQoJnNlbCwgMCwgc2l6ZW9mKHNlbCkpOworCisJLyogc2V0IHNvdXJjZSBhZGRyZXNzIGluZm8gb2Ygc2VsZWN0b3IgKi8KKwlzYSA9IGV4dF9oZHJzW1NBREJfRVhUX0FERFJFU1NfU1JDIC0gMV07CisJc2VsLmZhbWlseSA9IHBma2V5X3NhZGJfYWRkcjJ4ZnJtX2FkZHIoc2EsICZzZWwuc2FkZHIpOworCXNlbC5wcmVmaXhsZW5fcyA9IHNhLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuOworCXNlbC5wcm90byA9IHBma2V5X3Byb3RvX3RvX3hmcm0oc2EtPnNhZGJfYWRkcmVzc19wcm90byk7CisJc2VsLnNwb3J0ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoc2EgKyAxKSktPnNpbl9wb3J0OworCWlmIChzZWwuc3BvcnQpCisJCXNlbC5zcG9ydF9tYXNrID0gfjA7CisKKwkvKiBzZXQgZGVzdGluYXRpb24gYWRkcmVzcyBpbmZvIG9mIHNlbGVjdG9yICovCisJc2EgPSBleHRfaGRyc1tTQURCX0VYVF9BRERSRVNTX0RTVCAtIDFdLAorCXBma2V5X3NhZGJfYWRkcjJ4ZnJtX2FkZHIoc2EsICZzZWwuZGFkZHIpOworCXNlbC5wcmVmaXhsZW5fZCA9IHNhLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuOworCXNlbC5wcm90byA9IHBma2V5X3Byb3RvX3RvX3hmcm0oc2EtPnNhZGJfYWRkcmVzc19wcm90byk7CisJc2VsLmRwb3J0ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoc2EgKyAxKSktPnNpbl9wb3J0OworCWlmIChzZWwuZHBvcnQpCisJCXNlbC5kcG9ydF9tYXNrID0gfjA7CisKKwlycSA9IChzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCAqKShwb2wgKyAxKTsKKworCS8qIGV4dHJhY3QgaXBzZWNyZXF1ZXN0cyAqLworCWkgPSAwOworCWxlbiA9IHBvbC0+c2FkYl94X3BvbGljeV9sZW4gKiA4IC0gc2l6ZW9mKHN0cnVjdCBzYWRiX3hfcG9saWN5KTsKKworCXdoaWxlIChsZW4gPiAwICYmIGkgPCBYRlJNX01BWF9ERVBUSCkgeworCQlyZXQgPSBpcHNlY3JlcXVlc3RzX3RvX21pZ3JhdGUocnEsIGxlbiwgJm1baV0pOworCQlpZiAocmV0IDwgMCkgeworCQkJZXJyID0gcmV0OworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQlycSA9IChzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCAqKSgodTggKilycSArIHJldCk7CisJCQlsZW4gLT0gcmV0OworCQkJaSsrOworCQl9CisJfQorCisJaWYgKCFpIHx8IGxlbiA+IDApIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0dXJuIHhmcm1fbWlncmF0ZSgmc2VsLCBkaXIsIFhGUk1fUE9MSUNZX1RZUEVfTUFJTiwgbSwgaSk7CisKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKyNlbHNlCitzdGF0aWMgaW50IHBma2V5X21pZ3JhdGUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIHN0cnVjdCBzYWRiX21zZyAqaGRyLCB2b2lkICoqZXh0X2hkcnMpCit7CisJcmV0dXJuIC1FTk9QUk9UT09QVDsKK30KKyNlbmRpZgorCisKIHN0YXRpYyBpbnQgcGZrZXlfc3BkZ2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNhZGJfbXNnICpoZHIsIHZvaWQgKipleHRfaGRycykKIHsKIAl1bnNpZ25lZCBpbnQgZGlyOwpAQCAtMjQ3Myw2ICsyNjYzLDcgQEAKIAlbU0FEQl9YX1NQREZMVVNIXQk9IHBma2V5X3NwZGZsdXNoLAogCVtTQURCX1hfU1BEU0VUSURYXQk9IHBma2V5X3NwZGFkZCwKIAlbU0FEQl9YX1NQRERFTEVURTJdCT0gcGZrZXlfc3BkZ2V0LAorCVtTQURCX1hfTUlHUkFURV0JPSBwZmtleV9taWdyYXRlLAogfTsKIAogc3RhdGljIGludCBwZmtleV9wcm9jZXNzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNhZGJfbXNnICpoZHIpCkBAIC0zMTE4LDYgKzMzMDksMjM2IEBACiAJcmV0dXJuIHBma2V5X2Jyb2FkY2FzdChza2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9SRUdJU1RFUkVELCBOVUxMKTsKIH0KIAorI2lmZGVmIENPTkZJR19ORVRfS0VZX01JR1JBVEUKK3N0YXRpYyBpbnQgc2V0X3NhZGJfYWRkcmVzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgc2FzaXplLCBpbnQgdHlwZSwKKwkJCSAgICBzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsKQoreworCXN0cnVjdCBzYWRiX2FkZHJlc3MgKmFkZHI7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW47CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKKyNlbmRpZgorCWFkZHIgPSAoc3RydWN0IHNhZGJfYWRkcmVzcyAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykgKyBzYXNpemUpOworCWFkZHItPnNhZGJfYWRkcmVzc19sZW4gPSAoc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpICsgc2FzaXplKS84OworCWFkZHItPnNhZGJfYWRkcmVzc19leHR0eXBlID0gdHlwZTsKKwlhZGRyLT5zYWRiX2FkZHJlc3NfcHJvdG8gPSBzZWwtPnByb3RvOworCWFkZHItPnNhZGJfYWRkcmVzc19yZXNlcnZlZCA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNBREJfRVhUX0FERFJFU1NfU1JDOgorCQlpZiAoc2VsLT5mYW1pbHkgPT0gQUZfSU5FVCkgeworCQkJYWRkci0+c2FkYl9hZGRyZXNzX3ByZWZpeGxlbiA9IHNlbC0+cHJlZml4bGVuX3M7CisJCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopKGFkZHIgKyAxKTsKKwkJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQltZW1jcHkoJnNpbi0+c2luX2FkZHIuc19hZGRyLCAmc2VsLT5zYWRkciwKKwkJCSAgICAgICBzaXplb2Yoc2luLT5zaW5fYWRkci5zX2FkZHIpKTsKKwkJCXNpbi0+c2luX3BvcnQgPSAwOworCQkJbWVtc2V0KHNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CisJCX0KKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwkJZWxzZSBpZiAoc2VsLT5mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJCWFkZHItPnNhZGJfYWRkcmVzc19wcmVmaXhsZW4gPSBzZWwtPnByZWZpeGxlbl9zOworCQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKGFkZHIgKyAxKTsKKwkJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQlzaW42LT5zaW42X3BvcnQgPSAwOworCQkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CisJCQlzaW42LT5zaW42X3Njb3BlX2lkID0gMDsKKwkJCW1lbWNweSgmc2luNi0+c2luNl9hZGRyLnM2X2FkZHIsICZzZWwtPnNhZGRyLAorCQkJICAgICAgIHNpemVvZihzaW42LT5zaW42X2FkZHIuczZfYWRkcikpOworCQl9CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBTQURCX0VYVF9BRERSRVNTX0RTVDoKKwkJaWYgKHNlbC0+ZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJCWFkZHItPnNhZGJfYWRkcmVzc19wcmVmaXhsZW4gPSBzZWwtPnByZWZpeGxlbl9kOworCQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShhZGRyICsgMSk7CisJCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJbWVtY3B5KCZzaW4tPnNpbl9hZGRyLnNfYWRkciwgJnNlbC0+ZGFkZHIsCisJCQkgICAgICAgc2l6ZW9mKHNpbi0+c2luX2FkZHIuc19hZGRyKSk7CisJCQlzaW4tPnNpbl9wb3J0ID0gMDsKKwkJCW1lbXNldChzaW4tPnNpbl96ZXJvLCAwLCBzaXplb2Yoc2luLT5zaW5femVybykpOworCQl9CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJCWVsc2UgaWYgKHNlbC0+ZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQlhZGRyLT5zYWRiX2FkZHJlc3NfcHJlZml4bGVuID0gc2VsLT5wcmVmaXhsZW5fZDsKKwkJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKShhZGRyICsgMSk7CisJCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJc2luNi0+c2luNl9wb3J0ID0gMDsKKwkJCXNpbjYtPnNpbjZfZmxvd2luZm8gPSAwOworCQkJc2luNi0+c2luNl9zY29wZV9pZCA9IDA7CisJCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkci5zNl9hZGRyLCAmc2VsLT5kYWRkciwKKwkJCSAgICAgICBzaXplb2Yoc2luNi0+c2luNl9hZGRyLnM2X2FkZHIpKTsKKwkJfQorI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9pcHNlY3JlcXVlc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICB1aW50OF90IHByb3RvLCB1aW50OF90IG1vZGUsIGludCBsZXZlbCwKKwkJCSAgICB1aW50MzJfdCByZXFpZCwgdWludDhfdCBmYW1pbHksCisJCQkgICAgeGZybV9hZGRyZXNzX3QgKnNyYywgeGZybV9hZGRyZXNzX3QgKmRzdCkKK3sKKwlzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCAqcnE7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW47CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKKyNlbmRpZgorCWludCBzaXplX3JlcTsKKworCXNpemVfcmVxID0gc2l6ZW9mKHN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0KSArCisJCSAgIHBma2V5X3NvY2thZGRyX3BhaXJfc2l6ZShmYW1pbHkpOworCisJcnEgPSAoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKilza2JfcHV0KHNrYiwgc2l6ZV9yZXEpOworCW1lbXNldChycSwgMCwgc2l6ZV9yZXEpOworCXJxLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X2xlbiA9IHNpemVfcmVxOworCXJxLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X3Byb3RvID0gcHJvdG87CisJcnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbW9kZSA9IG1vZGU7CisJcnEtPnNhZGJfeF9pcHNlY3JlcXVlc3RfbGV2ZWwgPSBsZXZlbDsKKwlycS0+c2FkYl94X2lwc2VjcmVxdWVzdF9yZXFpZCA9IHJlcWlkOworCisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikocnEgKyAxKTsKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJbWVtY3B5KCZzaW4tPnNpbl9hZGRyLnNfYWRkciwgc3JjLAorCQkgICAgICAgc2l6ZW9mKHNpbi0+c2luX2FkZHIuc19hZGRyKSk7CisJCXNpbisrOworCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQltZW1jcHkoJnNpbi0+c2luX2FkZHIuc19hZGRyLCBkc3QsCisJCSAgICAgICBzaXplb2Yoc2luLT5zaW5fYWRkci5zX2FkZHIpKTsKKwkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJY2FzZSBBRl9JTkVUNjoKKwkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKHJxICsgMSk7CisJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCXNpbjYtPnNpbjZfcG9ydCA9IDA7CisJCXNpbjYtPnNpbjZfZmxvd2luZm8gPSAwOworCQlzaW42LT5zaW42X3Njb3BlX2lkID0gMDsKKwkJbWVtY3B5KCZzaW42LT5zaW42X2FkZHIuczZfYWRkciwgc3JjLAorCQkgICAgICAgc2l6ZW9mKHNpbjYtPnNpbjZfYWRkci5zNl9hZGRyKSk7CisJCXNpbjYrKzsKKwkJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJc2luNi0+c2luNl9wb3J0ID0gMDsKKwkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CisJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOworCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkci5zNl9hZGRyLCBkc3QsCisJCSAgICAgICBzaXplb2Yoc2luNi0+c2luNl9hZGRyLnM2X2FkZHIpKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVF9LRVlfTUlHUkFURQorc3RhdGljIGludCBwZmtleV9zZW5kX21pZ3JhdGUoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLAorCQkJICAgICAgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9idW5kbGVzKQoreworCWludCBpOworCWludCBzYXNpemVfc2VsOworCWludCBzaXplID0gMDsKKwlpbnQgc2l6ZV9wb2wgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNhZGJfbXNnICpoZHI7CisJc3RydWN0IHNhZGJfeF9wb2xpY3kgKnBvbDsKKwlzdHJ1Y3QgeGZybV9taWdyYXRlICptcDsKKworCWlmICh0eXBlICE9IFhGUk1fUE9MSUNZX1RZUEVfTUFJTikKKwkJcmV0dXJuIDA7CisKKwlpZiAobnVtX2J1bmRsZXMgPD0gMCB8fCBudW1fYnVuZGxlcyA+IFhGUk1fTUFYX0RFUFRIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHNlbGVjdG9yICovCisJc2FzaXplX3NlbCA9IHBma2V5X3NvY2thZGRyX3NpemUoc2VsLT5mYW1pbHkpOworCWlmICghc2FzaXplX3NlbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2l6ZSArPSAoc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpICsgc2FzaXplX3NlbCkgKiAyOworCisJLyogcG9saWN5IGluZm8gKi8KKwlzaXplX3BvbCArPSBzaXplb2Yoc3RydWN0IHNhZGJfeF9wb2xpY3kpOworCisJLyogaXBzZWNyZXF1ZXN0cyAqLworCWZvciAoaSA9IDAsIG1wID0gbTsgaSA8IG51bV9idW5kbGVzOyBpKyssIG1wKyspIHsKKwkJLyogb2xkIGxvY2F0b3IgcGFpciAqLworCQlzaXplX3BvbCArPSBzaXplb2Yoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QpICsKKwkJCSAgICBwZmtleV9zb2NrYWRkcl9wYWlyX3NpemUobXAtPm9sZF9mYW1pbHkpOworCQkvKiBuZXcgbG9jYXRvciBwYWlyICovCisJCXNpemVfcG9sICs9IHNpemVvZihzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCkgKworCQkJICAgIHBma2V5X3NvY2thZGRyX3BhaXJfc2l6ZShtcC0+bmV3X2ZhbWlseSk7CisJfQorCisJc2l6ZSArPSBzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSArIHNpemVfcG9sOworCisJLyogYWxsb2MgYnVmZmVyICovCisJc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZHIgPSAoc3RydWN0IHNhZGJfbXNnICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpKTsKKwloZHItPnNhZGJfbXNnX3ZlcnNpb24gPSBQRl9LRVlfVjI7CisJaGRyLT5zYWRiX21zZ190eXBlID0gU0FEQl9YX01JR1JBVEU7CisJaGRyLT5zYWRiX21zZ19zYXR5cGUgPSBwZmtleV9wcm90bzJzYXR5cGUobS0+cHJvdG8pOworCWhkci0+c2FkYl9tc2dfbGVuID0gc2l6ZSAvIDg7CisJaGRyLT5zYWRiX21zZ19lcnJubyA9IDA7CisJaGRyLT5zYWRiX21zZ19yZXNlcnZlZCA9IDA7CisJaGRyLT5zYWRiX21zZ19zZXEgPSAwOworCWhkci0+c2FkYl9tc2dfcGlkID0gMDsKKworCS8qIHNlbGVjdG9yIHNyYyAqLworCXNldF9zYWRiX2FkZHJlc3Moc2tiLCBzYXNpemVfc2VsLCBTQURCX0VYVF9BRERSRVNTX1NSQywgc2VsKTsKKworCS8qIHNlbGVjdG9yIGRzdCAqLworCXNldF9zYWRiX2FkZHJlc3Moc2tiLCBzYXNpemVfc2VsLCBTQURCX0VYVF9BRERSRVNTX0RTVCwgc2VsKTsKKworCS8qIHBvbGljeSBpbmZvcm1hdGlvbiAqLworCXBvbCA9IChzdHJ1Y3Qgc2FkYl94X3BvbGljeSAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IHNhZGJfeF9wb2xpY3kpKTsKKwlwb2wtPnNhZGJfeF9wb2xpY3lfbGVuID0gc2l6ZV9wb2wgLyA4OworCXBvbC0+c2FkYl94X3BvbGljeV9leHR0eXBlID0gU0FEQl9YX0VYVF9QT0xJQ1k7CisJcG9sLT5zYWRiX3hfcG9saWN5X3R5cGUgPSBJUFNFQ19QT0xJQ1lfSVBTRUM7CisJcG9sLT5zYWRiX3hfcG9saWN5X2RpciA9IGRpciArIDE7CisJcG9sLT5zYWRiX3hfcG9saWN5X2lkID0gMDsKKwlwb2wtPnNhZGJfeF9wb2xpY3lfcHJpb3JpdHkgPSAwOworCisJZm9yIChpID0gMCwgbXAgPSBtOyBpIDwgbnVtX2J1bmRsZXM7IGkrKywgbXArKykgeworCQkvKiBvbGQgaXBzZWNyZXF1ZXN0ICovCisJCWlmIChzZXRfaXBzZWNyZXF1ZXN0KHNrYiwgbXAtPnByb3RvLCBtcC0+bW9kZSArIDEsCisJCQkJICAgICAobXAtPnJlcWlkID8gIElQU0VDX0xFVkVMX1VOSVFVRSA6IElQU0VDX0xFVkVMX1JFUVVJUkUpLAorCQkJCSAgICAgbXAtPnJlcWlkLCBtcC0+b2xkX2ZhbWlseSwKKwkJCQkgICAgICZtcC0+b2xkX3NhZGRyLCAmbXAtPm9sZF9kYWRkcikgPCAwKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIG5ldyBpcHNlY3JlcXVlc3QgKi8KKwkJaWYgKHNldF9pcHNlY3JlcXVlc3Qoc2tiLCBtcC0+cHJvdG8sIG1wLT5tb2RlICsgMSwKKwkJCQkgICAgIChtcC0+cmVxaWQgPyBJUFNFQ19MRVZFTF9VTklRVUUgOiBJUFNFQ19MRVZFTF9SRVFVSVJFKSwKKwkJCQkgICAgIG1wLT5yZXFpZCwgbXAtPm5ld19mYW1pbHksCisJCQkJICAgICAmbXAtPm5ld19zYWRkciwgJm1wLT5uZXdfZGFkZHIpIDwgMCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBicm9hZGNhc3QgbWlncmF0ZSBtZXNzYWdlIHRvIHNvY2tldHMgKi8KKwlwZmtleV9icm9hZGNhc3Qoc2tiLCBHRlBfQVRPTUlDLCBCUk9BRENBU1RfQUxMLCBOVUxMKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgcGZrZXlfc2VuZF9taWdyYXRlKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHU4IGRpciwgdTggdHlwZSwKKwkJCSAgICAgIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fYnVuZGxlcykKK3sKKwlyZXR1cm4gLUVOT1BST1RPT1BUOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgcGZrZXlfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmtpb2NiLAogCQkJIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKQEAgLTMyODcsNiArMzcwOCw3IEBACiAJLmNvbXBpbGVfcG9saWN5CT0gcGZrZXlfY29tcGlsZV9wb2xpY3ksCiAJLm5ld19tYXBwaW5nCT0gcGZrZXlfc2VuZF9uZXdfbWFwcGluZywKIAkubm90aWZ5X3BvbGljeQk9IHBma2V5X3NlbmRfcG9saWN5X25vdGlmeSwKKwkubWlncmF0ZQk9IHBma2V5X3NlbmRfbWlncmF0ZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcHNlY19wZmtleV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggODAxMDdkNC4uNzQ4ZjdmMCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMjM1LDYgKzIzNSwxOSBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIE5GX0NPTk5UUkFDS19TQU5FCisJdHJpc3RhdGUgIlNBTkUgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORl9DT05OVFJBQ0sKKwloZWxwCisJICBTQU5FIGlzIGEgcHJvdG9jb2wgZm9yIHJlbW90ZSBhY2Nlc3MgdG8gc2Nhbm5lcnMgYXMgaW1wbGVtZW50ZWQKKwkgIGJ5IHRoZSAnc2FuZWQnIGRhZW1vbi4gTGlrZSBGVFAsIGl0IHVzZXMgc2VwYXJhdGUgY29udHJvbCBhbmQKKwkgIGRhdGEgY29ubmVjdGlvbnMuCisKKwkgIFdpdGggdGhpcyBtb2R1bGUgeW91IGNhbiBzdXBwb3J0IFNBTkUgb24gYSBjb25uZWN0aW9uIHRyYWNraW5nCisJICBmaXJld2FsbC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBORl9DT05OVFJBQ0tfU0lQCiAJdHJpc3RhdGUgIlNJUCBwcm90b2NvbCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSwpAQCAtMzgyLDYgKzM5NSwzMiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTCisJdHJpc3RhdGUgJyJUQ1BNU1MiIHRhcmdldCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMgJiYgKElQVjYgfHwgSVBWNj1uKQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgVENQTVNTJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB5b3UgdG8gYWx0ZXIgdGhlCisJICBNU1MgdmFsdWUgb2YgVENQIFNZTiBwYWNrZXRzLCB0byBjb250cm9sIHRoZSBtYXhpbXVtIHNpemUgZm9yIHRoYXQKKwkgIGNvbm5lY3Rpb24gKHVzdWFsbHkgbGltaXRpbmcgaXQgdG8geW91ciBvdXRnb2luZyBpbnRlcmZhY2UncyBNVFUKKwkgIG1pbnVzIDQwKS4KKworCSAgVGhpcyBpcyB1c2VkIHRvIG92ZXJjb21lIGNyaW1pbmFsbHkgYnJhaW5kZWFkIElTUHMgb3Igc2VydmVycyB3aGljaAorCSAgYmxvY2sgSUNNUCBGcmFnbWVudGF0aW9uIE5lZWRlZCBwYWNrZXRzLiAgVGhlIHN5bXB0b21zIG9mIHRoaXMKKwkgIHByb2JsZW0gYXJlIHRoYXQgZXZlcnl0aGluZyB3b3JrcyBmaW5lIGZyb20geW91ciBMaW51eAorCSAgZmlyZXdhbGwvcm91dGVyLCBidXQgbWFjaGluZXMgYmVoaW5kIGl0IGNhbiBuZXZlciBleGNoYW5nZSBsYXJnZQorCSAgcGFja2V0czoKKwkgICAgICAgIDEpIFdlYiBicm93c2VycyBjb25uZWN0LCB0aGVuIGhhbmcgd2l0aCBubyBkYXRhIHJlY2VpdmVkLgorCSAgICAgICAgMikgU21hbGwgbWFpbCB3b3JrcyBmaW5lLCBidXQgbGFyZ2UgZW1haWxzIGhhbmcuCisJICAgICAgICAzKSBzc2ggd29ya3MgZmluZSwgYnV0IHNjcCBoYW5ncyBhZnRlciBpbml0aWFsIGhhbmRzaGFraW5nLgorCisJICBXb3JrYXJvdW5kOiBhY3RpdmF0ZSB0aGlzIG9wdGlvbiBhbmQgYWRkIGEgcnVsZSB0byB5b3VyIGZpcmV3YWxsCisJICBjb25maWd1cmF0aW9uIGxpa2U6CisKKwkgIGlwdGFibGVzIC1BIEZPUldBUkQgLXAgdGNwIC0tdGNwLWZsYWdzIFNZTixSU1QgU1lOIFwKKwkgICAgICAgICAgICAgICAgIC1qIFRDUE1TUyAtLWNsYW1wLW1zcy10by1wbXR1CisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQKIAl0cmlzdGF0ZSAgJyJjb21tZW50IiBtYXRjaCBzdXBwb3J0JwogCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDVkYzU1NzQuLmIyYjVjNzUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMjksNiArMjksNyBAQAogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19JUkMpICs9IG5mX2Nvbm50cmFja19pcmMubwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TKSArPSBuZl9jb25udHJhY2tfbmV0Ymlvc19ucy5vCiBvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX1BQVFApICs9IG5mX2Nvbm50cmFja19wcHRwLm8KK29iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfU0FORSkgKz0gbmZfY29ubnRyYWNrX3NhbmUubwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19TSVApICs9IG5mX2Nvbm50cmFja19zaXAubwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19URlRQKSArPSBuZl9jb25udHJhY2tfdGZ0cC5vCiAKQEAgLTQ0LDYgKzQ1LDcgQEAKIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HKSArPSB4dF9ORkxPRy5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLKSArPSB4dF9OT1RSQUNLLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1NFQ01BUkspICs9IHh0X1NFQ01BUksubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTKSArPSB4dF9UQ1BNU1Mubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTlNFQ01BUkspICs9IHh0X0NPTk5TRUNNQVJLLm8KIAogIyBtYXRjaGVzCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCmluZGV4IDYyNmIwMDEuLjZmY2NkY2YgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCkBAIC02MCwxMiArNjAsOSBAQAogICAgIElmIGl0J3Mgbm9uLXplcm8sIHdlIG1hcmsgb25seSBvdXQgb2Ygd2luZG93IFJTVCBzZWdtZW50cyBhcyBJTlZBTElELiAqLwogaW50IG5mX2N0X3RjcF9iZV9saWJlcmFsIF9fcmVhZF9tb3N0bHkgPSAwOwogCi0vKiBXaGVuIGNvbm5lY3Rpb24gaXMgcGlja2VkIHVwIGZyb20gdGhlIG1pZGRsZSwgaG93IG1hbnkgcGFja2V0cyBhcmUgcmVxdWlyZWQKLSAgIHRvIHBhc3MgaW4gZWFjaCBkaXJlY3Rpb24gd2hlbiB3ZSBhc3N1bWUgd2UgYXJlIGluIHN5bmMgLSBpZiBhbnkgc2lkZSB1c2VzCi0gICB3aW5kb3cgc2NhbGluZywgd2UgbG9zdCB0aGUgZ2FtZS4gCi0gICBJZiBpdCBpcyBzZXQgdG8gemVybywgd2UgZGlzYWJsZSBwaWNraW5nIHVwIGFscmVhZHkgZXN0YWJsaXNoZWQgCisvKiBJZiBpdCBpcyBzZXQgdG8gemVybywgd2UgZGlzYWJsZSBwaWNraW5nIHVwIGFscmVhZHkgZXN0YWJsaXNoZWQKICAgIGNvbm5lY3Rpb25zLiAqLwotaW50IG5mX2N0X3RjcF9sb29zZSBfX3JlYWRfbW9zdGx5ID0gMzsKK2ludCBuZl9jdF90Y3BfbG9vc2UgX19yZWFkX21vc3RseSA9IDE7CiAKIC8qIE1heCBudW1iZXIgb2YgdGhlIHJldHJhbnNtaXR0ZWQgcGFja2V0cyB3aXRob3V0IHJlY2VpdmluZyBhbiAoYWNjZXB0YWJsZSkgCiAgICBBQ0sgZnJvbSB0aGUgZGVzdGluYXRpb24uIElmIHRoaXMgbnVtYmVyIGlzIHJlYWNoZWQsIGEgc2hvcnRlciB0aW1lciAKQEAgLTY1MCwxMSArNjQ3LDEwIEBACiAJICAgIAliZWZvcmUoc2FjaywgcmVjZWl2ZXItPnRkX2VuZCArIDEpLAogCSAgICAJYWZ0ZXIoYWNrLCByZWNlaXZlci0+dGRfZW5kIC0gTUFYQUNLV0lORE9XKHNlbmRlcikpKTsKIAotCWlmIChzZW5kZXItPmxvb3NlIHx8IHJlY2VpdmVyLT5sb29zZSB8fAotCSAgICAoYmVmb3JlKHNlcSwgc2VuZGVyLT50ZF9tYXhlbmQgKyAxKSAmJgotCSAgICAgYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX2VuZCAtIHJlY2VpdmVyLT50ZF9tYXh3aW4gLSAxKSAmJgotCSAgICAgYmVmb3JlKHNhY2ssIHJlY2VpdmVyLT50ZF9lbmQgKyAxKSAmJgotCSAgICAgYWZ0ZXIoYWNrLCByZWNlaXZlci0+dGRfZW5kIC0gTUFYQUNLV0lORE9XKHNlbmRlcikpKSkgeworCWlmIChiZWZvcmUoc2VxLCBzZW5kZXItPnRkX21heGVuZCArIDEpICYmCisJICAgIGFmdGVyKGVuZCwgc2VuZGVyLT50ZF9lbmQgLSByZWNlaXZlci0+dGRfbWF4d2luIC0gMSkgJiYKKwkgICAgYmVmb3JlKHNhY2ssIHJlY2VpdmVyLT50ZF9lbmQgKyAxKSAmJgorCSAgICBhZnRlcihhY2ssIHJlY2VpdmVyLT50ZF9lbmQgLSBNQVhBQ0tXSU5ET1coc2VuZGVyKSkpIHsKIAkgICAgCS8qCiAJCSAqIFRha2UgaW50byBhY2NvdW50IHdpbmRvdyBzY2FsaW5nIChSRkMgMTMyMykuCiAJCSAqLwpAQCAtNjk5LDE1ICs2OTUsMTMgQEAKIAkJCQlzdGF0ZS0+cmV0cmFucyA9IDA7CiAJCQl9CiAJCX0KLQkJLyoKLQkJICogQ2xvc2UgdGhlIHdpbmRvdyBvZiBkaXNhYmxlZCB3aW5kb3cgdHJhY2tpbmcgOi0pCi0JCSAqLwotCQlpZiAoc2VuZGVyLT5sb29zZSkKLQkJCXNlbmRlci0+bG9vc2UtLTsKLQogCQlyZXMgPSAxOwogCX0gZWxzZSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCisJCXJlcyA9IDA7CisJCWlmIChzZW5kZXItPmZsYWdzICYgSVBfQ1RfVENQX0ZMQUdfQkVfTElCRVJBTCB8fAorCQkgICAgbmZfY3RfdGNwX2JlX2xpYmVyYWwpCisJCQlyZXMgPSAxOworCQlpZiAoIXJlcyAmJiBMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCiAJCQluZl9sb2dfcGFja2V0KHBmLCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCiAJCQkibmZfY3RfdGNwOiAlcyAiLAogCQkJYmVmb3JlKHNlcSwgc2VuZGVyLT50ZF9tYXhlbmQgKyAxKSA/CkBAIC03MTgsOCArNzEyLDYgQEAKIAkJCTogIkFDSyBpcyBvdmVyIHRoZSB1cHBlciBib3VuZCAoQUNLZWQgZGF0YSBub3Qgc2VlbiB5ZXQpIgogCQkJOiAiU0VRIGlzIHVuZGVyIHRoZSBsb3dlciBib3VuZCAoYWxyZWFkeSBBQ0tlZCBkYXRhIHJldHJhbnNtaXR0ZWQpIgogCQkJOiAiU0VRIGlzIG92ZXIgdGhlIHVwcGVyIGJvdW5kIChvdmVyIHRoZSB3aW5kb3cgb2YgdGhlIHJlY2VpdmVyKSIpOwotCi0JCXJlcyA9IG5mX2N0X3RjcF9iZV9saWJlcmFsOwogICAJfQogICAKIAlERUJVR1AoInRjcF9pbl93aW5kb3c6IHJlcz0laSBzZW5kZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXUgIgpAQCAtMTA2Myw4ICsxMDU1LDYgQEAKIAogCQl0Y3Bfb3B0aW9ucyhza2IsIGRhdGFvZmYsIHRoLCAmY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXSk7CiAJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0uZmxhZ3MgPSAwOwotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLmxvb3NlID0gCi0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0ubG9vc2UgPSAwOwogCX0gZWxzZSBpZiAobmZfY3RfdGNwX2xvb3NlID09IDApIHsKIAkJLyogRG9uJ3QgdHJ5IHRvIHBpY2sgdXAgY29ubmVjdGlvbnMuICovCiAJCXJldHVybiAwOwpAQCAtMTA4NSwxMSArMTA3NSwxMSBAQAogCQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXh3aW47CiAJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfc2NhbGUgPSAwOwogCi0JCS8qIFdlIGFzc3VtZSBTQUNLLiBTaG91bGQgd2UgYXNzdW1lIHdpbmRvdyBzY2FsaW5nIHRvbz8gKi8KKwkJLyogV2UgYXNzdW1lIFNBQ0sgYW5kIGxpYmVyYWwgd2luZG93IGNoZWNraW5nIHRvIGhhbmRsZQorCQkgKiB3aW5kb3cgc2NhbGluZyAqLwogCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLmZsYWdzID0KLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS5mbGFncyA9IElQX0NUX1RDUF9GTEFHX1NBQ0tfUEVSTTsKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS5sb29zZSA9IAotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLmxvb3NlID0gbmZfY3RfdGNwX2xvb3NlOworCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLmZsYWdzID0gSVBfQ1RfVENQX0ZMQUdfU0FDS19QRVJNIHwKKwkJCQkJCSAgICAgSVBfQ1RfVENQX0ZMQUdfQkVfTElCRVJBTDsKIAl9CiAgICAgCiAJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS50ZF9lbmQgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2FuZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMmQxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zYW5lLmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qIFNBTkUgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIKKyAqIChTQU5FID0gU2Nhbm5lciBBY2Nlc3MgTm93IEVhc3kpCisgKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgU0FORSBuZXR3b3JrIHByb3RvY29sIHNlZQorICogaHR0cDovL3d3dy5zYW5lLXByb2plY3Qub3JnL2h0bWwvZG9jMDE1Lmh0bWwKKyAqLworCisvKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLgorICogQXV0aG9yOiBNaWNoYWwgU2NobWlkdCA8bXNjaG1pZHRAcmVkaGF0LmNvbT4KKyAqIEJhc2VkIG9uIHRoZSBGVFAgY29ubnRyYWNrIGhlbHBlciAobmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMpOgorICogIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqICAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKiAgKEMpIDIwMDMsMjAwNCBVU0FHSS9XSURFIFByb2plY3QgPGh0dHA6Ly93d3cubGludXgtaXB2Ni5vcmc+CisgKiAgKEMpIDIwMDMgWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NhbmUuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWljaGFsIFNjaG1pZHQgPG1zY2htaWR0QHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNBTkUgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKKworc3RhdGljIGNoYXIgKnNhbmVfYnVmZmVyOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5mX3NhbmVfbG9jayk7CisKKyNkZWZpbmUgTUFYX1BPUlRTIDgKK3N0YXRpYyB1X2ludDE2X3QgcG9ydHNbTUFYX1BPUlRTXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG9ydHNfYzsKK21vZHVsZV9wYXJhbV9hcnJheShwb3J0cywgdXNob3J0LCAmcG9ydHNfYywgMDQwMCk7CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworc3RydWN0IHNhbmVfcmVxdWVzdCB7CisJX19iZTMyIFJQQ19jb2RlOworI2RlZmluZSBTQU5FX05FVF9TVEFSVCAgICAgIDcgICAvKiBSUEMgY29kZSAqLworCisJX19iZTMyIGhhbmRsZTsKK307CisKK3N0cnVjdCBzYW5lX3JlcGx5X25ldF9zdGFydCB7CisJX19iZTMyIHN0YXR1czsKKyNkZWZpbmUgU0FORV9TVEFUVVNfU1VDQ0VTUyAwCisKKwlfX2JlMTYgemVybzsKKwlfX2JlMTYgcG9ydDsKKwkvKiBvdGhlciBmaWVsZHMgYXJlbid0IGludGVyZXN0aW5nIGZvciBjb25udHJhY2sgKi8KK307CisKK3N0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCXVuc2lnbmVkIGludCBwcm90b2ZmLAorCQlzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCXVuc2lnbmVkIGludCBkYXRhb2ZmLCBkYXRhbGVuOworCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKKwljaGFyICpzYl9wdHI7CisJaW50IHJldCA9IE5GX0FDQ0VQVDsKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCXN0cnVjdCBuZl9jdF9zYW5lX21hc3RlciAqY3Rfc2FuZV9pbmZvOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGU7CisJc3RydWN0IHNhbmVfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBzYW5lX3JlcGx5X25ldF9zdGFydCAqcmVwbHk7CisJaW50IGZhbWlseSA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMubDNudW07CisKKwljdF9zYW5lX2luZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9zYW5lX2luZm87CisJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCisJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCAmJgorCSAgICBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQrSVBfQ1RfSVNfUkVQTFkpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBOb3QgYSBmdWxsIHRjcCBoZWFkZXI/ICovCisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIHByb3RvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBObyBkYXRhPyAqLworCWRhdGFvZmYgPSBwcm90b2ZmICsgdGgtPmRvZmYgKiA0OworCWlmIChkYXRhb2ZmID49ICgqcHNrYiktPmxlbikKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmOworCisJc3Bpbl9sb2NrX2JoKCZuZl9zYW5lX2xvY2spOworCXNiX3B0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgZGF0YW9mZiwgZGF0YWxlbiwgc2FuZV9idWZmZXIpOworCUJVR19PTihzYl9wdHIgPT0gTlVMTCk7CisKKwlpZiAoZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCkgeworCQlpZiAoZGF0YWxlbiAhPSBzaXplb2Yoc3RydWN0IHNhbmVfcmVxdWVzdCkpCisJCQlnb3RvIG91dDsKKworCQlyZXEgPSAoc3RydWN0IHNhbmVfcmVxdWVzdCAqKXNiX3B0cjsKKwkJaWYgKHJlcS0+UlBDX2NvZGUgIT0gaHRvbmwoU0FORV9ORVRfU1RBUlQpKSB7CisJCQkvKiBOb3QgYW4gaW50ZXJlc3RpbmcgY29tbWFuZCAqLworCQkJY3Rfc2FuZV9pbmZvLT5zdGF0ZSA9IFNBTkVfU1RBVEVfTk9STUFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBXZSdyZSBpbnRlcmVzdGVkIGluIHRoZSBuZXh0IHJlcGx5ICovCisJCWN0X3NhbmVfaW5mby0+c3RhdGUgPSBTQU5FX1NUQVRFX1NUQVJUX1JFUVVFU1RFRDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSXMgaXQgYSByZXBseSB0byBhbiB1bmludGVyZXN0aW5nIGNvbW1hbmQ/ICovCisJaWYgKGN0X3NhbmVfaW5mby0+c3RhdGUgIT0gU0FORV9TVEFURV9TVEFSVF9SRVFVRVNURUQpCisJCWdvdG8gb3V0OworCisJLyogSXQncyBhIHJlcGx5IHRvIFNBTkVfTkVUX1NUQVJULiAqLworCWN0X3NhbmVfaW5mby0+c3RhdGUgPSBTQU5FX1NUQVRFX05PUk1BTDsKKworCWlmIChkYXRhbGVuIDwgc2l6ZW9mKHN0cnVjdCBzYW5lX3JlcGx5X25ldF9zdGFydCkpIHsKKwkJREVCVUdQKCJuZl9jdF9zYW5lOiBORVRfU1RBUlQgcmVwbHkgdG9vIHNob3J0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVwbHkgPSAoc3RydWN0IHNhbmVfcmVwbHlfbmV0X3N0YXJ0ICopc2JfcHRyOworCWlmIChyZXBseS0+c3RhdHVzICE9IGh0b25sKFNBTkVfU1RBVFVTX1NVQ0NFU1MpKSB7CisJCS8qIHNhbmVkIHJlZnVzZWQgdGhlIGNvbW1hbmQgKi8KKwkJREVCVUdQKCJuZl9jdF9zYW5lOiB1bnN1Y2Nlc3NmdWwgU0FORV9TVEFUVVMgPSAldVxuIiwKKwkJCW50b2hsKHJlcGx5LT5zdGF0dXMpKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSW52YWxpZCBzYW5lZCByZXBseT8gSWdub3JlIGl0LiAqLworCWlmIChyZXBseS0+emVybyAhPSAwKQorCQlnb3RvIG91dDsKKworCWV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOworCWlmIChleHAgPT0gTlVMTCkgeworCQlyZXQgPSBORl9EUk9QOworCQlnb3RvIG91dDsKKwl9CisKKwl0dXBsZSA9ICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGU7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cCwgZmFtaWx5LAorCQkJCSAmdHVwbGUtPnNyYy51MywgJnR1cGxlLT5kc3QudTMsCisJCQkJIElQUFJPVE9fVENQLAorCQkJCSBOVUxMLCAmcmVwbHktPnBvcnQpOworCisJREVCVUdQKCJuZl9jdF9zYW5lOiBleHBlY3Q6ICIpOworCU5GX0NUX0RVTVBfVFVQTEUoJmV4cC0+dHVwbGUpOworCU5GX0NUX0RVTVBfVFVQTEUoJmV4cC0+bWFzayk7CisKKwkvKiBDYW4ndCBleHBlY3QgdGhpcz8gIEJlc3QgdG8gZHJvcCBwYWNrZXQgbm93LiAqLworCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQorCQlyZXQgPSBORl9EUk9QOworCisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZuZl9zYW5lX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciBzYW5lW01BWF9QT1JUU11bMl07CitzdGF0aWMgY2hhciBzYW5lX25hbWVzW01BWF9QT1JUU11bMl1bc2l6ZW9mKCJzYW5lLTY1NTM1IildOworCisvKiBkb24ndCBtYWtlIHRoaXMgX19leGl0LCBzaW5jZSBpdCdzIGNhbGxlZCBmcm9tIF9faW5pdCAhICovCitzdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfc2FuZV9maW5pKHZvaWQpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfYzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCURFQlVHUCgibmZfY3Rfc2FuZTogdW5yZWdpc3RlcmluZyBoZWxwZXIgZm9yIHBmOiAlZCAiCisJCQkgICAgICAgInBvcnQ6ICVkXG4iLAorCQkJCXNhbmVbaV1bal0udHVwbGUuc3JjLmwzbnVtLCBwb3J0c1tpXSk7CisJCQluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJnNhbmVbaV1bal0pOworCQl9CisJfQorCisJa2ZyZWUoc2FuZV9idWZmZXIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBuZl9jb25udHJhY2tfc2FuZV9pbml0KHZvaWQpCit7CisJaW50IGksIGogPSAtMSwgcmV0ID0gMDsKKwljaGFyICp0bXBuYW1lOworCisJc2FuZV9idWZmZXIgPSBrbWFsbG9jKDY1NTM2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNhbmVfYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChwb3J0c19jID09IDApCisJCXBvcnRzW3BvcnRzX2MrK10gPSBTQU5FX1BPUlQ7CisKKwkvKiBGSVhNRSBzaG91bGQgYmUgY29uZmlndXJhYmxlIHdoZXRoZXIgSVB2NCBhbmQgSVB2NiBjb25uZWN0aW9ucworCQkgYXJlIHRyYWNrZWQgb3Igbm90IC0gWUsgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfYzsgaSsrKSB7CisJCXNhbmVbaV1bMF0udHVwbGUuc3JjLmwzbnVtID0gUEZfSU5FVDsKKwkJc2FuZVtpXVsxXS50dXBsZS5zcmMubDNudW0gPSBQRl9JTkVUNjsKKwkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQkJc2FuZVtpXVtqXS50dXBsZS5zcmMudS50Y3AucG9ydCA9IGh0b25zKHBvcnRzW2ldKTsKKwkJCXNhbmVbaV1bal0udHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7CisJCQlzYW5lW2ldW2pdLm1hc2suc3JjLnUudGNwLnBvcnQgPSAweEZGRkY7CisJCQlzYW5lW2ldW2pdLm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKKwkJCXNhbmVbaV1bal0ubWF4X2V4cGVjdGVkID0gMTsKKwkJCXNhbmVbaV1bal0udGltZW91dCA9IDUgKiA2MDsJLyogNSBNaW51dGVzICovCisJCQlzYW5lW2ldW2pdLm1lID0gVEhJU19NT0RVTEU7CisJCQlzYW5lW2ldW2pdLmhlbHAgPSBoZWxwOworCQkJdG1wbmFtZSA9ICZzYW5lX25hbWVzW2ldW2pdWzBdOworCQkJaWYgKHBvcnRzW2ldID09IFNBTkVfUE9SVCkKKwkJCQlzcHJpbnRmKHRtcG5hbWUsICJzYW5lIik7CisJCQllbHNlCisJCQkJc3ByaW50Zih0bXBuYW1lLCAic2FuZS0lZCIsIHBvcnRzW2ldKTsKKwkJCXNhbmVbaV1bal0ubmFtZSA9IHRtcG5hbWU7CisKKwkJCURFQlVHUCgibmZfY3Rfc2FuZTogcmVnaXN0ZXJpbmcgaGVscGVyIGZvciBwZjogJWQgIgorCQkJICAgICAgICJwb3J0OiAlZFxuIiwKKwkJCQlzYW5lW2ldW2pdLnR1cGxlLnNyYy5sM251bSwgcG9ydHNbaV0pOworCQkJcmV0ID0gbmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3Rlcigmc2FuZVtpXVtqXSk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJuZl9jdF9zYW5lOiBmYWlsZWQgdG8gIgorCQkJCSAgICAgICAicmVnaXN0ZXIgaGVscGVyIGZvciBwZjogJWQgcG9ydDogJWRcbiIsCisJCQkJCXNhbmVbaV1bal0udHVwbGUuc3JjLmwzbnVtLCBwb3J0c1tpXSk7CisJCQkJbmZfY29ubnRyYWNrX3NhbmVfZmluaSgpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQobmZfY29ubnRyYWNrX3NhbmVfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9jb25udHJhY2tfc2FuZV9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuYwppbmRleCA1MGRlOTY1Li4xOTVlOTI5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9DTEFTU0lGWS5jCkBAIC0zMyw5ICszMyw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHh0X2NsYXNzaWZ5X3RhcmdldF9pbmZvICpjbGluZm8gPSB0YXJnaW5mbzsKIAotCWlmICgoKnBza2IpLT5wcmlvcml0eSAhPSBjbGluZm8tPnByaW9yaXR5KQotCQkoKnBza2IpLT5wcmlvcml0eSA9IGNsaW5mby0+cHJpb3JpdHk7Ci0KKwkoKnBza2IpLT5wcmlvcml0eSA9IGNsaW5mby0+cHJpb3JpdHk7CiAJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKaW5kZXggMDUzNGJmYS4uNzk1YzA1OCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYwpAQCAtNjEsNyArNjEsNyBAQAogI2Vsc2UKIAkJCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9NQVJLLCAqcHNrYik7CiAjZW5kaWYKLQkJfQorCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgWFRfQ09OTk1BUktfU0FWRToKIAkJCW5ld21hcmsgPSAoKmN0bWFyayAmIH5tYXJraW5mby0+bWFzaykgfApAQCAtNzgsOCArNzgsNyBAQAogCQljYXNlIFhUX0NPTk5NQVJLX1JFU1RPUkU6CiAJCQltYXJrID0gKCpwc2tiKS0+bWFyazsKIAkJCWRpZmYgPSAoKmN0bWFyayBeIG1hcmspICYgbWFya2luZm8tPm1hc2s7Ci0JCQlpZiAoZGlmZiAhPSAwKQotCQkJCSgqcHNrYiktPm1hcmsgPSBtYXJrIF4gZGlmZjsKKwkJCSgqcHNrYiktPm1hcmsgPSBtYXJrIF4gZGlmZjsKIAkJCWJyZWFrOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5jIGIvbmV0L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5jCmluZGV4IGEzZmUzYzMuLjFhYjBkYjYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmMKQEAgLTQxLDggKzQxLDcgQEAKIAogCQljb25uc2VjbWFyayA9IG5mX2N0X2dldF9zZWNtYXJrKHNrYiwgJmN0aW5mbyk7CiAJCWlmIChjb25uc2VjbWFyayAmJiAhKmNvbm5zZWNtYXJrKQotCQkJaWYgKCpjb25uc2VjbWFyayAhPSBza2ItPnNlY21hcmspCi0JCQkJKmNvbm5zZWNtYXJrID0gc2tiLT5zZWNtYXJrOworCQkJKmNvbm5zZWNtYXJrID0gc2tiLT5zZWNtYXJrOwogCX0KIH0KIApAQCAtNTgsOCArNTcsNyBAQAogCiAJCWNvbm5zZWNtYXJrID0gbmZfY3RfZ2V0X3NlY21hcmsoc2tiLCAmY3RpbmZvKTsKIAkJaWYgKGNvbm5zZWNtYXJrICYmICpjb25uc2VjbWFyaykKLQkJCWlmIChza2ItPnNlY21hcmsgIT0gKmNvbm5zZWNtYXJrKQotCQkJCXNrYi0+c2VjbWFyayA9ICpjb25uc2VjbWFyazsKKwkJCXNrYi0+c2VjbWFyayA9ICpjb25uc2VjbWFyazsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jIGIvbmV0L25ldGZpbHRlci94dF9NQVJLLmMKaW5kZXggMGI0ODU0Ny4uY2ZjNDVhZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9NQVJLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9NQVJLLmMKQEAgLTMxLDkgKzMxLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKIAotCWlmKCgqcHNrYiktPm1hcmsgIT0gbWFya2luZm8tPm1hcmspCi0JCSgqcHNrYiktPm1hcmsgPSBtYXJraW5mby0+bWFyazsKLQorCSgqcHNrYiktPm1hcmsgPSBtYXJraW5mby0+bWFyazsKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKQEAgLTYyLDkgKzYwLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYoKCpwc2tiKS0+bWFyayAhPSBtYXJrKQotCQkoKnBza2IpLT5tYXJrID0gbWFyazsKLQorCSgqcHNrYiktPm1hcmsgPSBtYXJrOwogCXJldHVybiBYVF9DT05USU5VRTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9TRUNNQVJLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1NFQ01BUksuYwppbmRleCBhZGQ3NTIxLi5mMTEzMWMzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1NFQ01BUksuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X1NFQ01BUksuYwpAQCAtNDcsOSArNDcsNyBAQAogCQlCVUcoKTsKIAl9CiAKLQlpZiAoKCpwc2tiKS0+c2VjbWFyayAhPSBzZWNtYXJrKQotCQkoKnBza2IpLT5zZWNtYXJrID0gc2VjbWFyazsKLQorCSgqcHNrYiktPnNlY21hcmsgPSBzZWNtYXJrOwogCXJldHVybiBYVF9DT05USU5VRTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYyBiL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3ZTM4YwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBUaGlzIGlzIGEgbW9kdWxlIHdoaWNoIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIE1TUyBvcHRpb24gaW4gVENQIHBhY2tldHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF90Y3B1ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfVENQTVNTLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ4X3RhYmxlcyBUQ1AgTVNTIG1vZGlmaWNhdGlvbiBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X1RDUE1TUyIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X1RDUE1TUyIpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorb3B0bGVuKGNvbnN0IHVfaW50OF90ICpvcHQsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJLyogQmV3YXJlIHplcm8tbGVuZ3RoIG9wdGlvbnM6IG1ha2UgZmluaXRlIHByb2dyZXNzICovCisJaWYgKG9wdFtvZmZzZXRdIDw9IFRDUE9QVF9OT1AgfHwgb3B0W29mZnNldCsxXSA9PSAwKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiBvcHRbb2Zmc2V0KzFdOworfQorCitzdGF0aWMgaW50Cit0Y3Btc3NfbWFuZ2xlX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgICAgY29uc3Qgc3RydWN0IHh0X3RjcG1zc19pbmZvICppbmZvLAorCQkgICAgIHVuc2lnbmVkIGludCB0Y3Bob2ZmLAorCQkgICAgIHVuc2lnbmVkIGludCBtaW5sZW4pCit7CisJc3RydWN0IHRjcGhkciAqdGNwaDsKKwl1bnNpZ25lZCBpbnQgdGNwbGVuLCBpOworCV9fYmUxNiBvbGR2YWw7CisJdTE2IG5ld21zczsKKwl1OCAqb3B0OworCisJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5sZW4pKQorCQlyZXR1cm4gLTE7CisKKwl0Y3BsZW4gPSAoKnBza2IpLT5sZW4gLSB0Y3Bob2ZmOworCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKSgoKnBza2IpLT5uaC5yYXcgKyB0Y3Bob2ZmKTsKKworCS8qIFNpbmNlIGl0IHBhc3NlZCBmbGFncyB0ZXN0IGluIHRjcCBtYXRjaCwgd2Uga25vdyBpdCBpcyBpcworCSAgIG5vdCBhIGZyYWdtZW50LCBhbmQgaGFzIGRhdGEgPj0gdGNwIGhlYWRlciBsZW5ndGguICBTWU4KKwkgICBwYWNrZXRzIHNob3VsZCBub3QgY29udGFpbiBkYXRhOiBpZiB0aGV5IGRpZCwgdGhlbiB3ZSByaXNrCisJICAgcnVubmluZyBvdmVyIE1UVSwgc2VuZGluZyBGcmFnIE5lZWRlZCBhbmQgYnJlYWtpbmcgdGhpbmdzCisJICAgYmFkbHkuIC0tUlIgKi8KKwlpZiAodGNwbGVuICE9IHRjcGgtPmRvZmYqNCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fRVJSICJ4dF9UQ1BNU1M6IGJhZCBsZW5ndGggKCV1IGJ5dGVzKVxuIiwKKwkJCSAgICAgICAoKnBza2IpLT5sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGluZm8tPm1zcyA9PSBYVF9UQ1BNU1NfQ0xBTVBfUE1UVSkgeworCQlpZiAoZHN0X210dSgoKnBza2IpLT5kc3QpIDw9IG1pbmxlbikgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgInh0X1RDUE1TUzogIgorCQkJCSAgICAgICAidW5rbm93biBvciBpbnZhbGlkIHBhdGgtTVRVICgldSlcbiIsCisJCQkJICAgICAgIGRzdF9tdHUoKCpwc2tiKS0+ZHN0KSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbmV3bXNzID0gZHN0X210dSgoKnBza2IpLT5kc3QpIC0gbWlubGVuOworCX0gZWxzZQorCQluZXdtc3MgPSBpbmZvLT5tc3M7CisKKwlvcHQgPSAodV9pbnQ4X3QgKil0Y3BoOworCWZvciAoaSA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsgaSA8IHRjcGgtPmRvZmYqNDsgaSArPSBvcHRsZW4ob3B0LCBpKSkgeworCQlpZiAob3B0W2ldID09IFRDUE9QVF9NU1MgJiYgdGNwaC0+ZG9mZio0IC0gaSA+PSBUQ1BPTEVOX01TUyAmJgorCQkgICAgb3B0W2krMV0gPT0gVENQT0xFTl9NU1MpIHsKKwkJCXVfaW50MTZfdCBvbGRtc3M7CisKKwkJCW9sZG1zcyA9IChvcHRbaSsyXSA8PCA4KSB8IG9wdFtpKzNdOworCisJCQlpZiAoaW5mby0+bXNzID09IFhUX1RDUE1TU19DTEFNUF9QTVRVICYmCisJCQkgICAgb2xkbXNzIDw9IG5ld21zcykKKwkJCQlyZXR1cm4gMDsKKworCQkJb3B0W2krMl0gPSAobmV3bXNzICYgMHhmZjAwKSA+PiA4OworCQkJb3B0W2krM10gPSAobmV3bXNzICYgMHgwMGZmKTsKKworCQkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAorCQkJCQkgICAgICAgaHRvbnMob2xkbXNzKSwgaHRvbnMobmV3bXNzKSwgMCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qCisJICogTVNTIE9wdGlvbiBub3QgZm91bmQgPyEgYWRkIGl0Li4KKwkgKi8KKwlpZiAoc2tiX3RhaWxyb29tKCgqcHNrYikpIDwgVENQT0xFTl9NU1MpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKKworCQluZXdza2IgPSBza2JfY29weV9leHBhbmQoKnBza2IsIHNrYl9oZWFkcm9vbSgqcHNrYiksCisJCQkJCSBUQ1BPTEVOX01TUywgR0ZQX0FUT01JQyk7CisJCWlmICghbmV3c2tiKQorCQkJcmV0dXJuIC0xOworCQlrZnJlZV9za2IoKnBza2IpOworCQkqcHNrYiA9IG5ld3NrYjsKKwkJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKCgqcHNrYiktPm5oLnJhdyArIHRjcGhvZmYpOworCX0KKworCXNrYl9wdXQoKCpwc2tiKSwgVENQT0xFTl9NU1MpOworCisJb3B0ID0gKHVfaW50OF90ICopdGNwaCArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKwltZW1tb3ZlKG9wdCArIFRDUE9MRU5fTVNTLCBvcHQsIHRjcGxlbiAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7CisKKwluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ0Y3BoLT5jaGVjaywgKnBza2IsCisJCQkgICAgICAgaHRvbnModGNwbGVuKSwgaHRvbnModGNwbGVuICsgVENQT0xFTl9NU1MpLCAxKTsKKwlvcHRbMF0gPSBUQ1BPUFRfTVNTOworCW9wdFsxXSA9IFRDUE9MRU5fTVNTOworCW9wdFsyXSA9IChuZXdtc3MgJiAweGZmMDApID4+IDg7CisJb3B0WzNdID0gKG5ld21zcyAmIDB4MDBmZik7CisKKwluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgKnBza2IsIDAsICooKF9fYmUzMiAqKW9wdCksIDApOworCisJb2xkdmFsID0gKChfX2JlMTYgKil0Y3BoKVs2XTsKKwl0Y3BoLT5kb2ZmICs9IFRDUE9MRU5fTVNTLzQ7CisJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAorCQkJCW9sZHZhbCwgKChfX2JlMTYgKil0Y3BoKVs2XSwgMCk7CisJcmV0dXJuIFRDUE9MRU5fTVNTOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit4dF90Y3Btc3NfdGFyZ2V0NChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSAgdW5zaWduZWQgaW50IGhvb2tudW0sCisJCSAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAorCQkgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOworCV9fYmUxNiBuZXdsZW47CisJaW50IHJldDsKKworCXJldCA9IHRjcG1zc19tYW5nbGVfcGFja2V0KHBza2IsIHRhcmdpbmZvLCBpcGgtPmlobCAqIDQsCisJCQkJICAgc2l6ZW9mKCppcGgpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIE5GX0RST1A7CisJaWYgKHJldCA+IDApIHsKKwkJaXBoID0gKCpwc2tiKS0+bmguaXBoOworCQluZXdsZW4gPSBodG9ucyhudG9ocyhpcGgtPnRvdF9sZW4pICsgcmV0KTsKKwkJbmZfY3N1bV9yZXBsYWNlMigmaXBoLT5jaGVjaywgaXBoLT50b3RfbGVuLCBuZXdsZW4pOworCQlpcGgtPnRvdF9sZW4gPSBuZXdsZW47CisJfQorCXJldHVybiBYVF9DT05USU5VRTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3h0X3RjcG1zc190YXJnZXQ2KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJICB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCisJCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCit7CisJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gKCpwc2tiKS0+bmguaXB2Nmg7CisJdTggbmV4dGhkcjsKKwlpbnQgdGNwaG9mZjsKKwlpbnQgcmV0OworCisJbmV4dGhkciA9IGlwdjZoLT5uZXh0aGRyOworCXRjcGhvZmYgPSBpcHY2X3NraXBfZXh0aGRyKCpwc2tiLCBzaXplb2YoKmlwdjZoKSwgJm5leHRoZHIpOworCWlmICh0Y3Bob2ZmIDwgMCkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gTkZfRFJPUDsKKwl9CisJcmV0ID0gdGNwbXNzX21hbmdsZV9wYWNrZXQocHNrYiwgdGFyZ2luZm8sIHRjcGhvZmYsCisJCQkJICAgc2l6ZW9mKCppcHY2aCkgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gTkZfRFJPUDsKKwlpZiAocmV0ID4gMCkgeworCQlpcHY2aCA9ICgqcHNrYiktPm5oLmlwdjZoOworCQlpcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhudG9ocyhpcHY2aC0+cGF5bG9hZF9sZW4pICsgcmV0KTsKKwl9CisJcmV0dXJuIFhUX0NPTlRJTlVFOworfQorI2VuZGlmCisKKyNkZWZpbmUgVEhfU1lOIDB4MDIKKworLyogTXVzdCBzcGVjaWZ5IC1wIHRjcCAtLXN5biAqLworc3RhdGljIGlubGluZSBpbnQgZmluZF9zeW5fbWF0Y2goY29uc3Qgc3RydWN0IHh0X2VudHJ5X21hdGNoICptKQoreworCWNvbnN0IHN0cnVjdCB4dF90Y3AgKnRjcGluZm8gPSAoY29uc3Qgc3RydWN0IHh0X3RjcCAqKW0tPmRhdGE7CisKKwlpZiAoc3RyY21wKG0tPnUua2VybmVsLm1hdGNoLT5uYW1lLCAidGNwIikgPT0gMCAmJgorCSAgICB0Y3BpbmZvLT5mbGdfY21wICYgVEhfU1lOICYmCisJICAgICEodGNwaW5mby0+aW52ZmxhZ3MgJiBYVF9UQ1BfSU5WX0ZMQUdTKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoreHRfdGNwbXNzX2NoZWNrZW50cnk0KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgICAgY29uc3Qgdm9pZCAqZW50cnksCisJCSAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKKwkJICAgICAgdm9pZCAqdGFyZ2luZm8sCisJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IHh0X3RjcG1zc19pbmZvICppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSA9IGVudHJ5OworCisJaWYgKGluZm8tPm1zcyA9PSBYVF9UQ1BNU1NfQ0xBTVBfUE1UVSAmJgorCSAgICAoaG9va19tYXNrICYgfigoMSA8PCBORl9JUF9GT1JXQVJEKSB8CisJCQkgICAoMSA8PCBORl9JUF9MT0NBTF9PVVQpIHwKKwkJCSAgICgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykpKSAhPSAwKSB7CisJCXByaW50aygieHRfVENQTVNTOiBwYXRoLU1UVSBjbGFtcGluZyBvbmx5IHN1cHBvcnRlZCBpbiAiCisJCSAgICAgICAiRk9SV0FSRCwgT1VUUFVUIGFuZCBQT1NUUk9VVElORyBob29rc1xuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoSVBUX01BVENIX0lURVJBVEUoZSwgZmluZF9zeW5fbWF0Y2gpKQorCQlyZXR1cm4gMTsKKwlwcmludGsoInh0X1RDUE1TUzogT25seSB3b3JrcyBvbiBUQ1AgU1lOIHBhY2tldHNcbiIpOworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQorc3RhdGljIGludAoreHRfdGNwbXNzX2NoZWNrZW50cnk2KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgICAgY29uc3Qgdm9pZCAqZW50cnksCisJCSAgICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKKwkJICAgICAgdm9pZCAqdGFyZ2luZm8sCisJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IHh0X3RjcG1zc19pbmZvICppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUgPSBlbnRyeTsKKworCWlmIChpbmZvLT5tc3MgPT0gWFRfVENQTVNTX0NMQU1QX1BNVFUgJiYKKwkgICAgKGhvb2tfbWFzayAmIH4oKDEgPDwgTkZfSVA2X0ZPUldBUkQpIHwKKwkJCSAgICgxIDw8IE5GX0lQNl9MT0NBTF9PVVQpIHwKKwkJCSAgICgxIDw8IE5GX0lQNl9QT1NUX1JPVVRJTkcpKSkgIT0gMCkgeworCQlwcmludGsoInh0X1RDUE1TUzogcGF0aC1NVFUgY2xhbXBpbmcgb25seSBzdXBwb3J0ZWQgaW4gIgorCQkgICAgICAgIkZPUldBUkQsIE9VVFBVVCBhbmQgUE9TVFJPVVRJTkcgaG9va3NcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKElQNlRfTUFUQ0hfSVRFUkFURShlLCBmaW5kX3N5bl9tYXRjaCkpCisJCXJldHVybiAxOworCXByaW50aygieHRfVENQTVNTOiBPbmx5IHdvcmtzIG9uIFRDUCBTWU4gcGFja2V0c1xuIik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgeHRfdGNwbXNzX3JlZ1tdID0geworCXsKKwkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkubmFtZQkJPSAiVENQTVNTIiwKKwkJLmNoZWNrZW50cnkJPSB4dF90Y3Btc3NfY2hlY2tlbnRyeTQsCisJCS50YXJnZXQJCT0geHRfdGNwbXNzX3RhcmdldDQsCisJCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF90Y3Btc3NfaW5mbyksCisJCS5wcm90bwkJPSBJUFBST1RPX1RDUCwKKwkJLm1lCQk9IFRISVNfTU9EVUxFLAorCX0sCisjaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQorCXsKKwkJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLm5hbWUJCT0gIlRDUE1TUyIsCisJCS5jaGVja2VudHJ5CT0geHRfdGNwbXNzX2NoZWNrZW50cnk2LAorCQkudGFyZ2V0CQk9IHh0X3RjcG1zc190YXJnZXQ2LAorCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfdGNwbXNzX2luZm8pLAorCQkucHJvdG8JCT0gSVBQUk9UT19UQ1AsCisJCS5tZQkJPSBUSElTX01PRFVMRSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IF9faW5pdCB4dF90Y3Btc3NfaW5pdCh2b2lkKQoreworCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXRzKHh0X3RjcG1zc19yZWcsIEFSUkFZX1NJWkUoeHRfdGNwbXNzX3JlZykpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeHRfdGNwbXNzX2Zpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX3RhcmdldHMoeHRfdGNwbXNzX3JlZywgQVJSQVlfU0laRSh4dF90Y3Btc3NfcmVnKSk7Cit9CisKK21vZHVsZV9pbml0KHh0X3RjcG1zc19pbml0KTsKK21vZHVsZV9leGl0KHh0X3RjcG1zc19maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCmluZGV4IGYyOGJmNjkuLmJkMWY3YTIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYwpAQCAtNDE0LDYgKzQxNCw3IEBACiAJc3dpdGNoIChuZXh0aGRyKSB7CiAJY2FzZSBJUFBST1RPX1RDUDoKIAljYXNlIElQUFJPVE9fVURQOgorCWNhc2UgSVBQUk9UT19VRFBMSVRFOgogCWNhc2UgSVBQUk9UT19TQ1RQOgogCWNhc2UgSVBQUk9UT19EQ0NQOgogCQlwb3J0cyA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfcG9ydHMpLApkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKaW5kZXggNmRjMDFiZC4uYTZmYTQ4NyAxMDA2NDQKLS0tIGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworKysgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCkBAIC02MCw2ICs2MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CkBAIC0yMDAsNyArMjAxLDggQEAKICNlbmRpZgogCXN0cnVjdCBwYWNrZXRfdHlwZQlwcm90X2hvb2s7CiAJc3BpbmxvY2tfdAkJYmluZF9sb2NrOwotCWNoYXIJCQlydW5uaW5nOwkvKiBwcm90X2hvb2sgaXMgYXR0YWNoZWQqLworCXVuc2lnbmVkIGludAkJcnVubmluZzoxLAkvKiBwcm90X2hvb2sgaXMgYXR0YWNoZWQqLworCQkJCWF1eGRhdGE6MTsKIAlpbnQJCQlpZmluZGV4OwkvKiBib3VuZCBkZXZpY2UJCSovCiAJX19iZTE2CQkJbnVtOwogI2lmZGVmIENPTkZJR19QQUNLRVRfTVVMVElDQVNUCkBAIC0yMTQsNiArMjE2LDE2IEBACiAjZW5kaWYKIH07CiAKK3N0cnVjdCBwYWNrZXRfc2tiX2NiIHsKKwl1bnNpZ25lZCBpbnQgb3JpZ2xlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrYWRkcl9wa3QgcGt0OworCQlzdHJ1Y3Qgc29ja2FkZHJfbGwgbGw7CisJfSBzYTsKK307CisKKyNkZWZpbmUgUEFDS0VUX1NLQl9DQihfX3NrYikJKChzdHJ1Y3QgcGFja2V0X3NrYl9jYiAqKSgoX19za2IpLT5jYikpCisKICNpZmRlZiBDT05GSUdfUEFDS0VUX01NQVAKIAogc3RhdGljIGlubGluZSBjaGFyICpwYWNrZXRfbG9va3VwX2ZyYW1lKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sIHVuc2lnbmVkIGludCBwb3NpdGlvbikKQEAgLTI5Myw3ICszMDUsNyBAQAogCS8qIGRyb3AgY29ubnRyYWNrIHJlZmVyZW5jZSAqLwogCW5mX3Jlc2V0KHNrYik7CiAKLQlzcGt0ID0gKHN0cnVjdCBzb2NrYWRkcl9wa3QqKXNrYi0+Y2I7CisJc3BrdCA9ICZQQUNLRVRfU0tCX0NCKHNrYiktPnNhLnBrdDsKIAogCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhLXNrYi0+bWFjLnJhdyk7CiAKQEAgLTUxMiw3ICs1MjQsMTAgQEAKIAkJc2tiID0gbnNrYjsKIAl9CiAKLQlzbGwgPSAoc3RydWN0IHNvY2thZGRyX2xsKilza2ItPmNiOworCUJVSUxEX0JVR19PTihzaXplb2YoKlBBQ0tFVF9TS0JfQ0Ioc2tiKSkgKyBNQVhfQUREUl9MRU4gLSA4ID4KKwkJICAgICBzaXplb2Yoc2tiLT5jYikpOworCisJc2xsID0gJlBBQ0tFVF9TS0JfQ0Ioc2tiKS0+c2EubGw7CiAJc2xsLT5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOwogCXNsbC0+c2xsX2hhdHlwZSA9IGRldi0+dHlwZTsKIAlzbGwtPnNsbF9wcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CkBAIC01MjMsNiArNTM4LDggQEAKIAlpZiAoZGV2LT5oYXJkX2hlYWRlcl9wYXJzZSkKIAkJc2xsLT5zbGxfaGFsZW4gPSBkZXYtPmhhcmRfaGVhZGVyX3BhcnNlKHNrYiwgc2xsLT5zbGxfYWRkcik7CiAKKwlQQUNLRVRfU0tCX0NCKHNrYiktPm9yaWdsZW4gPSBza2ItPmxlbjsKKwogCWlmIChwc2tiX3RyaW0oc2tiLCBzbmFwbGVuKSkKIAkJZ290byBkcm9wX25fYWNjdDsKIApAQCAtNTgyLDExICs1OTksMTIgQEAKIAkJZWxzZSBpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1VUR09JTkcpIHsKIAkJCS8qIFNwZWNpYWwgY2FzZTogb3V0Z29pbmcgcGFja2V0cyBoYXZlIGxsIGhlYWRlciBhdCBoZWFkICovCiAJCQlza2JfcHVsbChza2IsIHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKLQkJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQotCQkJCXN0YXR1cyB8PSBUUF9TVEFUVVNfQ1NVTU5PVFJFQURZOwogCQl9CiAJfQogCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCisJCXN0YXR1cyB8PSBUUF9TVEFUVVNfQ1NVTU5PVFJFQURZOworCiAJc25hcGxlbiA9IHNrYi0+bGVuOwogCiAJcmVzID0gcnVuX2ZpbHRlcihza2IsIHNrLCBzbmFwbGVuKTsKQEAgLTEwOTIsNyArMTExMCw3IEBACiAJICoJaXQgaW4gbm93LgogCSAqLwogCi0Jc2xsID0gKHN0cnVjdCBzb2NrYWRkcl9sbCopc2tiLT5jYjsKKwlzbGwgPSAmUEFDS0VUX1NLQl9DQihza2IpLT5zYS5sbDsKIAlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1BBQ0tFVCkKIAkJbXNnLT5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcGt0KTsKIAllbHNlCkBAIC0xMTE3LDcgKzExMzUsMjIgQEAKIAlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7CiAKIAlpZiAobXNnLT5tc2dfbmFtZSkKLQkJbWVtY3B5KG1zZy0+bXNnX25hbWUsIHNrYi0+Y2IsIG1zZy0+bXNnX25hbWVsZW4pOworCQltZW1jcHkobXNnLT5tc2dfbmFtZSwgJlBBQ0tFVF9TS0JfQ0Ioc2tiKS0+c2EsCisJCSAgICAgICBtc2ctPm1zZ19uYW1lbGVuKTsKKworCWlmIChwa3Rfc2soc2spLT5hdXhkYXRhKSB7CisJCXN0cnVjdCB0cGFja2V0X2F1eGRhdGEgYXV4OworCisJCWF1eC50cF9zdGF0dXMgPSBUUF9TVEFUVVNfVVNFUjsKKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCisJCQlhdXgudHBfc3RhdHVzIHw9IFRQX1NUQVRVU19DU1VNTk9UUkVBRFk7CisJCWF1eC50cF9sZW4gPSBQQUNLRVRfU0tCX0NCKHNrYiktPm9yaWdsZW47CisJCWF1eC50cF9zbmFwbGVuID0gc2tiLT5sZW47CisJCWF1eC50cF9tYWMgPSAwOworCQlhdXgudHBfbmV0ID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7CisKKwkJcHV0X2Ntc2cobXNnLCBTT0xfUEFDS0VULCBQQUNLRVRfQVVYREFUQSwgc2l6ZW9mKGF1eCksICZhdXgpOworCX0KIAogCS8qCiAJICoJRnJlZSBvciByZXR1cm4gdGhlIGJ1ZmZlciBhcyBhcHByb3ByaWF0ZS4gQWdhaW4gdGhpcwpAQCAtMTMxNyw2ICsxMzUwLDcgQEAKIHBhY2tldF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CiAJaW50IHJldDsKIAogCWlmIChsZXZlbCAhPSBTT0xfUEFDS0VUKQpAQCAtMTM2OSw2ICsxNDAzLDE4IEBACiAJCXJldHVybiAwOwogCX0KICNlbmRpZgorCWNhc2UgUEFDS0VUX0FVWERBVEE6CisJeworCQlpbnQgdmFsOworCisJCWlmIChvcHRsZW4gPCBzaXplb2YodmFsKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgb3B0dmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlwby0+YXV4ZGF0YSA9ICEhdmFsOworCQlyZXR1cm4gMDsKKwl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9CkBAIC0xMzc4LDggKzE0MjQsMTEgQEAKIAkJCSAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQogewogCWludCBsZW47CisJaW50IHZhbDsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKKwl2b2lkICpkYXRhOworCXN0cnVjdCB0cGFja2V0X3N0YXRzIHN0OwogCiAJaWYgKGxldmVsICE9IFNPTF9QQUNLRVQpCiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CkBAIC0xMzkyLDkgKzE0NDEsNiBAQAogCQkKIAlzd2l0Y2gob3B0bmFtZSkJewogCWNhc2UgUEFDS0VUX1NUQVRJU1RJQ1M6Ci0JewotCQlzdHJ1Y3QgdHBhY2tldF9zdGF0cyBzdDsKLQogCQlpZiAobGVuID4gc2l6ZW9mKHN0cnVjdCB0cGFja2V0X3N0YXRzKSkKIAkJCWxlbiA9IHNpemVvZihzdHJ1Y3QgdHBhY2tldF9zdGF0cyk7CiAJCXNwaW5fbG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CkBAIC0xNDAzLDE2ICsxNDQ5LDIzIEBACiAJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKIAkJc3QudHBfcGFja2V0cyArPSBzdC50cF9kcm9wczsKIAotCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnN0LCBsZW4pKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWRhdGEgPSAmc3Q7CiAJCWJyZWFrOwotCX0KKwljYXNlIFBBQ0tFVF9BVVhEQVRBOgorCQlpZiAobGVuID4gc2l6ZW9mKGludCkpCisJCQlsZW4gPSBzaXplb2YoaW50KTsKKwkJdmFsID0gcG8tPmF1eGRhdGE7CisKKwkJZGF0YSA9ICZ2YWw7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJfQogCiAJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIGRhdGEsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2lwdC5jIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwppbmRleCAwMWU2OTEzLi40YzY4YzcxIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2lwdC5jCisrKyBiL25ldC9zY2hlZC9hY3RfaXB0LmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogc3RhdGljIGludCBpcHRfaW5pdF90YXJnZXQoc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQsIGNoYXIgKnRhYmxlLCB1bnNpZ25lZCBpbnQgaG9vaykKIHsKLQlzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0OworCXN0cnVjdCB4dF90YXJnZXQgKnRhcmdldDsKIAlpbnQgcmV0ID0gMDsKIAogCXRhcmdldCA9IHh0X3JlcXVlc3RfZmluZF90YXJnZXQoQUZfSU5FVCwgdC0+dS51c2VyLm5hbWUsCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCmluZGV4IGJjMTE2YmQuLjNiNmU2YTcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCisrKyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCkBAIC0yMDksNyArMjA5LDcgQEAKIAkJCQkgICAgICAgZGV2LT5uYW1lKTsKIAkJCQlkZXYtPnR4X3RpbWVvdXQoZGV2KTsKIAkJCX0KLQkJCWlmICghbW9kX3RpbWVyKCZkZXYtPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzICsgZGV2LT53YXRjaGRvZ190aW1lbykpCisJCQlpZiAoIW1vZF90aW1lcigmZGV2LT53YXRjaGRvZ190aW1lciwgcm91bmRfamlmZmllcyhqaWZmaWVzICsgZGV2LT53YXRjaGRvZ190aW1lbykpKQogCQkJCWRldl9ob2xkKGRldik7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3ByaW8uYyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCmluZGV4IDI1NjdiNGMuLjAwMGUwNDMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcHJpby5jCisrKyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCkBAIC0zNzIsNiArMzcyLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcHJpb19kdW1wX2NsYXNzX3N0YXRzKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGNsLAorCQkJCSBzdHJ1Y3QgZ25ldF9kdW1wICpkKQoreworCXN0cnVjdCBwcmlvX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IFFkaXNjICpjbF9xOworCisJY2xfcSA9IHEtPnF1ZXVlc1tjbCAtIDFdOworCWlmIChnbmV0X3N0YXRzX2NvcHlfYmFzaWMoZCwgJmNsX3EtPmJzdGF0cykgPCAwIHx8CisJICAgIGduZXRfc3RhdHNfY29weV9xdWV1ZShkLCAmY2xfcS0+cXN0YXRzKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBwcmlvX3dhbGsoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBxZGlzY193YWxrZXIgKmFyZykKIHsKIAlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwpAQCAtNDE0LDYgKzQyOCw3IEBACiAJLmJpbmRfdGNmCT0JcHJpb19iaW5kLAogCS51bmJpbmRfdGNmCT0JcHJpb19wdXQsCiAJLmR1bXAJCT0JcHJpb19kdW1wX2NsYXNzLAorCS5kdW1wX3N0YXRzCT0JcHJpb19kdW1wX2NsYXNzX3N0YXRzLAogfTsKIAogc3RhdGljIHN0cnVjdCBRZGlzY19vcHMgcHJpb19xZGlzY19vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3NmcS5jIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwppbmRleCA0NTljZGEyLi44Mjg0NDgwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3NmcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKQEAgLTE0Myw2ICsxNDMsNyBAQAogCQlpZiAoIShpcGgtPmZyYWdfb2ZmJmh0b25zKElQX01GfElQX09GRlNFVCkpICYmCiAJCSAgICAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCB8fAogCQkgICAgIGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFAgfHwKKwkJICAgICBpcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQTElURSB8fAogCQkgICAgIGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19TQ1RQIHx8CiAJCSAgICAgaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0RDQ1AgfHwKIAkJICAgICBpcGgtPnByb3RvY29sID09IElQUFJPVE9fRVNQKSkKQEAgLTE1Niw2ICsxNTcsNyBAQAogCQloMiA9IGlwaC0+c2FkZHIuczZfYWRkcjMyWzNdXmlwaC0+bmV4dGhkcjsKIAkJaWYgKGlwaC0+bmV4dGhkciA9PSBJUFBST1RPX1RDUCB8fAogCQkgICAgaXBoLT5uZXh0aGRyID09IElQUFJPVE9fVURQIHx8CisJCSAgICBpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19VRFBMSVRFIHx8CiAJCSAgICBpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19TQ1RQIHx8CiAJCSAgICBpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19EQ0NQIHx8CiAJCSAgICBpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19FU1ApCmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmMKaW5kZXggNGUzOTYzMS4uNWYzNzRlMSAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC5jCisrKyBiL25ldC9zb2NrZXQuYwpAQCAtNDA3LDI0ICs0MDcsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBzb2NrZXQgKnNvY2tfZnJvbV9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgKmVycikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBzb2NrZXQgKnNvY2s7Ci0KIAlpZiAoZmlsZS0+Zl9vcCA9PSAmc29ja2V0X2ZpbGVfb3BzKQogCQlyZXR1cm4gZmlsZS0+cHJpdmF0ZV9kYXRhOwkvKiBzZXQgaW4gc29ja19tYXBfZmQgKi8KIAotCWlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlpZiAoIVNfSVNTT0NLKGlub2RlLT5pX21vZGUpKSB7Ci0JCSplcnIgPSAtRU5PVFNPQ0s7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXNvY2sgPSBTT0NLRVRfSShpbm9kZSk7Ci0JaWYgKHNvY2stPmZpbGUgIT0gZmlsZSkgewotCQlwcmludGsoS0VSTl9FUlIgInNvY2tpX2xvb2t1cDogc29ja2V0IGZpbGUgY2hhbmdlZCFcbiIpOwotCQlzb2NrLT5maWxlID0gZmlsZTsKLQl9Ci0JcmV0dXJuIHNvY2s7CisJKmVyciA9IC1FTk9UU09DSzsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoqCkBAIC0xNTI3LDggKzE1MTQsOSBAQAogCXN0cnVjdCBmaWxlICpzb2NrX2ZpbGU7CiAKIAlzb2NrX2ZpbGUgPSBmZ2V0X2xpZ2h0KGZkLCAmZnB1dF9uZWVkZWQpOworCWVyciA9IC1FQkFERjsKIAlpZiAoIXNvY2tfZmlsZSkKLQkJcmV0dXJuIC1FQkFERjsKKwkJZ290byBvdXQ7CiAKIAlzb2NrID0gc29ja19mcm9tX2ZpbGUoc29ja19maWxlLCAmZXJyKTsKIAlpZiAoIXNvY2spCkBAIC0xNTU1LDYgKzE1NDMsNyBAQAogCiBvdXRfcHV0OgogCWZwdXRfbGlnaHQoc29ja19maWxlLCBmcHV0X25lZWRlZCk7CitvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTU4NiwxMiArMTU3NSwxMyBAQAogCWludCBmcHV0X25lZWRlZDsKIAogCXNvY2tfZmlsZSA9IGZnZXRfbGlnaHQoZmQsICZmcHV0X25lZWRlZCk7CisJZXJyID0gLUVCQURGOwogCWlmICghc29ja19maWxlKQotCQlyZXR1cm4gLUVCQURGOworCQlnb3RvIG91dDsKIAogCXNvY2sgPSBzb2NrX2Zyb21fZmlsZShzb2NrX2ZpbGUsICZlcnIpOwogCWlmICghc29jaykKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3B1dDsKIAogCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CiAJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKQEAgLTE2MTAsOCArMTYwMCw5IEBACiAJCWlmIChlcnIyIDwgMCkKIAkJCWVyciA9IGVycjI7CiAJfQotb3V0Ogorb3V0X3B1dDoKIAlmcHV0X2xpZ2h0KHNvY2tfZmlsZSwgZnB1dF9uZWVkZWQpOworb3V0OgogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jIGIvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKaW5kZXggNzY5Y2RkNi4uNGQ5MGExNyAxMDA2NDQKLS0tIGEvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKKysrIGIvbmV0L3dhbnJvdXRlci93YW5tYWluLmMKQEAgLTg2LDggKzg2LDggQEAKIAogc3RhdGljIHN0cnVjdCB3YW5fZGV2aWNlICp3YW5yb3V0ZXJfZmluZF9kZXZpY2UoY2hhciAqbmFtZSk7CiBzdGF0aWMgaW50IHdhbnJvdXRlcl9kZWxldGVfaW50ZXJmYWNlKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIGNoYXIgKm5hbWUpOwotdm9pZCBsb2NrX2FkYXB0ZXJfaXJxKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7Ci12b2lkIHVubG9ja19hZGFwdGVyX2lycShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOworc3RhdGljIHZvaWQgbG9ja19hZGFwdGVyX2lycShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOworc3RhdGljIHZvaWQgdW5sb2NrX2FkYXB0ZXJfaXJxKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7CiAKIAogCkBAIC0xMDQsOCArMTA0LDggQEAKICAqCU9yZ2FuaXplIFVuaXF1ZSBJZGVudGlmaWVycyBmb3IgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgd2Fucm91dGVyX291aV9ldGhlcltdID0geyAweDAwLCAweDAwLCAweDAwIH07CiAjaWYgMAorc3RhdGljIHVuc2lnbmVkIGNoYXIgd2Fucm91dGVyX291aV9ldGhlcltdID0geyAweDAwLCAweDAwLCAweDAwIH07CiBzdGF0aWMgdW5zaWduZWQgY2hhciB3YW5yb3V0ZXJfb3VpXzgwMl8yW10gPSB7IDB4MDAsIDB4ODAsIDB4QzIgfTsKICNlbmRpZgogCkBAIC0yNDYsNiArMjQ2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIDAKKwogLyoKICAqCUVuY2Fwc3VsYXRlIHBhY2tldC4KICAqCkBAIC0zNDEsNiArMzQzLDcgQEAKIAlyZXR1cm4gZXRoZXJ0eXBlOwogfQogCisjZW5kaWYgIC8qICAwICAqLwogCiAvKgogICoJV0FOIGRldmljZSBJT0NUTC4KQEAgLTc5OSwyMyArODAyLDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbG9ja19hZGFwdGVyX2lycShzcGlubG9ja190ICpsb2NrLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCitzdGF0aWMgdm9pZCBsb2NrX2FkYXB0ZXJfaXJxKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncykKIHsKICAgICAgICAJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgKnNtcF9mbGFncyk7CiB9CiAKIAotdm9pZCB1bmxvY2tfYWRhcHRlcl9pcnEoc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQorc3RhdGljIHZvaWQgdW5sb2NrX2FkYXB0ZXJfaXJxKHNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncykKIHsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssICpzbXBfZmxhZ3MpOwogfQogCiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3dhbl9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3dhbl9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTCh3YW5yb3V0ZXJfZW5jYXBzdWxhdGUpOwotRVhQT1JUX1NZTUJPTCh3YW5yb3V0ZXJfdHlwZV90cmFucyk7Ci1FWFBPUlRfU1lNQk9MKGxvY2tfYWRhcHRlcl9pcnEpOwotRVhQT1JUX1NZTUJPTCh1bmxvY2tfYWRhcHRlcl9pcnEpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL25ldC94MjUvTWFrZWZpbGUgYi9uZXQveDI1L01ha2VmaWxlCmluZGV4IDU4N2E3MWEuLmEyYzM0YWIgMTAwNjQ0Ci0tLSBhL25ldC94MjUvTWFrZWZpbGUKKysrIGIvbmV0L3gyNS9NYWtlZmlsZQpAQCAtNiw1ICs2LDUgQEAKIAogeDI1LXkJCQk6PSBhZl94MjUubyB4MjVfZGV2Lm8geDI1X2ZhY2lsaXRpZXMubyB4MjVfaW4ubyBcCiAJCQkgICB4MjVfbGluay5vIHgyNV9vdXQubyB4MjVfcm91dGUubyB4MjVfc3Vici5vIFwKLQkJCSAgIHgyNV90aW1lci5vIHgyNV9wcm9jLm8KKwkJCSAgIHgyNV90aW1lci5vIHgyNV9wcm9jLm8geDI1X2ZvcndhcmQubwogeDI1LSQoQ09ORklHX1NZU0NUTCkJKz0gc3lzY3RsX25ldF94MjUubwpkaWZmIC0tZ2l0IGEvbmV0L3gyNS9hZl94MjUuYyBiL25ldC94MjUvYWZfeDI1LmMKaW5kZXggYjVjODBiMS4uYjM3ZDg5NCAxMDA2NDQKLS0tIGEvbmV0L3gyNS9hZl94MjUuYworKysgYi9uZXQveDI1L2FmX3gyNS5jCkBAIC02Myw2ICs2Myw3IEBACiBpbnQgc3lzY3RsX3gyNV9yZXNldF9yZXF1ZXN0X3RpbWVvdXQgICA9IFgyNV9ERUZBVUxUX1QyMjsKIGludCBzeXNjdGxfeDI1X2NsZWFyX3JlcXVlc3RfdGltZW91dCAgID0gWDI1X0RFRkFVTFRfVDIzOwogaW50IHN5c2N0bF94MjVfYWNrX2hvbGRiYWNrX3RpbWVvdXQgICAgPSBYMjVfREVGQVVMVF9UMjsKK2ludCBzeXNjdGxfeDI1X2ZvcndhcmQgICAgICAgICAgICAgICAgID0gMDsKIAogSExJU1RfSEVBRCh4MjVfbGlzdCk7CiBERUZJTkVfUldMT0NLKHgyNV9saXN0X2xvY2spOwpAQCAtODQ2LDcgKzg0Nyw3IEBACiAJc3RydWN0IHgyNV9hZGRyZXNzIHNvdXJjZV9hZGRyLCBkZXN0X2FkZHI7CiAJc3RydWN0IHgyNV9mYWNpbGl0aWVzIGZhY2lsaXRpZXM7CiAJc3RydWN0IHgyNV9kdGVfZmFjaWxpdGllcyBkdGVfZmFjaWxpdGllczsKLQlpbnQgbGVuLCByYzsKKwlpbnQgbGVuLCBhZGRyX2xlbiwgcmM7CiAKIAkvKgogCSAqCVJlbW92ZSB0aGUgTENJIGFuZCBmcmFtZSB0eXBlLgpAQCAtODU3LDcgKzg1OCw4IEBACiAJICoJRXh0cmFjdCB0aGUgWC4yNSBhZGRyZXNzZXMgYW5kIGNvbnZlcnQgdGhlbSB0byBBU0NJSSBzdHJpbmdzLAogCSAqCWFuZCByZW1vdmUgdGhlbS4KIAkgKi8KLQlza2JfcHVsbChza2IsIHgyNV9hZGRyX250b2Eoc2tiLT5kYXRhLCAmc291cmNlX2FkZHIsICZkZXN0X2FkZHIpKTsKKwlhZGRyX2xlbiA9IHgyNV9hZGRyX250b2Eoc2tiLT5kYXRhLCAmc291cmNlX2FkZHIsICZkZXN0X2FkZHIpOworCXNrYl9wdWxsKHNrYiwgYWRkcl9sZW4pOwogCiAJLyoKIAkgKglHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmFjaWxpdGllcywgc2tpcCBwYXN0IHRoZW0gZm9yIHRoZSBtb21lbnQKQEAgLTg3MywxMSArODc1LDI4IEBACiAJc2sgPSB4MjVfZmluZF9saXN0ZW5lcigmc291cmNlX2FkZHIsc2tiKTsKIAlza2JfcHVzaChza2IsbGVuKTsKIAorCWlmIChzayAhPSBOVUxMICYmIHNrX2FjY2VwdHFfaXNfZnVsbChzaykpIHsKKwkJZ290byBvdXRfc29ja19wdXQ7CisJfQorCiAJLyoKLQkgKglXZSBjYW4ndCBhY2NlcHQgdGhlIENhbGwgUmVxdWVzdC4KKwkgKglXZSBkb250IGhhdmUgYW55IGxpc3RlbmVycyBmb3IgdGhpcyBpbmNvbWluZyBjYWxsLgorCSAqCVRyeSBmb3J3YXJkaW5nIGl0LgogCSAqLwotCWlmIChzayA9PSBOVUxMIHx8IHNrX2FjY2VwdHFfaXNfZnVsbChzaykpCi0JCWdvdG8gb3V0X2NsZWFyX3JlcXVlc3Q7CisJaWYgKHNrID09IE5VTEwpIHsKKwkJc2tiX3B1c2goc2tiLCBhZGRyX2xlbiArIFgyNV9TVERfTUlOX0xFTik7CisJCWlmIChzeXNjdGxfeDI1X2ZvcndhcmQgJiYKKwkJCQl4MjVfZm9yd2FyZF9jYWxsKCZkZXN0X2FkZHIsIG5iLCBza2IsIGxjaSkgPiAwKQorCQl7CisJCQkvKiBDYWxsIHdhcyBmb3J3YXJkZWQsIGRvbnQgcHJvY2VzcyBpdCBhbnkgbW9yZSAqLworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyYyA9IDE7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vIGxpc3RlbmVycywgY2FuJ3QgZm9yd2FyZCwgY2xlYXIgdGhlIGNhbGwgKi8KKwkJCWdvdG8gb3V0X2NsZWFyX3JlcXVlc3Q7CisJCX0KKwl9CiAKIAkvKgogCSAqCVRyeSB0byByZWFjaCBhIGNvbXByb21pc2Ugb24gdGhlIHJlcXVlc3RlZCBmYWNpbGl0aWVzLgpAQCAtMTU5OCw2ICsxNjE3LDkgQEAKIAkJCXgyNV9kaXNjb25uZWN0KHMsIEVORVRVTlJFQUNILCAwLCAwKTsKIAogCXdyaXRlX3VubG9ja19iaCgmeDI1X2xpc3RfbG9jayk7CisKKwkvKiBSZW1vdmUgYW55IHJlbGF0ZWQgZm9yd2FyZHMgKi8KKwl4MjVfY2xlYXJfZm9yd2FyZF9ieV9kZXYobmItPmRldik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHgyNV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQveDI1L3N5c2N0bF9uZXRfeDI1LmMgYi9uZXQveDI1L3N5c2N0bF9uZXRfeDI1LmMKaW5kZXggYWFiZGE1OS4uMmIyZTdmZCAxMDA2NDQKLS0tIGEvbmV0L3gyNS9zeXNjdGxfbmV0X3gyNS5jCisrKyBiL25ldC94MjUvc3lzY3RsX25ldF94MjUuYwpAQCAtNzMsNiArNzMsMTQgQEAKIAkJLmV4dHJhMSA9CSZtaW5fdGltZXIsCiAJCS5leHRyYTIgPQkmbWF4X3RpbWVyLAogCX0sCisJeworCQkuY3RsX25hbWUgPQlORVRfWDI1X0ZPUldBUkQsCisJCS5wcm9jbmFtZSA9CSJ4MjVfZm9yd2FyZCIsCisJCS5kYXRhID0gCSZzeXNjdGxfeDI1X2ZvcndhcmQsCisJCS5tYXhsZW4gPSAJc2l6ZW9mKGludCksCisJCS5tb2RlID0gCTA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYywKKwl9LAogCXsgMCwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC94MjUveDI1X2Rldi5jIGIvbmV0L3gyNS94MjVfZGV2LmMKaW5kZXggMzI4ZDgwZi4uZjA5OWZkNiAxMDA2NDQKLS0tIGEvbmV0L3gyNS94MjVfZGV2LmMKKysrIGIvbmV0L3gyNS94MjVfZGV2LmMKQEAgLTY3LDkgKzY3LDE4IEBACiAJCXJldHVybiB4MjVfcnhfY2FsbF9yZXF1ZXN0KHNrYiwgbmIsIGxjaSk7CiAKIAkvKgotCSAqCUl0cyBub3QgYSBDYWxsIFJlcXVlc3QsIG5vciBpcyBpdCBhIGNvbnRyb2wgZnJhbWUuCi0JICogICAgICBMZXQgY2FsbGVyIHRocm93IGl0IGF3YXkuCisJICogCUl0cyBub3QgYSBDYWxsIFJlcXVlc3QsIG5vciBpcyBpdCBhIGNvbnRyb2wgZnJhbWUuCisJICoJQ2FuIHdlIGZvcndhcmQgaXQ/CiAJICovCisKKwlpZiAoeDI1X2ZvcndhcmRfZGF0YShsY2ksIG5iLCBza2IpKSB7CisJCWlmIChmcmFtZXR5cGUgPT0gWDI1X0NMRUFSX0NPTkZJUk1BVElPTikgeworCQkJeDI1X2NsZWFyX2ZvcndhcmRfYnlfbGNpKGxjaSk7CisJCX0KKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAxOworCX0KKwogLyoKIAl4MjVfdHJhbnNtaXRfY2xlYXJfcmVxdWVzdChuYiwgbGNpLCAweDBEKTsKICovCmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9mb3J3YXJkLmMgYi9uZXQveDI1L3gyNV9mb3J3YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzOWUwYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC94MjUveDI1X2ZvcndhcmQuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqCVRoaXMgbW9kdWxlOgorICoJCVRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglIaXN0b3J5CisgKgkwMy0wMS0yMDA3CUFkZGVkIGZvcndhcmRpbmcgZm9yIHguMjUJQW5kcmV3IEhlbmRyeQorICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC94MjUuaD4KKworc3RydWN0IGxpc3RfaGVhZCB4MjVfZm9yd2FyZF9saXN0ID0gTElTVF9IRUFEX0lOSVQoeDI1X2ZvcndhcmRfbGlzdCk7CitERUZJTkVfUldMT0NLKHgyNV9mb3J3YXJkX2xpc3RfbG9jayk7CisKK2ludCB4MjVfZm9yd2FyZF9jYWxsKHN0cnVjdCB4MjVfYWRkcmVzcyAqZGVzdF9hZGRyLCBzdHJ1Y3QgeDI1X25laWdoICpmcm9tLAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxjaSkKK3sKKwlzdHJ1Y3QgeDI1X3JvdXRlICpydDsKKwlzdHJ1Y3QgeDI1X25laWdoICpuZWlnaF9uZXcgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCB4MjVfZm9yd2FyZCAqeDI1X2Zyd2QsICpuZXdfZnJ3ZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tibjsKKwlzaG9ydCBzYW1lX2xjaSA9IDA7CisJaW50IHJjID0gMDsKKworCWlmICgocnQgPSB4MjVfZ2V0X3JvdXRlKGRlc3RfYWRkcikpICE9IE5VTEwpIHsKKworCQlpZiAoKG5laWdoX25ldyA9IHgyNV9nZXRfbmVpZ2gocnQtPmRldikpID09IE5VTEwpIHsKKwkJCS8qIFRoaXMgc2hvdWxkbnQgaGFwcGVuLCBpZiBpdCBvY2N1cnMgc29tZWhvdworCQkJICogZG8gc29tZXRoaW5nIHNlbnNpYmxlCisJCQkgKi8KKwkJCWdvdG8gb3V0X3B1dF9yb3V0ZTsKKwkJfQorCisJCS8qIEF2b2lkIGEgbG9vcC4gVGhpcyBpcyB0aGUgbm9ybWFsIGV4aXQgcGF0aCBmb3IgYQorCQkgKiBzeXN0ZW0gd2l0aCBvbmx5IG9uZSB4LjI1IGlmYWNlIGFuZCBkZWZhdWx0IHJvdXRlCisJCSAqLworCQlpZiAocnQtPmRldiA9PSBmcm9tLT5kZXYpIHsKKwkJCWdvdG8gb3V0X3B1dF9uYjsKKwkJfQorCisJCS8qIFJlbW90ZSBlbmQgc2VuZGluZyBhIGNhbGwgcmVxdWVzdCBvbiBhbiBhbHJlYWR5CisJCSAqIGVzdGFibGlzaGVkIExDST8gSXQgc2hvdWxkbnQgaGFwcGVuLCBqdXN0IGluIGNhc2UuLgorCQkgKi8KKwkJcmVhZF9sb2NrX2JoKCZ4MjVfZm9yd2FyZF9saXN0X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmeDI1X2ZvcndhcmRfbGlzdCkgeworCQkJeDI1X2Zyd2QgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgeDI1X2ZvcndhcmQsIG5vZGUpOworCQkJaWYgKHgyNV9mcndkLT5sY2kgPT0gbGNpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiWC4yNTogY2FsbCByZXF1ZXN0IGZvciBsY2kgd2hpY2ggaXMgYWxyZWFkeSByZWdpc3RlcmVkISwgdHJhbnNtaXR0aW5nIGJ1dCBub3QgcmVnaXN0ZXJpbmcgbmV3IHBhaXJcbiIpOworCQkJCXNhbWVfbGNpID0gMTsKKwkJCX0KKwkJfQorCQlyZWFkX3VubG9ja19iaCgmeDI1X2ZvcndhcmRfbGlzdF9sb2NrKTsKKworCQkvKiBTYXZlIHRoZSBmb3J3YXJkaW5nIGRldGFpbHMgZm9yIGZ1dHVyZSB0cmFmZmljICovCisJCWlmICghc2FtZV9sY2kpeworCQkJaWYgKChuZXdfZnJ3ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB4MjVfZm9yd2FyZCksCisJCQkJCQkJR0ZQX0FUT01JQykpID09IE5VTEwpeworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dF9wdXRfbmI7CisJCQl9CisJCQluZXdfZnJ3ZC0+bGNpID0gbGNpOworCQkJbmV3X2Zyd2QtPmRldjEgPSBydC0+ZGV2OworCQkJbmV3X2Zyd2QtPmRldjIgPSBmcm9tLT5kZXY7CisJCQl3cml0ZV9sb2NrX2JoKCZ4MjVfZm9yd2FyZF9saXN0X2xvY2spOworCQkJbGlzdF9hZGQoJm5ld19mcndkLT5ub2RlLCAmeDI1X2ZvcndhcmRfbGlzdCk7CisJCQl3cml0ZV91bmxvY2tfYmgoJngyNV9mb3J3YXJkX2xpc3RfbG9jayk7CisJCX0KKworCQkvKiBGb3J3YXJkIHRoZSBjYWxsIHJlcXVlc3QgKi8KKwkJaWYgKCAoc2tibiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKXsKKwkJCWdvdG8gb3V0X3B1dF9uYjsKKwkJfQorCQl4MjVfdHJhbnNtaXRfbGluayhza2JuLCBuZWlnaF9uZXcpOworCQlyYyA9IDE7CisJfQorCisKK291dF9wdXRfbmI6CisJeDI1X25laWdoX3B1dChuZWlnaF9uZXcpOworCitvdXRfcHV0X3JvdXRlOgorCXgyNV9yb3V0ZV9wdXQocnQpOworCXJldHVybiByYzsKK30KKworCitpbnQgeDI1X2ZvcndhcmRfZGF0YShpbnQgbGNpLCBzdHJ1Y3QgeDI1X25laWdoICpmcm9tLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7CisKKwlzdHJ1Y3QgeDI1X2ZvcndhcmQgKmZyd2Q7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBlZXIgPSBOVUxMOworCXN0cnVjdCB4MjVfbmVpZ2ggKm5iOworCXN0cnVjdCBza19idWZmICpza2JuOworCWludCByYyA9IDA7CisKKwlyZWFkX2xvY2tfYmgoJngyNV9mb3J3YXJkX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJngyNV9mb3J3YXJkX2xpc3QpIHsKKwkJZnJ3ZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCB4MjVfZm9yd2FyZCwgbm9kZSk7CisJCWlmIChmcndkLT5sY2kgPT0gbGNpKSB7CisJCQkvKiBUaGUgY2FsbCBpcyBlc3RhYmxpc2hlZCwgZWl0aGVyIHNpZGUgY2FuIHNlbmQgKi8KKwkJCWlmIChmcm9tLT5kZXYgPT0gZnJ3ZC0+ZGV2MSkgeworCQkJCXBlZXIgPSBmcndkLT5kZXYyOworCQkJfSBlbHNlIHsKKwkJCQlwZWVyID0gZnJ3ZC0+ZGV2MTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ4MjVfZm9yd2FyZF9saXN0X2xvY2spOworCisJaWYgKCAobmIgPSB4MjVfZ2V0X25laWdoKHBlZXIpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmICggKHNrYm4gPSBwc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCl7CisJCWdvdG8gb3V0OworCisJfQorCXgyNV90cmFuc21pdF9saW5rKHNrYm4sIG5iKTsKKworCXgyNV9uZWlnaF9wdXQobmIpOworCXJjID0gMTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgeDI1X2NsZWFyX2ZvcndhcmRfYnlfbGNpKHVuc2lnbmVkIGludCBsY2kpCit7CisJc3RydWN0IHgyNV9mb3J3YXJkICpmd2Q7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisKKwl3cml0ZV9sb2NrX2JoKCZ4MjVfZm9yd2FyZF9saXN0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZ4MjVfZm9yd2FyZF9saXN0KSB7CisJCWZ3ZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCB4MjVfZm9yd2FyZCwgbm9kZSk7CisJCWlmIChmd2QtPmxjaSA9PSBsY2kpIHsKKwkJCWxpc3RfZGVsKCZmd2QtPm5vZGUpOworCQkJa2ZyZWUoZndkKTsKKwkJfQorCX0KKwl3cml0ZV91bmxvY2tfYmgoJngyNV9mb3J3YXJkX2xpc3RfbG9jayk7Cit9CisKKwordm9pZCB4MjVfY2xlYXJfZm9yd2FyZF9ieV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X2ZvcndhcmQgKmZ3ZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKKworCXdyaXRlX2xvY2tfYmgoJngyNV9mb3J3YXJkX2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJngyNV9mb3J3YXJkX2xpc3QpIHsKKwkJZndkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHgyNV9mb3J3YXJkLCBub2RlKTsKKwkJaWYgKChmd2QtPmRldjEgPT0gZGV2KSB8fCAoZndkLT5kZXYyID09IGRldikpeworCQkJbGlzdF9kZWwoJmZ3ZC0+bm9kZSk7CisJCQlrZnJlZShmd2QpOworCQl9CisJfQorCXdyaXRlX3VubG9ja19iaCgmeDI1X2ZvcndhcmRfbGlzdF9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL25ldC94MjUveDI1X3Byb2MuYyBiL25ldC94MjUveDI1X3Byb2MuYwppbmRleCBhMTE4MzdkLi5lMDQ3MGJkIDEwMDY0NAotLS0gYS9uZXQveDI1L3gyNV9wcm9jLmMKKysrIGIvbmV0L3gyNS94MjVfcHJvYy5jCkBAIC0xNjUsNiArMTY1LDc1IEBACiAJcmV0dXJuIDA7CiB9IAogCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgeDI1X2ZvcndhcmQgKngyNV9nZXRfZm9yd2FyZF9pZHgobG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgeDI1X2ZvcndhcmQgKmY7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmeDI1X2ZvcndhcmRfbGlzdCkgeworCQlmID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHgyNV9mb3J3YXJkLCBub2RlKTsKKwkJaWYgKCFwb3MtLSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJZiA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gZjsKK30KKworc3RhdGljIHZvaWQgKngyNV9zZXFfZm9yd2FyZF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJbG9mZl90IGwgPSAqcG9zOworCisJcmVhZF9sb2NrX2JoKCZ4MjVfZm9yd2FyZF9saXN0X2xvY2spOworCXJldHVybiBsID8geDI1X2dldF9mb3J3YXJkX2lkeCgtLWwpIDogU0VRX1NUQVJUX1RPS0VOOworfQorCitzdGF0aWMgdm9pZCAqeDI1X3NlcV9mb3J3YXJkX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB4MjVfZm9yd2FyZCAqZjsKKworCSsrKnBvczsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJZiA9IE5VTEw7CisJCWlmICghbGlzdF9lbXB0eSgmeDI1X2ZvcndhcmRfbGlzdCkpCisJCQlmID0gbGlzdF9lbnRyeSh4MjVfZm9yd2FyZF9saXN0Lm5leHQsCisJCQkJCXN0cnVjdCB4MjVfZm9yd2FyZCwgbm9kZSk7CisJCWdvdG8gb3V0OworCX0KKwlmID0gdjsKKwlpZiAoZi0+bm9kZS5uZXh0ICE9ICZ4MjVfZm9yd2FyZF9saXN0KQorCQlmID0gbGlzdF9lbnRyeShmLT5ub2RlLm5leHQsIHN0cnVjdCB4MjVfZm9yd2FyZCwgbm9kZSk7CisJZWxzZQorCQlmID0gTlVMTDsKK291dDoKKwlyZXR1cm4gZjsKKworfQorCitzdGF0aWMgdm9pZCB4MjVfc2VxX2ZvcndhcmRfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9ja19iaCgmeDI1X2ZvcndhcmRfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIGludCB4MjVfc2VxX2ZvcndhcmRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgeDI1X2ZvcndhcmQgKmY7CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3ByaW50ZihzZXEsICJsY2kgZGV2MSAgICAgICBkZXYyXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZiA9IHY7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiVkICUtMTBzICUtMTBzXG4iLAorCQkJZi0+bGNpLCBmLT5kZXYxLT5uYW1lLCBmLT5kZXYyLT5uYW1lKTsKKworb3V0OgorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHgyNV9zZXFfcm91dGVfb3BzID0gewogCS5zdGFydCAgPSB4MjVfc2VxX3JvdXRlX3N0YXJ0LAogCS5uZXh0ICAgPSB4MjVfc2VxX3JvdXRlX25leHQsCkBAIC0xNzksNiArMjQ4LDEzIEBACiAJLnNob3cgICA9IHgyNV9zZXFfc29ja2V0X3Nob3csCiB9OwogCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHgyNV9zZXFfZm9yd2FyZF9vcHMgPSB7CisJLnN0YXJ0ICA9IHgyNV9zZXFfZm9yd2FyZF9zdGFydCwKKwkubmV4dCAgID0geDI1X3NlcV9mb3J3YXJkX25leHQsCisJLnN0b3AgICA9IHgyNV9zZXFfZm9yd2FyZF9zdG9wLAorCS5zaG93ICAgPSB4MjVfc2VxX2ZvcndhcmRfc2hvdywKK307CisKIHN0YXRpYyBpbnQgeDI1X3NlcV9zb2NrZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJngyNV9zZXFfc29ja2V0X29wcyk7CkBAIC0xODksNiArMjY1LDExIEBACiAJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZ4MjVfc2VxX3JvdXRlX29wcyk7CiB9CiAKK3N0YXRpYyBpbnQgeDI1X3NlcV9mb3J3YXJkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZ4MjVfc2VxX2ZvcndhcmRfb3BzKTsKK30KKwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeDI1X3NlcV9zb2NrZXRfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0geDI1X3NlcV9zb2NrZXRfb3BlbiwKQEAgLTIwNSw2ICsyODYsMTQgQEAKIAkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAogfTsKIAorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeDI1X3NlcV9mb3J3YXJkX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHgyNV9zZXFfZm9yd2FyZF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp4MjVfcHJvY19kaXI7CiAKIGludCBfX2luaXQgeDI1X3Byb2NfaW5pdCh2b2lkKQpAQCAtMjI1LDkgKzMxNCwxNyBAQAogCWlmICghcCkKIAkJZ290byBvdXRfc29ja2V0OwogCXAtPnByb2NfZm9wcyA9ICZ4MjVfc2VxX3NvY2tldF9mb3BzOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJmb3J3YXJkIiwgU19JUlVHTywgeDI1X3Byb2NfZGlyKTsKKwlpZiAoIXApCisJCWdvdG8gb3V0X2ZvcndhcmQ7CisJcC0+cHJvY19mb3BzID0gJngyNV9zZXFfZm9yd2FyZF9mb3BzOwogCXJjID0gMDsKKwogb3V0OgogCXJldHVybiByYzsKK291dF9mb3J3YXJkOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJzb2NrZXQiLCB4MjVfcHJvY19kaXIpOwogb3V0X3NvY2tldDoKIAlyZW1vdmVfcHJvY19lbnRyeSgicm91dGUiLCB4MjVfcHJvY19kaXIpOwogb3V0X3JvdXRlOgpAQCAtMjM3LDYgKzMzNCw3IEBACiAKIHZvaWQgX19leGl0IHgyNV9wcm9jX2V4aXQodm9pZCkKIHsKKwlyZW1vdmVfcHJvY19lbnRyeSgiZm9yd2FyZCIsIHgyNV9wcm9jX2Rpcik7CiAJcmVtb3ZlX3Byb2NfZW50cnkoInJvdXRlIiwgeDI1X3Byb2NfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgic29ja2V0IiwgeDI1X3Byb2NfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgieDI1IiwgcHJvY19uZXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3gyNS94MjVfcm91dGUuYyBiL25ldC94MjUveDI1X3JvdXRlLmMKaW5kZXggMmEzZmU5OC4uODgzYTg0OCAxMDA2NDQKLS0tIGEvbmV0L3gyNS94MjVfcm91dGUuYworKysgYi9uZXQveDI1L3gyNV9yb3V0ZS5jCkBAIC0xMTksNiArMTE5LDkgQEAKIAkJCV9feDI1X3JlbW92ZV9yb3V0ZShydCk7CiAJfQogCXdyaXRlX3VubG9ja19iaCgmeDI1X3JvdXRlX2xpc3RfbG9jayk7CisKKwkvKiBSZW1vdmUgYW55IHJlbGF0ZWQgZm9yd2FyZGluZyAqLworCXgyNV9jbGVhcl9mb3J3YXJkX2J5X2RldihkZXYpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0vS2NvbmZpZyBiL25ldC94ZnJtL0tjb25maWcKaW5kZXggMGZhYWI2My4uNTc3YTRmODIgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL0tjb25maWcKKysrIGIvbmV0L3hmcm0vS2NvbmZpZwpAQCAtMjQsNiArMjQsMTcgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFhGUk1fTUlHUkFURQorCWJvb2wgIlRyYW5zZm9ybWF0aW9uIG1pZ3JhdGUgZGF0YWJhc2UgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBYRlJNICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIEEgZmVhdHVyZSB0byB1cGRhdGUgbG9jYXRvcihzKSBvZiBhIGdpdmVuIElQc2VjIHNlY3VyaXR5CisJICBhc3NvY2lhdGlvbiBkeW5hbWljYWxseS4gIFRoaXMgZmVhdHVyZSBpcyByZXF1aXJlZCwgZm9yCisJICBpbnN0YW5jZSwgaW4gYSBNb2JpbGUgSVB2NiBlbnZpcm9ubWVudCB3aXRoIElQc2VjIGNvbmZpZ3VyYXRpb24KKwkgIHdoZXJlIG1vYmlsZSBub2RlcyBjaGFuZ2UgdGhlaXIgYXR0YWNobWVudCBwb2ludCB0byB0aGUgSW50ZXJuZXQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBORVRfS0VZCiAJdHJpc3RhdGUgIlBGX0tFWSBzb2NrZXRzIgogCXNlbGVjdCBYRlJNCkBAIC0zNCw0ICs0NSwxOSBAQAogCiAJICBTYXkgWSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgogCitjb25maWcgTkVUX0tFWV9NSUdSQVRFCisJYm9vbCAiUEZfS0VZIE1JR1JBVEUgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfS0VZICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBYRlJNX01JR1JBVEUKKwktLS1oZWxwLS0tCisJICBBZGQgYSBQRl9LRVkgTUlHUkFURSBtZXNzYWdlIHRvIFBGX0tFWXYyIHNvY2tldCBmYW1pbHkuCisJICBUaGUgUEZfS0VZIE1JR1JBVEUgbWVzc2FnZSBpcyB1c2VkIHRvIGR5bmFtaWNhbGx5IHVwZGF0ZQorCSAgbG9jYXRvcihzKSBvZiBhIGdpdmVuIElQc2VjIHNlY3VyaXR5IGFzc29jaWF0aW9uLgorCSAgVGhpcyBmZWF0dXJlIGlzIHJlcXVpcmVkLCBmb3IgaW5zdGFuY2UsIGluIGEgTW9iaWxlIElQdjYKKwkgIGVudmlyb25tZW50IHdpdGggSVBzZWMgY29uZmlndXJhdGlvbiB3aGVyZSBtb2JpbGUgbm9kZXMKKwkgIGNoYW5nZSB0aGVpciBhdHRhY2htZW50IHBvaW50IHRvIHRoZSBJbnRlcm5ldC4gIERldGFpbAorCSAgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBpbnRlcm5ldC1kcmFmdAorCSAgPGRyYWZ0LXN1Z2ltb3RvLW1pcDYtcGZrZXktbWlncmF0ZT4uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fYWxnby5jIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKaW5kZXggZjFjZjM0MC4uMjQ4Zjk0OCAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9hbGdvLmMKKysrIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKQEAgLTI2Niw2ICsyNjYsMjMgQEAKICAgICAgICAgfQogfSwKIHsKKwkubmFtZSA9ICJjYmMoY2FtZWxsaWEpIiwKKworCS51aW5mbyA9IHsKKwkJLmVuY3IgPSB7CisJCQkuYmxvY2tiaXRzID0gMTI4LAorCQkJLmRlZmtleWJpdHMgPSAxMjgsCisJCX0KKwl9LAorCisJLmRlc2MgPSB7CisJCS5zYWRiX2FsZ19pZCA9IFNBREJfWF9FQUxHX0NBTUVMTElBQ0JDLAorCQkuc2FkYl9hbGdfaXZsZW4gPSA4LAorCQkuc2FkYl9hbGdfbWluYml0cyA9IDEyOCwKKwkJLnNhZGJfYWxnX21heGJpdHMgPSAyNTYKKwl9Cit9LAorewogICAgICAgICAubmFtZSA9ICJjYmModHdvZmlzaCkiLAogICAgICAgICAuY29tcGF0ID0gInR3b2Zpc2giLAogICAgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCmluZGV4IGI3ZTUzN2YuLmZhN2NlMDYgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKKysrIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwpAQCAtMjIzNiwzICsyMjM2LDIzNCBAQAogCXhmcm1faW5wdXRfaW5pdCgpOwogfQogCisjaWZkZWYgQ09ORklHX1hGUk1fTUlHUkFURQorc3RhdGljIGludCB4ZnJtX21pZ3JhdGVfc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbF9jbXAsCisJCQkJICAgICAgIHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWxfdGd0KQoreworCWlmIChzZWxfY21wLT5wcm90byA9PSBJUFNFQ19VTFBST1RPX0FOWSkgeworCQlpZiAoc2VsX3RndC0+ZmFtaWx5ID09IHNlbF9jbXAtPmZhbWlseSAmJgorCQkgICAgeGZybV9hZGRyX2NtcCgmc2VsX3RndC0+ZGFkZHIsICZzZWxfY21wLT5kYWRkciwKKwkJCSAgICAgICAgICBzZWxfY21wLT5mYW1pbHkpID09IDAgJiYKKwkJICAgIHhmcm1fYWRkcl9jbXAoJnNlbF90Z3QtPnNhZGRyLCAmc2VsX2NtcC0+c2FkZHIsCisJCQkJICBzZWxfY21wLT5mYW1pbHkpID09IDAgJiYKKwkJICAgIHNlbF90Z3QtPnByZWZpeGxlbl9kID09IHNlbF9jbXAtPnByZWZpeGxlbl9kICYmCisJCSAgICBzZWxfdGd0LT5wcmVmaXhsZW5fcyA9PSBzZWxfY21wLT5wcmVmaXhsZW5fcykgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobWVtY21wKHNlbF90Z3QsIHNlbF9jbXAsIHNpemVvZigqc2VsX3RndCkpID09IDApIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5ICogeGZybV9taWdyYXRlX3BvbGljeV9maW5kKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsCisJCQkJCQkgICAgIHU4IGRpciwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwgKnJldCA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OworCXN0cnVjdCBobGlzdF9oZWFkICpjaGFpbjsKKwl1MzIgcHJpb3JpdHkgPSB+MFU7CisKKwlyZWFkX2xvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCWNoYWluID0gcG9saWN5X2hhc2hfZGlyZWN0KCZzZWwtPmRhZGRyLCAmc2VsLT5zYWRkciwgc2VsLT5mYW1pbHksIGRpcik7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBlbnRyeSwgY2hhaW4sIGJ5ZHN0KSB7CisJCWlmICh4ZnJtX21pZ3JhdGVfc2VsZWN0b3JfbWF0Y2goc2VsLCAmcG9sLT5zZWxlY3RvcikgJiYKKwkJICAgIHBvbC0+dHlwZSA9PSB0eXBlKSB7CisJCQlyZXQgPSBwb2w7CisJCQlwcmlvcml0eSA9IHJldC0+cHJpb3JpdHk7CisJCQlicmVhazsKKwkJfQorCX0KKwljaGFpbiA9ICZ4ZnJtX3BvbGljeV9pbmV4YWN0W2Rpcl07CisJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBlbnRyeSwgY2hhaW4sIGJ5ZHN0KSB7CisJCWlmICh4ZnJtX21pZ3JhdGVfc2VsZWN0b3JfbWF0Y2goc2VsLCAmcG9sLT5zZWxlY3RvcikgJiYKKwkJICAgIHBvbC0+dHlwZSA9PSB0eXBlICYmCisJCSAgICBwb2wtPnByaW9yaXR5IDwgcHJpb3JpdHkpIHsKKwkJCXJldCA9IHBvbDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldCkKKwkJeGZybV9wb2xfaG9sZChyZXQpOworCisJcmVhZF91bmxvY2tfYmgoJnhmcm1fcG9saWN5X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtaWdyYXRlX3RtcGxfbWF0Y2goc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgc3RydWN0IHhmcm1fdG1wbCAqdCkKK3sKKwlpbnQgbWF0Y2ggPSAwOworCisJaWYgKHQtPm1vZGUgPT0gbS0+bW9kZSAmJiB0LT5pZC5wcm90byA9PSBtLT5wcm90byAmJgorCSAgICAobS0+cmVxaWQgPT0gMCB8fCB0LT5yZXFpZCA9PSBtLT5yZXFpZCkpIHsKKwkJc3dpdGNoICh0LT5tb2RlKSB7CisJCWNhc2UgWEZSTV9NT0RFX1RVTk5FTDoKKwkJY2FzZSBYRlJNX01PREVfQkVFVDoKKwkJCWlmICh4ZnJtX2FkZHJfY21wKCZ0LT5pZC5kYWRkciwgJm0tPm9sZF9kYWRkciwKKwkJCQkJICBtLT5vbGRfZmFtaWx5KSA9PSAwICYmCisJCQkgICAgeGZybV9hZGRyX2NtcCgmdC0+c2FkZHIsICZtLT5vbGRfc2FkZHIsCisJCQkJCSAgbS0+b2xkX2ZhbWlseSkgPT0gMCkgeworCQkJCW1hdGNoID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFhGUk1fTU9ERV9UUkFOU1BPUlQ6CisJCQkvKiBpbiBjYXNlIG9mIHRyYW5zcG9ydCBtb2RlLCB0ZW1wbGF0ZSBkb2VzIG5vdCBzdG9yZQorCQkJICAgYW55IElQIGFkZHJlc3NlcywgaGVuY2Ugd2UganVzdCBjb21wYXJlIG1vZGUgYW5kCisJCQkgICBwcm90b2NvbCAqLworCQkJbWF0Y2ggPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gbWF0Y2g7Cit9CisKKy8qIHVwZGF0ZSBlbmRwb2ludCBhZGRyZXNzKGVzKSBvZiB0ZW1wbGF0ZShzKSAqLworc3RhdGljIGludCB4ZnJtX3BvbGljeV9taWdyYXRlKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sLAorCQkJICAgICAgIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fbWlncmF0ZSkKK3sKKwlzdHJ1Y3QgeGZybV9taWdyYXRlICptcDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisJaW50IGksIGosIG4gPSAwOworCisJd3JpdGVfbG9ja19iaCgmcG9sLT5sb2NrKTsKKwlpZiAodW5saWtlbHkocG9sLT5kZWFkKSkgeworCQkvKiB0YXJnZXQgcG9saWN5IGhhcyBiZWVuIGRlbGV0ZWQgKi8KKwkJd3JpdGVfdW5sb2NrX2JoKCZwb2wtPmxvY2spOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9sLT54ZnJtX25yOyBpKyspIHsKKwkJZm9yIChqID0gMCwgbXAgPSBtOyBqIDwgbnVtX21pZ3JhdGU7IGorKywgbXArKykgeworCQkJaWYgKCFtaWdyYXRlX3RtcGxfbWF0Y2gobXAsICZwb2wtPnhmcm1fdmVjW2ldKSkKKwkJCQljb250aW51ZTsKKwkJCW4rKzsKKwkJCWlmIChwb2wtPnhmcm1fdmVjW2ldLm1vZGUgIT0gWEZSTV9NT0RFX1RVTk5FTCkKKwkJCQljb250aW51ZTsKKwkJCS8qIHVwZGF0ZSBlbmRwb2ludHMgKi8KKwkJCW1lbWNweSgmcG9sLT54ZnJtX3ZlY1tpXS5pZC5kYWRkciwgJm1wLT5uZXdfZGFkZHIsCisJCQkgICAgICAgc2l6ZW9mKHBvbC0+eGZybV92ZWNbaV0uaWQuZGFkZHIpKTsKKwkJCW1lbWNweSgmcG9sLT54ZnJtX3ZlY1tpXS5zYWRkciwgJm1wLT5uZXdfc2FkZHIsCisJCQkgICAgICAgc2l6ZW9mKHBvbC0+eGZybV92ZWNbaV0uc2FkZHIpKTsKKwkJCXBvbC0+eGZybV92ZWNbaV0uZW5jYXBfZmFtaWx5ID0gbXAtPm5ld19mYW1pbHk7CisJCQkvKiBmbHVzaCBidW5kbGVzICovCisJCQl3aGlsZSAoKGRzdCA9IHBvbC0+YnVuZGxlcykgIT0gTlVMTCkgeworCQkJCXBvbC0+YnVuZGxlcyA9IGRzdC0+bmV4dDsKKwkJCQlkc3RfZnJlZShkc3QpOworCQkJfQorCQl9CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZwb2wtPmxvY2spOworCisJaWYgKCFuKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ZnJtX21pZ3JhdGVfY2hlY2soc3RydWN0IHhmcm1fbWlncmF0ZSAqbSwgaW50IG51bV9taWdyYXRlKQoreworCWludCBpLCBqOworCisJaWYgKG51bV9taWdyYXRlIDwgMSB8fCBudW1fbWlncmF0ZSA+IFhGUk1fTUFYX0RFUFRIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbWlncmF0ZTsgaSsrKSB7CisJCWlmICgoeGZybV9hZGRyX2NtcCgmbVtpXS5vbGRfZGFkZHIsICZtW2ldLm5ld19kYWRkciwKKwkJCQkgICBtW2ldLm9sZF9mYW1pbHkpID09IDApICYmCisJCSAgICAoeGZybV9hZGRyX2NtcCgmbVtpXS5vbGRfc2FkZHIsICZtW2ldLm5ld19zYWRkciwKKwkJCQkgICBtW2ldLm9sZF9mYW1pbHkpID09IDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh4ZnJtX2FkZHJfYW55KCZtW2ldLm5ld19kYWRkciwgbVtpXS5uZXdfZmFtaWx5KSB8fAorCQkgICAgeGZybV9hZGRyX2FueSgmbVtpXS5uZXdfc2FkZHIsIG1baV0ubmV3X2ZhbWlseSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgZHVwbGljYXRlZCBlbnRyeSAqLworCQlmb3IgKGogPSBpICsgMTsgaiA8IG51bV9taWdyYXRlOyBqKyspIHsKKwkJCWlmICghbWVtY21wKCZtW2ldLm9sZF9kYWRkciwgJm1bal0ub2xkX2RhZGRyLAorCQkJCSAgICBzaXplb2YobVtpXS5vbGRfZGFkZHIpKSAmJgorCQkJICAgICFtZW1jbXAoJm1baV0ub2xkX3NhZGRyLCAmbVtqXS5vbGRfc2FkZHIsCisJCQkJICAgIHNpemVvZihtW2ldLm9sZF9zYWRkcikpICYmCisJCQkgICAgbVtpXS5wcm90byA9PSBtW2pdLnByb3RvICYmCisJCQkgICAgbVtpXS5tb2RlID09IG1bal0ubW9kZSAmJgorCQkJICAgIG1baV0ucmVxaWQgPT0gbVtqXS5yZXFpZCAmJgorCQkJICAgIG1baV0ub2xkX2ZhbWlseSA9PSBtW2pdLm9sZF9mYW1pbHkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHhmcm1fbWlncmF0ZShzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCB1OCBkaXIsIHU4IHR5cGUsCisJCSBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX21pZ3JhdGUpCit7CisJaW50IGksIGVyciwgbnhfY3VyID0gMCwgbnhfbmV3ID0gMDsKKwlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCA9IE5VTEw7CisJc3RydWN0IHhmcm1fc3RhdGUgKngsICp4YzsKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeF9jdXJbWEZSTV9NQVhfREVQVEhdOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4X25ld1tYRlJNX01BWF9ERVBUSF07CisJc3RydWN0IHhmcm1fbWlncmF0ZSAqbXA7CisKKwlpZiAoKGVyciA9IHhmcm1fbWlncmF0ZV9jaGVjayhtLCBudW1fbWlncmF0ZSkpIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBTdGFnZSAxIC0gZmluZCBwb2xpY3kgKi8KKwlpZiAoKHBvbCA9IHhmcm1fbWlncmF0ZV9wb2xpY3lfZmluZChzZWwsIGRpciwgdHlwZSkpID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU3RhZ2UgMiAtIGZpbmQgYW5kIHVwZGF0ZSBzdGF0ZShzKSAqLworCWZvciAoaSA9IDAsIG1wID0gbTsgaSA8IG51bV9taWdyYXRlOyBpKyssIG1wKyspIHsKKwkJaWYgKCh4ID0geGZybV9taWdyYXRlX3N0YXRlX2ZpbmQobXApKSkgeworCQkJeF9jdXJbbnhfY3VyXSA9IHg7CisJCQlueF9jdXIrKzsKKwkJCWlmICgoeGMgPSB4ZnJtX3N0YXRlX21pZ3JhdGUoeCwgbXApKSkgeworCQkJCXhfbmV3W254X25ld10gPSB4YzsKKwkJCQlueF9uZXcrKzsKKwkJCX0gZWxzZSB7CisJCQkJZXJyID0gLUVOT0RBVEE7CisJCQkJZ290byByZXN0b3JlX3N0YXRlOworCQkJfQorCQl9CisJfQorCisJLyogU3RhZ2UgMyAtIHVwZGF0ZSBwb2xpY3kgKi8KKwlpZiAoKGVyciA9IHhmcm1fcG9saWN5X21pZ3JhdGUocG9sLCBtLCBudW1fbWlncmF0ZSkpIDwgMCkKKwkJZ290byByZXN0b3JlX3N0YXRlOworCisJLyogU3RhZ2UgNCAtIGRlbGV0ZSBvbGQgc3RhdGUocykgKi8KKwlpZiAobnhfY3VyKSB7CisJCXhmcm1fc3RhdGVzX3B1dCh4X2N1ciwgbnhfY3VyKTsKKwkJeGZybV9zdGF0ZXNfZGVsZXRlKHhfY3VyLCBueF9jdXIpOworCX0KKworCS8qIFN0YWdlIDUgLSBhbm5vdW5jZSAqLworCWttX21pZ3JhdGUoc2VsLCBkaXIsIHR5cGUsIG0sIG51bV9taWdyYXRlKTsKKworCXhmcm1fcG9sX3B1dChwb2wpOworCisJcmV0dXJuIDA7CitvdXQ6CisJcmV0dXJuIGVycjsKKworcmVzdG9yZV9zdGF0ZToKKwlpZiAocG9sKQorCQl4ZnJtX3BvbF9wdXQocG9sKTsKKwlpZiAobnhfY3VyKQorCQl4ZnJtX3N0YXRlc19wdXQoeF9jdXIsIG54X2N1cik7CisJaWYgKG54X25ldykKKwkJeGZybV9zdGF0ZXNfZGVsZXRlKHhfbmV3LCBueF9uZXcpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9taWdyYXRlKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3N0YXRlLmMgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKaW5kZXggZmRiMDhkOS4uOTFiMDI2OCAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jCisrKyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwpAQCAtMTgzLDkgKzE4Myw2IEBACiAKIGludCBfX3hmcm1fc3RhdGVfZGVsZXRlKHN0cnVjdCB4ZnJtX3N0YXRlICp4KTsKIAotc3RhdGljIHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqeGZybV9zdGF0ZV9nZXRfYWZpbmZvKHVuc2lnbmVkIHNob3J0IGZhbWlseSk7Ci1zdGF0aWMgdm9pZCB4ZnJtX3N0YXRlX3B1dF9hZmluZm8oc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvICphZmluZm8pOwotCiBpbnQga21fcXVlcnkoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCB4ZnJtX3RtcGwgKnQsIHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sKTsKIHZvaWQga21fc3RhdGVfZXhwaXJlZChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IGhhcmQsIHUzMiBwaWQpOwogCkBAIC04MzEsNiArODI4LDE2MCBAQAogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2FkZCk7CiAKKyNpZmRlZiBDT05GSUdfWEZSTV9NSUdSQVRFCitzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybV9zdGF0ZV9jbG9uZShzdHJ1Y3QgeGZybV9zdGF0ZSAqb3JpZywgaW50ICplcnJwKQoreworCWludCBlcnIgPSAtRU5PTUVNOworCXN0cnVjdCB4ZnJtX3N0YXRlICp4ID0geGZybV9zdGF0ZV9hbGxvYygpOworCWlmICgheCkKKwkJZ290byBlcnJvcjsKKworCW1lbWNweSgmeC0+aWQsICZvcmlnLT5pZCwgc2l6ZW9mKHgtPmlkKSk7CisJbWVtY3B5KCZ4LT5zZWwsICZvcmlnLT5zZWwsIHNpemVvZih4LT5zZWwpKTsKKwltZW1jcHkoJngtPmxmdCwgJm9yaWctPmxmdCwgc2l6ZW9mKHgtPmxmdCkpOworCXgtPnByb3BzLm1vZGUgPSBvcmlnLT5wcm9wcy5tb2RlOworCXgtPnByb3BzLnJlcGxheV93aW5kb3cgPSBvcmlnLT5wcm9wcy5yZXBsYXlfd2luZG93OworCXgtPnByb3BzLnJlcWlkID0gb3JpZy0+cHJvcHMucmVxaWQ7CisJeC0+cHJvcHMuZmFtaWx5ID0gb3JpZy0+cHJvcHMuZmFtaWx5OworCXgtPnByb3BzLnNhZGRyID0gb3JpZy0+cHJvcHMuc2FkZHI7CisKKwlpZiAob3JpZy0+YWFsZykgeworCQl4LT5hYWxnID0geGZybV9hbGdvX2Nsb25lKG9yaWctPmFhbGcpOworCQlpZiAoIXgtPmFhbGcpCisJCQlnb3RvIGVycm9yOworCX0KKwl4LT5wcm9wcy5hYWxnbyA9IG9yaWctPnByb3BzLmFhbGdvOworCisJaWYgKG9yaWctPmVhbGcpIHsKKwkJeC0+ZWFsZyA9IHhmcm1fYWxnb19jbG9uZShvcmlnLT5lYWxnKTsKKwkJaWYgKCF4LT5lYWxnKQorCQkJZ290byBlcnJvcjsKKwl9CisJeC0+cHJvcHMuZWFsZ28gPSBvcmlnLT5wcm9wcy5lYWxnbzsKKworCWlmIChvcmlnLT5jYWxnKSB7CisJCXgtPmNhbGcgPSB4ZnJtX2FsZ29fY2xvbmUob3JpZy0+Y2FsZyk7CisJCWlmICgheC0+Y2FsZykKKwkJCWdvdG8gZXJyb3I7CisJfQorCXgtPnByb3BzLmNhbGdvID0gb3JpZy0+cHJvcHMuY2FsZ287CisKKyAgICAgICAgaWYgKG9yaWctPmVuY2FwKSB7CisJCXgtPmVuY2FwID0ga21lbWR1cChvcmlnLT5lbmNhcCwgc2l6ZW9mKCp4LT5lbmNhcCksIEdGUF9LRVJORUwpOworCQlpZiAoIXgtPmVuY2FwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAob3JpZy0+Y29hZGRyKSB7CisJCXgtPmNvYWRkciA9IGttZW1kdXAob3JpZy0+Y29hZGRyLCBzaXplb2YoKngtPmNvYWRkciksCisJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXgtPmNvYWRkcikKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJZXJyID0geGZybV9pbml0X3N0YXRlKHgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwl4LT5wcm9wcy5mbGFncyA9IG9yaWctPnByb3BzLmZsYWdzOworCisJeC0+Y3VybGZ0LmFkZF90aW1lID0gb3JpZy0+Y3VybGZ0LmFkZF90aW1lOworCXgtPmttLnN0YXRlID0gb3JpZy0+a20uc3RhdGU7CisJeC0+a20uc2VxID0gb3JpZy0+a20uc2VxOworCisJcmV0dXJuIHg7CisKKyBlcnJvcjoKKwlpZiAoZXJycCkKKwkJKmVycnAgPSBlcnI7CisJaWYgKHgpIHsKKwkJa2ZyZWUoeC0+YWFsZyk7CisJCWtmcmVlKHgtPmVhbGcpOworCQlrZnJlZSh4LT5jYWxnKTsKKwkJa2ZyZWUoeC0+ZW5jYXApOworCQlrZnJlZSh4LT5jb2FkZHIpOworCX0KKwlrZnJlZSh4KTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9zdGF0ZV9jbG9uZSk7CisKKy8qIHhmcm1fc3RhdGVfbG9jayBpcyBoZWxkICovCitzdHJ1Y3QgeGZybV9zdGF0ZSAqIHhmcm1fbWlncmF0ZV9zdGF0ZV9maW5kKHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0pCit7CisJdW5zaWduZWQgaW50IGg7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OworCisJaWYgKG0tPnJlcWlkKSB7CisJCWggPSB4ZnJtX2RzdF9oYXNoKCZtLT5vbGRfZGFkZHIsICZtLT5vbGRfc2FkZHIsCisJCQkJICBtLT5yZXFpZCwgbS0+b2xkX2ZhbWlseSk7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIGVudHJ5LCB4ZnJtX3N0YXRlX2J5ZHN0K2gsIGJ5ZHN0KSB7CisJCQlpZiAoeC0+cHJvcHMubW9kZSAhPSBtLT5tb2RlIHx8CisJCQkgICAgeC0+aWQucHJvdG8gIT0gbS0+cHJvdG8pCisJCQkJY29udGludWU7CisJCQlpZiAobS0+cmVxaWQgJiYgeC0+cHJvcHMucmVxaWQgIT0gbS0+cmVxaWQpCisJCQkJY29udGludWU7CisJCQlpZiAoeGZybV9hZGRyX2NtcCgmeC0+aWQuZGFkZHIsICZtLT5vbGRfZGFkZHIsCisJCQkJCSAgbS0+b2xkX2ZhbWlseSkgfHwKKwkJCSAgICB4ZnJtX2FkZHJfY21wKCZ4LT5wcm9wcy5zYWRkciwgJm0tPm9sZF9zYWRkciwKKwkJCQkJICBtLT5vbGRfZmFtaWx5KSkKKwkJCQljb250aW51ZTsKKwkJCXhmcm1fc3RhdGVfaG9sZCh4KTsKKwkJCXJldHVybiB4OworCQl9CisJfSBlbHNlIHsKKwkJaCA9IHhmcm1fc3JjX2hhc2goJm0tPm9sZF9kYWRkciwgJm0tPm9sZF9zYWRkciwKKwkJCQkgIG0tPm9sZF9mYW1pbHkpOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeSh4LCBlbnRyeSwgeGZybV9zdGF0ZV9ieXNyYytoLCBieXNyYykgeworCQkJaWYgKHgtPnByb3BzLm1vZGUgIT0gbS0+bW9kZSB8fAorCQkJICAgIHgtPmlkLnByb3RvICE9IG0tPnByb3RvKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHhmcm1fYWRkcl9jbXAoJngtPmlkLmRhZGRyLCAmbS0+b2xkX2RhZGRyLAorCQkJCQkgIG0tPm9sZF9mYW1pbHkpIHx8CisJCQkgICAgeGZybV9hZGRyX2NtcCgmeC0+cHJvcHMuc2FkZHIsICZtLT5vbGRfc2FkZHIsCisJCQkJCSAgbS0+b2xkX2ZhbWlseSkpCisJCQkJY29udGludWU7CisJCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CisJCQlyZXR1cm4geDsKKwkJfQorCX0KKworICAgICAgICByZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woeGZybV9taWdyYXRlX3N0YXRlX2ZpbmQpOworCitzdHJ1Y3QgeGZybV9zdGF0ZSAqIHhmcm1fc3RhdGVfbWlncmF0ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwKKwkJCQkgICAgICAgc3RydWN0IHhmcm1fbWlncmF0ZSAqbSkKK3sKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeGM7CisJaW50IGVycjsKKworCXhjID0geGZybV9zdGF0ZV9jbG9uZSh4LCAmZXJyKTsKKwlpZiAoIXhjKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweSgmeGMtPmlkLmRhZGRyLCAmbS0+bmV3X2RhZGRyLCBzaXplb2YoeGMtPmlkLmRhZGRyKSk7CisJbWVtY3B5KCZ4Yy0+cHJvcHMuc2FkZHIsICZtLT5uZXdfc2FkZHIsIHNpemVvZih4Yy0+cHJvcHMuc2FkZHIpKTsKKworCS8qIGFkZCBzdGF0ZSAqLworCWlmICgheGZybV9hZGRyX2NtcCgmeC0+aWQuZGFkZHIsICZtLT5uZXdfZGFkZHIsIG0tPm5ld19mYW1pbHkpKSB7CisJCS8qIGEgY2FyZSBpcyBuZWVkZWQgd2hlbiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUKKwkJICAgc3RhdGUgaXMgdG8gYmUgdXBkYXRlZCBhcyBpdCBpcyBhIHBhcnQgb2YgdHJpcGxldCAqLworCQl4ZnJtX3N0YXRlX2luc2VydCh4Yyk7CisJfSBlbHNlIHsKKwkJaWYgKChlcnIgPSB4ZnJtX3N0YXRlX2FkZCh4YykpIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHhjOworZXJyb3I6CisJa2ZyZWUoeGMpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX21pZ3JhdGUpOworI2VuZGlmCisKIGludCB4ZnJtX3N0YXRlX3VwZGF0ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKIHsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDE7CkBAIC0xMzQ1LDYgKzE0OTYsMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21fcG9saWN5X2V4cGlyZWQpOwogCitpbnQga21fbWlncmF0ZShzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCB1OCBkaXIsIHU4IHR5cGUsCisJICAgICAgIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sIGludCBudW1fbWlncmF0ZSkKK3sKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlpbnQgcmV0OworCXN0cnVjdCB4ZnJtX21nciAqa207CisKKwlyZWFkX2xvY2soJnhmcm1fa21fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJnhmcm1fa21fbGlzdCwgbGlzdCkgeworCQlpZiAoa20tPm1pZ3JhdGUpIHsKKwkJCXJldCA9IGttLT5taWdyYXRlKHNlbCwgZGlyLCB0eXBlLCBtLCBudW1fbWlncmF0ZSk7CisJCQlpZiAoIXJldCkKKwkJCQllcnIgPSByZXQ7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJnhmcm1fa21fbG9jayk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woa21fbWlncmF0ZSk7CisKIGludCBrbV9yZXBvcnQodTggcHJvdG8sIHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHhmcm1fYWRkcmVzc190ICphZGRyKQogewogCWludCBlcnIgPSAtRUlOVkFMOwpAQCAtMTQ1OCw3ICsxNjI5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woeGZybV9zdGF0ZV91bnJlZ2lzdGVyX2FmaW5mbyk7CiAKLXN0YXRpYyBzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKnhmcm1fc3RhdGVfZ2V0X2FmaW5mbyh1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCitzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKnhmcm1fc3RhdGVfZ2V0X2FmaW5mbyh1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCiB7CiAJc3RydWN0IHhmcm1fc3RhdGVfYWZpbmZvICphZmluZm87CiAJaWYgKHVubGlrZWx5KGZhbWlseSA+PSBOUFJPVE8pKQpAQCAtMTQ3MCwxMSArMTY0MSwxNCBAQAogCXJldHVybiBhZmluZm87CiB9CiAKLXN0YXRpYyB2b2lkIHhmcm1fc3RhdGVfcHV0X2FmaW5mbyhzdHJ1Y3QgeGZybV9zdGF0ZV9hZmluZm8gKmFmaW5mbykKK3ZvaWQgeGZybV9zdGF0ZV9wdXRfYWZpbmZvKHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvKQogewogCXJlYWRfdW5sb2NrKCZ4ZnJtX3N0YXRlX2FmaW5mb19sb2NrKTsKIH0KIAorRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2dldF9hZmluZm8pOworRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX3B1dF9hZmluZm8pOworCiAvKiBUZW1wb3JhcmlseSBsb2NhdGVkIGhlcmUgdW50aWwgbmV0L3hmcm0veGZybV90dW5uZWwuYyBpcyBjcmVhdGVkICovCiB2b2lkIHhmcm1fc3RhdGVfZGVsZXRlX3R1bm5lbChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKIHsKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fdXNlci5jIGIvbmV0L3hmcm0veGZybV91c2VyLmMKaW5kZXggODJmMzZkMy4uMDc5YTVkMyAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV91c2VyLmMKKysrIGIvbmV0L3hmcm0veGZybV91c2VyLmMKQEAgLTE2MzIsNiArMTYzMiwxNzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19YRlJNX01JR1JBVEUKK3N0YXRpYyBpbnQgdmVyaWZ5X3VzZXJfbWlncmF0ZShzdHJ1Y3QgcnRhdHRyICoqeGZybWEpCit7CisJc3RydWN0IHJ0YXR0ciAqcnQgPSB4ZnJtYVtYRlJNQV9NSUdSQVRFLTFdOworCXN0cnVjdCB4ZnJtX3VzZXJfbWlncmF0ZSAqdW07CisKKwlpZiAoIXJ0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgocnQtPnJ0YV9sZW4gLSBzaXplb2YoKnJ0KSkgPCBzaXplb2YoKnVtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3B5X2Zyb21fdXNlcl9taWdyYXRlKHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm1hLAorCQkJCSAgc3RydWN0IHJ0YXR0ciAqKnhmcm1hLCBpbnQgKm51bSkKK3sKKwlzdHJ1Y3QgcnRhdHRyICpydCA9IHhmcm1hW1hGUk1BX01JR1JBVEUtMV07CisJc3RydWN0IHhmcm1fdXNlcl9taWdyYXRlICp1bTsKKwlpbnQgaSwgbnVtX21pZ3JhdGU7CisKKwl1bSA9IFJUQV9EQVRBKHJ0KTsKKwludW1fbWlncmF0ZSA9IChydC0+cnRhX2xlbiAtIHNpemVvZigqcnQpKSAvIHNpemVvZigqdW0pOworCisJaWYgKG51bV9taWdyYXRlIDw9IDAgfHwgbnVtX21pZ3JhdGUgPiBYRlJNX01BWF9ERVBUSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21pZ3JhdGU7IGkrKywgdW0rKywgbWErKykgeworCQltZW1jcHkoJm1hLT5vbGRfZGFkZHIsICZ1bS0+b2xkX2RhZGRyLCBzaXplb2YobWEtPm9sZF9kYWRkcikpOworCQltZW1jcHkoJm1hLT5vbGRfc2FkZHIsICZ1bS0+b2xkX3NhZGRyLCBzaXplb2YobWEtPm9sZF9zYWRkcikpOworCQltZW1jcHkoJm1hLT5uZXdfZGFkZHIsICZ1bS0+bmV3X2RhZGRyLCBzaXplb2YobWEtPm5ld19kYWRkcikpOworCQltZW1jcHkoJm1hLT5uZXdfc2FkZHIsICZ1bS0+bmV3X3NhZGRyLCBzaXplb2YobWEtPm5ld19zYWRkcikpOworCisJCW1hLT5wcm90byA9IHVtLT5wcm90bzsKKwkJbWEtPm1vZGUgPSB1bS0+bW9kZTsKKwkJbWEtPnJlcWlkID0gdW0tPnJlcWlkOworCisJCW1hLT5vbGRfZmFtaWx5ID0gdW0tPm9sZF9mYW1pbHk7CisJCW1hLT5uZXdfZmFtaWx5ID0gdW0tPm5ld19mYW1pbHk7CisJfQorCisJKm51bSA9IGk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9kb19taWdyYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLAorCQkJICAgc3RydWN0IHJ0YXR0ciAqKnhmcm1hKQoreworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQgKnBpID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCB4ZnJtX21pZ3JhdGUgbVtYRlJNX01BWF9ERVBUSF07CisJdTggdHlwZTsKKwlpbnQgZXJyOworCWludCBuID0gMDsKKworCWVyciA9IHZlcmlmeV91c2VyX21pZ3JhdGUoKHN0cnVjdCBydGF0dHIgKiopeGZybWEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBjb3B5X2Zyb21fdXNlcl9wb2xpY3lfdHlwZSgmdHlwZSwgKHN0cnVjdCBydGF0dHIgKiopeGZybWEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBjb3B5X2Zyb21fdXNlcl9taWdyYXRlKChzdHJ1Y3QgeGZybV9taWdyYXRlICopbSwKKwkJCQkgICAgIChzdHJ1Y3QgcnRhdHRyICoqKXhmcm1hLCAmbik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmICghbikKKwkJcmV0dXJuIDA7CisKKwl4ZnJtX21pZ3JhdGUoJnBpLT5zZWwsIHBpLT5kaXIsIHR5cGUsIG0sIG4pOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCB4ZnJtX2RvX21pZ3JhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCQkgICBzdHJ1Y3QgcnRhdHRyICoqeGZybWEpCit7CisJcmV0dXJuIC1FTk9QUk9UT09QVDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1hGUk1fTUlHUkFURQorc3RhdGljIGludCBjb3B5X3RvX3VzZXJfbWlncmF0ZShzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB4ZnJtX3VzZXJfbWlncmF0ZSB1bTsKKworCW1lbXNldCgmdW0sIDAsIHNpemVvZih1bSkpOworCXVtLnByb3RvID0gbS0+cHJvdG87CisJdW0ubW9kZSA9IG0tPm1vZGU7CisJdW0ucmVxaWQgPSBtLT5yZXFpZDsKKwl1bS5vbGRfZmFtaWx5ID0gbS0+b2xkX2ZhbWlseTsKKwltZW1jcHkoJnVtLm9sZF9kYWRkciwgJm0tPm9sZF9kYWRkciwgc2l6ZW9mKHVtLm9sZF9kYWRkcikpOworCW1lbWNweSgmdW0ub2xkX3NhZGRyLCAmbS0+b2xkX3NhZGRyLCBzaXplb2YodW0ub2xkX3NhZGRyKSk7CisJdW0ubmV3X2ZhbWlseSA9IG0tPm5ld19mYW1pbHk7CisJbWVtY3B5KCZ1bS5uZXdfZGFkZHIsICZtLT5uZXdfZGFkZHIsIHNpemVvZih1bS5uZXdfZGFkZHIpKTsKKwltZW1jcHkoJnVtLm5ld19zYWRkciwgJm0tPm5ld19zYWRkciwgc2l6ZW9mKHVtLm5ld19zYWRkcikpOworCisJUlRBX1BVVChza2IsIFhGUk1BX01JR1JBVEUsIHNpemVvZih1bSksICZ1bSk7CisJcmV0dXJuIDA7CisKK3J0YXR0cl9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBidWlsZF9taWdyYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4ZnJtX21pZ3JhdGUgKm0sCisJCQkgaW50IG51bV9taWdyYXRlLCBzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLAorCQkJIHU4IGRpciwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgeGZybV9taWdyYXRlICptcDsKKwlzdHJ1Y3QgeGZybV91c2VycG9saWN5X2lkICpwb2xfaWQ7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwlpbnQgaTsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIFhGUk1fTVNHX01JR1JBVEUsIHNpemVvZigqcG9sX2lkKSk7CisJcG9sX2lkID0gTkxNU0dfREFUQShubGgpOworCW5saC0+bmxtc2dfZmxhZ3MgPSAwOworCisJLyogY29weSBkYXRhIGZyb20gc2VsZWN0b3IsIGRpciwgYW5kIHR5cGUgdG8gdGhlIHBvbF9pZCAqLworCW1lbXNldChwb2xfaWQsIDAsIHNpemVvZigqcG9sX2lkKSk7CisJbWVtY3B5KCZwb2xfaWQtPnNlbCwgc2VsLCBzaXplb2YocG9sX2lkLT5zZWwpKTsKKwlwb2xfaWQtPmRpciA9IGRpcjsKKworCWlmIChjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUodHlwZSwgc2tiKSA8IDApCisJCWdvdG8gbmxtc2dfZmFpbHVyZTsKKworCWZvciAoaSA9IDAsIG1wID0gbSA7IGkgPCBudW1fbWlncmF0ZTsgaSsrLCBtcCsrKSB7CisJCWlmIChjb3B5X3RvX3VzZXJfbWlncmF0ZShtcCwgc2tiKSA8IDApCisJCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CisJfQorCisJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCXJldHVybiBza2ItPmxlbjsKK25sbXNnX2ZhaWx1cmU6CisJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9zZW5kX21pZ3JhdGUoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLAorCQkJICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX21pZ3JhdGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzaXplX3QgbGVuOworCisJbGVuID0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VyX21pZ3JhdGUpICogbnVtX21pZ3JhdGUpOworCWxlbiArPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pZCkpOworI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKKwlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUpKTsKKyNlbmRpZgorCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBidWlsZCBtaWdyYXRlICovCisJaWYgKGJ1aWxkX21pZ3JhdGUoc2tiLCBtLCBudW1fbWlncmF0ZSwgc2VsLCBkaXIsIHR5cGUpIDwgMCkKKwkJQlVHKCk7CisKKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gWEZSTU5MR1JQX01JR1JBVEU7CisJcmV0dXJuIG5ldGxpbmtfYnJvYWRjYXN0KHhmcm1fbmwsIHNrYiwgMCwgWEZSTU5MR1JQX01JR1JBVEUsCisJCQkJIEdGUF9BVE9NSUMpOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgeGZybV9zZW5kX21pZ3JhdGUoc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgdTggZGlyLCB1OCB0eXBlLAorCQkJICAgICBzdHJ1Y3QgeGZybV9taWdyYXRlICptLCBpbnQgbnVtX21pZ3JhdGUpCit7CisJcmV0dXJuIC1FTk9QUk9UT09QVDsKK30KKyNlbmRpZgogCiAjZGVmaW5lIFhNU0dTSVpFKHR5cGUpIE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHR5cGUpKQogCkBAIC0xNjUzLDYgKzE4MjMsNyBAQAogCVtYRlJNX01TR19ORVdBRSAgICAgICAtIFhGUk1fTVNHX0JBU0VdID0gWE1TR1NJWkUoeGZybV9hZXZlbnRfaWQpLAogCVtYRlJNX01TR19HRVRBRSAgICAgICAtIFhGUk1fTVNHX0JBU0VdID0gWE1TR1NJWkUoeGZybV9hZXZlbnRfaWQpLAogCVtYRlJNX01TR19SRVBPUlQgICAgICAtIFhGUk1fTVNHX0JBU0VdID0gWE1TR1NJWkUoeGZybV91c2VyX3JlcG9ydCksCisJW1hGUk1fTVNHX01JR1JBVEUgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSBYTVNHU0laRSh4ZnJtX3VzZXJwb2xpY3lfaWQpLAogfTsKIAogI3VuZGVmIFhNU0dTSVpFCkBAIC0xNjc5LDYgKzE4NTAsNyBAQAogCVtYRlJNX01TR19GTFVTSFBPTElDWSAtIFhGUk1fTVNHX0JBU0VdID0geyAuZG9pdCA9IHhmcm1fZmx1c2hfcG9saWN5ICB9LAogCVtYRlJNX01TR19ORVdBRSAgICAgICAtIFhGUk1fTVNHX0JBU0VdID0geyAuZG9pdCA9IHhmcm1fbmV3X2FlICB9LAogCVtYRlJNX01TR19HRVRBRSAgICAgICAtIFhGUk1fTVNHX0JBU0VdID0geyAuZG9pdCA9IHhmcm1fZ2V0X2FlICB9LAorCVtYRlJNX01TR19NSUdSQVRFICAgICAtIFhGUk1fTVNHX0JBU0VdID0geyAuZG9pdCA9IHhmcm1fZG9fbWlncmF0ZSAgICB9LAogfTsKIAogc3RhdGljIGludCB4ZnJtX3VzZXJfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50ICplcnJwKQpAQCAtMjI4NSw2ICsyNDU3LDcgQEAKIAkuY29tcGlsZV9wb2xpY3kJPSB4ZnJtX2NvbXBpbGVfcG9saWN5LAogCS5ub3RpZnlfcG9saWN5CT0geGZybV9zZW5kX3BvbGljeV9ub3RpZnksCiAJLnJlcG9ydAkJPSB4ZnJtX3NlbmRfcmVwb3J0LAorCS5taWdyYXRlCT0geGZybV9zZW5kX21pZ3JhdGUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB4ZnJtX3VzZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvS2NvbmZpZyBiL3NvdW5kL0tjb25maWcKaW5kZXggOWQ3NzMwMC4uOTc1MzJiYiAxMDA2NDQKLS0tIGEvc291bmQvS2NvbmZpZworKysgYi9zb3VuZC9LY29uZmlnCkBAIC03Niw2ICs3Niw4IEBACiAKIHNvdXJjZSAic291bmQvcGFyaXNjL0tjb25maWciCiAKK3NvdXJjZSAic291bmQvc29jL0tjb25maWciCisKIGVuZG1lbnUKIAogbWVudSAiT3BlbiBTb3VuZCBTeXN0ZW0iCmRpZmYgLS1naXQgYS9zb3VuZC9NYWtlZmlsZSBiL3NvdW5kL01ha2VmaWxlCmluZGV4IDlhZWU1NGMuLmI3YzdmYjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL01ha2VmaWxlCisrKyBiL3NvdW5kL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogb2JqLSQoQ09ORklHX1NPVU5EX1BSSU1FKSArPSBzb3VuZF9maXJtd2FyZS5vCiBvYmotJChDT05GSUdfU09VTkRfUFJJTUUpICs9IG9zcy8KIG9iai0kKENPTkZJR19ETUFTT1VORCkgKz0gb3NzLwotb2JqLSQoQ09ORklHX1NORCkgKz0gY29yZS8gaTJjLyBkcml2ZXJzLyBpc2EvIHBjaS8gcHBjLyBhcm0vIHN5bnRoLyB1c2IvIHNwYXJjLyBwYXJpc2MvIHBjbWNpYS8gbWlwcy8KK29iai0kKENPTkZJR19TTkQpICs9IGNvcmUvIGkyYy8gZHJpdmVycy8gaXNhLyBwY2kvIHBwYy8gYXJtLyBzeW50aC8gdXNiLyBzcGFyYy8gcGFyaXNjLyBwY21jaWEvIG1pcHMvIHNvYy8KIG9iai0kKENPTkZJR19TTkRfQU9BKSArPSBhb2EvCiAKICMgVGhpcyBvbmUgbXVzdCBiZSBjb21waWxhYmxlIGV2ZW4gaWYgc291bmQgaXMgY29uZmlndXJlZCBvdXQKZGlmZiAtLWdpdCBhL3NvdW5kL2FjOTdfYnVzLmMgYi9zb3VuZC9hYzk3X2J1cy5jCmluZGV4IDY2ZGUyYzIuLjdmYTM3ZTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FjOTdfYnVzLmMKKysrIGIvc291bmQvYWM5N19idXMuYwpAQCAtMjYsNiArMjYsNyBAQAogCXJldHVybiAxOwogfQogCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGFjOTdfYnVzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJaW50IHJldCA9IDA7CkBAIC00NSwxMiArNDYsMTUgQEAKIAogCXJldHVybiByZXQ7CiB9CisjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0cnVjdCBidXNfdHlwZSBhYzk3X2J1c190eXBlID0gewogCS5uYW1lCQk9ICJhYzk3IiwKIAkubWF0Y2gJCT0gYWM5N19idXNfbWF0Y2gsCisjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJPSBhYzk3X2J1c19zdXNwZW5kLAogCS5yZXN1bWUJCT0gYWM5N19idXNfcmVzdW1lLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLwogfTsKIAogc3RhdGljIGludCBfX2luaXQgYWM5N19idXNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2FvYS5oIGIvc291bmQvYW9hL2FvYS5oCmluZGV4IDM3OGVmMWUuLjU0MWI5MDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9hb2EuaAorKysgYi9zb3VuZC9hb2EvYW9hLmgKQEAgLTk5LDcgKzk5LDcgQEAKICAqIHRoYXQgYXJlIG5vdCBhc3NpZ25lZCB5ZXQgYXJlIHBhc3NlZCB0byB0aGUgZmFicmljCiAgKiBhZ2FpbiBmb3IgcmVjb25zaWRlcmF0aW9uLiAqLwogZXh0ZXJuIGludAotYW9hX2ZhYnJpY19yZWdpc3RlcihzdHJ1Y3QgYW9hX2ZhYnJpYyAqZmFicmljKTsKK2FvYV9mYWJyaWNfcmVnaXN0ZXIoc3RydWN0IGFvYV9mYWJyaWMgKmZhYnJpYywgc3RydWN0IGRldmljZSAqZGV2KTsKIAogLyogaXQgaXMgdml0YWwgdG8gY2FsbCB0aGlzIHdoZW4gdGhlIGZhYnJpYyBleGl0cyEKICAqIFdoZW4gY2FsbGluZywgdGhlIHJlbW92ZV9jb2RlYyB3aWxsIGJlIGNhbGxlZApkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLW9ueXguYyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy1vbnl4LmMKaW5kZXggMGI3NjUwNy4uYjAwZmM0OCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLW9ueXguYworKysgYi9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtb255eC5jCkBAIC04MjUsNyArODI1LDE2IEBACiAJaW50IGVyciA9IC1FTlhJTzsKIAogCW11dGV4X2xvY2soJm9ueXgtPm11dGV4KTsKLQkvKiB0YWtlIGNvZGVjIG91dCBvZiBzdXNwZW5kICovCisKKwkvKiByZXNldCBjb2RlYyAqLworCW9ueXgtPmNvZGVjLmdwaW8tPm1ldGhvZHMtPnNldF9od19yZXNldChvbnl4LT5jb2RlYy5ncGlvLCAwKTsKKwltc2xlZXAoMSk7CisJb255eC0+Y29kZWMuZ3Bpby0+bWV0aG9kcy0+c2V0X2h3X3Jlc2V0KG9ueXgtPmNvZGVjLmdwaW8sIDEpOworCW1zbGVlcCgxKTsKKwlvbnl4LT5jb2RlYy5ncGlvLT5tZXRob2RzLT5zZXRfaHdfcmVzZXQob255eC0+Y29kZWMuZ3BpbywgMCk7CisJbXNsZWVwKDEpOworCisJLyogdGFrZSBjb2RlYyBvdXQgb2Ygc3VzcGVuZCAoaWYgaXQgc3RpbGwgaXMgYWZ0ZXIgcmVzZXQpICovCiAJaWYgKG9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19DT05UUk9MLCAmdikpCiAJCWdvdG8gb3V0X3VubG9jazsKIAlvbnl4X3dyaXRlX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0NPTlRST0wsIHYgJiB+KE9OWVhfQURQU1YgfCBPTllYX0RBUFNWKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWFsc2EuYyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtYWxzYS5jCmluZGV4IGI0MmZkZWEuLjE3ZmU2ODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtYWxzYS5jCisrKyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtYWxzYS5jCkBAIC0xNCw3ICsxNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW9hX2NhcmQgKmFvYV9jYXJkOwogCi1pbnQgYW9hX2Fsc2FfaW5pdChjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2QpCitpbnQgYW9hX2Fsc2FfaW5pdChjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmFsc2FfY2FyZDsKIAlpbnQgZXJyOwpAQCAtMjgsNiArMjgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlhb2FfY2FyZCA9IGFsc2FfY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWFvYV9jYXJkLT5hbHNhX2NhcmQgPSBhbHNhX2NhcmQ7CisJYWxzYV9jYXJkLT5kZXYgPSBkZXY7CiAJc3RybGNweShhbHNhX2NhcmQtPmRyaXZlciwgIkFwcGxlT25iZEF1ZGlvIiwgc2l6ZW9mKGFsc2FfY2FyZC0+ZHJpdmVyKSk7CiAJc3RybGNweShhbHNhX2NhcmQtPnNob3J0bmFtZSwgbmFtZSwgc2l6ZW9mKGFsc2FfY2FyZC0+c2hvcnRuYW1lKSk7CiAJc3RybGNweShhbHNhX2NhcmQtPmxvbmduYW1lLCBuYW1lLCBzaXplb2YoYWxzYV9jYXJkLT5sb25nbmFtZSkpOwpAQCAtNTksNyArNjAsNyBAQAogfQogCiBpbnQgYW9hX3NuZF9kZXZpY2VfbmV3KHNuZF9kZXZpY2VfdHlwZV90IHR5cGUsCi0gICAgICAgIHZvaWQgKiBkZXZpY2VfZGF0YSwgc3RydWN0IHNuZF9kZXZpY2Vfb3BzICogb3BzKQorCQkgICAgICAgdm9pZCAqIGRldmljZV9kYXRhLCBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgKiBvcHMpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gYW9hX2dldF9jYXJkKCk7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtYWxzYS5oIGIvc291bmQvYW9hL2NvcmUvc25kLWFvYS1hbHNhLmgKaW5kZXggNjYwZDJmMS4uOTY2OWU0NCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvcmUvc25kLWFvYS1hbHNhLmgKKysrIGIvc291bmQvYW9hL2NvcmUvc25kLWFvYS1hbHNhLmgKQEAgLTEwLDcgKzEwLDcgQEAKICNkZWZpbmUgX19TTkRfQU9BX0FMU0FfSAogI2luY2x1ZGUgIi4uL2FvYS5oIgogCi1leHRlcm4gaW50IGFvYV9hbHNhX2luaXQoY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kKTsKK2V4dGVybiBpbnQgYW9hX2Fsc2FfaW5pdChjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBhb2FfYWxzYV9jbGVhbnVwKHZvaWQpOwogCiAjZW5kaWYgLyogX19TTkRfQU9BX0FMU0FfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvcmUvc25kLWFvYS1jb3JlLmMgYi9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWNvcmUuYwppbmRleCBlY2QyZDgyLi4xOWZkYWU0IDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWNvcmUuYworKysgYi9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWNvcmUuYwpAQCAtODIsNyArODIsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYW9hX2NvZGVjX3VucmVnaXN0ZXIpOwogCi1pbnQgYW9hX2ZhYnJpY19yZWdpc3RlcihzdHJ1Y3QgYW9hX2ZhYnJpYyAqbmV3X2ZhYnJpYykKK2ludCBhb2FfZmFicmljX3JlZ2lzdGVyKHN0cnVjdCBhb2FfZmFicmljICpuZXdfZmFicmljLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGFvYV9jb2RlYyAqYzsKIAlpbnQgZXJyOwpAQCAtOTgsNyArOTgsNyBAQAogCWlmICghbmV3X2ZhYnJpYykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnIgPSBhb2FfYWxzYV9pbml0KG5ld19mYWJyaWMtPm5hbWUsIG5ld19mYWJyaWMtPm93bmVyKTsKKwllcnIgPSBhb2FfYWxzYV9pbml0KG5ld19mYWJyaWMtPm5hbWUsIG5ld19mYWJyaWMtPm93bmVyLCBkZXYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9mYWJyaWNzL3NuZC1hb2EtZmFicmljLWxheW91dC5jIGIvc291bmQvYW9hL2ZhYnJpY3Mvc25kLWFvYS1mYWJyaWMtbGF5b3V0LmMKaW5kZXggMTcyZWI5NS4uMWI5NGJhNiAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2ZhYnJpY3Mvc25kLWFvYS1mYWJyaWMtbGF5b3V0LmMKKysrIGIvc291bmQvYW9hL2ZhYnJpY3Mvc25kLWFvYS1mYWJyaWMtbGF5b3V0LmMKQEAgLTEwMTQsNyArMTAxNCw3IEBACiAKIAlsZGV2LT5ncGlvLm1ldGhvZHMtPmluaXQoJmxkZXYtPmdwaW8pOwogCi0JZXJyID0gYW9hX2ZhYnJpY19yZWdpc3RlcigmbGF5b3V0X2ZhYnJpYyk7CisJZXJyID0gYW9hX2ZhYnJpY19yZWdpc3RlcigmbGF5b3V0X2ZhYnJpYywgJnNkZXYtPm9mZGV2LmRldik7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVBTFJFQURZKSB7CiAJCXByaW50ayhLRVJOX0lORk8gInNuZC1hb2EtZmFicmljLWxheW91dDogY2FuJ3QgdXNlLCIKIAkJCQkgIiBhbm90aGVyIGZhYnJpYyBpcyBhY3RpdmUhXG4iKTsKQEAgLTEwMzQsOSArMTAzNCw5IEBACiAJbGlzdF9kZWwoJmxkZXYtPmxpc3QpOwogCWxheW91dHNfbGlzdF9pdGVtcy0tOwogIG91dG5vZGV2OgotIAlpZiAoc291bmQpIG9mX25vZGVfcHV0KHNvdW5kKTsKKyAJb2Zfbm9kZV9wdXQoc291bmQpOwogIAlsYXlvdXRfZGV2aWNlID0gTlVMTDsKLSAJaWYgKGxkZXYpIGtmcmVlKGxkZXYpOworIAlrZnJlZShsZGV2KTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIApAQCAtMTA3Nyw4ICsxMDc3LDYgQEAKIHsKIAlzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiA9IHNkZXYtPm9mZGV2LmRldi5kcml2ZXJfZGF0YTsKIAotCXByaW50aygiYW9hX2ZhYnJpY19sYXlvdXRfc3VzcGVuZCgpXG4iKTsKLQogCWlmIChsZGV2LT5ncGlvLm1ldGhvZHMgJiYgbGRldi0+Z3Bpby5tZXRob2RzLT5hbGxfYW1wc19vZmYpCiAJCWxkZXYtPmdwaW8ubWV0aG9kcy0+YWxsX2FtcHNfb2ZmKCZsZGV2LT5ncGlvKTsKIApAQCAtMTA4OSw4ICsxMDg3LDYgQEAKIHsKIAlzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiA9IHNkZXYtPm9mZGV2LmRldi5kcml2ZXJfZGF0YTsKIAotCXByaW50aygiYW9hX2ZhYnJpY19sYXlvdXRfcmVzdW1lKClcbiIpOwotCiAJaWYgKGxkZXYtPmdwaW8ubWV0aG9kcyAmJiBsZGV2LT5ncGlvLm1ldGhvZHMtPmFsbF9hbXBzX29mZikKIAkJbGRldi0+Z3Bpby5tZXRob2RzLT5hbGxfYW1wc19yZXN0b3JlKCZsZGV2LT5ncGlvKTsKIApAQCAtMTEwNyw2ICsxMTAzLDkgQEAKIAkuc3VzcGVuZCA9IGFvYV9mYWJyaWNfbGF5b3V0X3N1c3BlbmQsCiAJLnJlc3VtZSA9IGFvYV9mYWJyaWNfbGF5b3V0X3Jlc3VtZSwKICNlbmRpZgorCS5kcml2ZXIgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0KIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFvYV9mYWJyaWNfbGF5b3V0X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLWNvcmUuYyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLWNvcmUuYwppbmRleCBlNTkzYTEzLi5lMzZmNmFhIDEwMDY0NAotLS0gYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1jb3JlLmMKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtY29yZS5jCkBAIC00MSw4ICs0MSw4IEBACiAJCQkJICAgICAgIHN0cnVjdCBkYmRtYV9jb21tYW5kX21lbSAqciwKIAkJCQkgICAgICAgaW50IG51bWNtZHMpCiB7Ci0JLyogb25lIG1vcmUgZm9yIHJvdW5kaW5nICovCi0Jci0+c2l6ZSA9IChudW1jbWRzKzEpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpOworCS8qIG9uZSBtb3JlIGZvciByb3VuZGluZywgb25lIGZvciBicmFuY2ggYmFjaywgb25lIGZvciBzdG9wIGNvbW1hbmQgKi8KKwlyLT5zaXplID0gKG51bWNtZHMgKyAzKSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKTsKIAkvKiBXZSB1c2UgdGhlIFBDSSBBUElzIGZvciBub3cgdW50aWwgdGhlIGdlbmVyaWMgb25lIGdldHMgZml4ZWQKIAkgKiBlbm91Z2ggb3IgdW50aWwgd2UgZ2V0IHNvbWUgbWFjaW8tc3BlY2lmaWMgdmVyc2lvbnMKIAkgKi8KQEAgLTM3NywxMSArMzc3LDggQEAKIAkJaWYgKGkyc2Rldi0+c291bmQucGNtKSB7CiAJCQkvKiBTdXNwZW5kIFBDTSBzdHJlYW1zICovCiAJCQlzbmRfcGNtX3N1c3BlbmRfYWxsKGkyc2Rldi0+c291bmQucGNtKTsKLQkJCS8qIFByb2JhYmx5IHVzZWxlc3MgYXMgd2UgaGFuZGxlCi0JCQkgKiBwb3dlciB0cmFuc2l0aW9ucyBvdXJzZWx2ZXMgKi8KLQkJCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoaTJzZGV2LT5zb3VuZC5wY20tPmNhcmQsCi0JCQkJCSAgICAgICBTTkRSVl9DVExfUE9XRVJfRDNob3QpOwogCQl9CisKIAkJLyogTm90aWZ5IGNvZGVjcyAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmkyc2Rldi0+c291bmQuY29kZWNfbGlzdCwgbGlzdCkgewogCQkJZXJyID0gMDsKQEAgLTM5MCw3ICszODcsMTEgQEAKIAkJCWlmIChlcnIpCiAJCQkJcmV0ID0gZXJyOwogCQl9CisKKwkJLyogd2FpdCB1bnRpbCBzdHJlYW1zIGFyZSBzdG9wcGVkICovCisJCWkyc2J1c193YWl0X2Zvcl9zdG9wX2JvdGgoaTJzZGV2KTsKIAl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MDIsNiArNDAzLDkgQEAKIAlpbnQgZXJyLCByZXQgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpMnNkZXYsICZjb250cm9sLT5saXN0LCBpdGVtKSB7CisJCS8qIHJlc2V0IGkycyBidXMgZm9ybWF0IGV0Yy4gKi8KKwkJaTJzYnVzX3BjbV9wcmVwYXJlX2JvdGgoaTJzZGV2KTsKKwogCQkvKiBOb3RpZnkgY29kZWNzIHNvIHRoZXkgY2FuIHJlLWluaXRpYWxpemUgKi8KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaWksICZpMnNkZXYtPnNvdW5kLmNvZGVjX2xpc3QsIGxpc3QpIHsKIAkJCWVyciA9IDA7CkBAIC00MTAsMTIgKzQxNCw2IEBACiAJCQlpZiAoZXJyKQogCQkJCXJldCA9IGVycjsKIAkJfQotCQkvKiBOb3RpZnkgQWxzYSAqLwotCQlpZiAoaTJzZGV2LT5zb3VuZC5wY20pIHsKLQkJCS8qIFNhbWUgY29tbWVudCBhcyBhYm92ZSwgcHJvYmFibHkgdXNlbGVzcyAqLwotCQkJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShpMnNkZXYtPnNvdW5kLnBjbS0+Y2FyZCwKLQkJCQkJICAgICAgIFNORFJWX0NUTF9QT1dFUl9EMCk7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtcGNtLmMgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1wY20uYwppbmRleCA1ZWZmMzBiLi5jNmI0MmY5IDEwMDY0NAotLS0gYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1wY20uYworKysgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1wY20uYwpAQCAtMTI1LDcgKzEyNSw4IEBACiAJfQogCS8qIGJ1cyBkZXBlbmRlbnQgc3R1ZmYgKi8KIAlody0+aW5mbyA9IFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUU7CisJCSAgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkJICAgU05EUlZfUENNX0lORk9fSk9JTlRfRFVQTEVYOwogCiAJQ0hFQ0tfUkFURSg1NTEyKTsKIAlDSEVDS19SQVRFKDgwMDApOwpAQCAtMjQ1LDE4ICsyNDYsNzggQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdm9pZCBpMnNidXNfd2FpdF9mb3Jfc3RvcChzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LAorCQkJCSBzdHJ1Y3QgcGNtX2luZm8gKnBpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKKwlsb25nIHRpbWVvdXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTJzZGV2LT5sb3dfbG9jaywgZmxhZ3MpOworCWlmIChwaS0+ZGJkbWFfcmluZy5zdG9wcGluZykgeworCQlpbml0X2NvbXBsZXRpb24oJmRvbmUpOworCQlwaS0+c3RvcF9jb21wbGV0aW9uID0gJmRvbmU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyc2Rldi0+bG93X2xvY2ssIGZsYWdzKTsKKwkJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZG9uZSwgSFopOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaTJzZGV2LT5sb3dfbG9jaywgZmxhZ3MpOworCQlwaS0+c3RvcF9jb21wbGV0aW9uID0gTlVMTDsKKwkJaWYgKHRpbWVvdXQgPT0gMCkgeworCQkJLyogdGltZW91dCBleHBpcmVkLCBzdG9wIGRiZG1hIGZvcmNlZnVsbHkgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiaTJzYnVzX3dhaXRfZm9yX3N0b3A6IHRpbWVkIG91dFxuIik7CisJCQkvKiBtYWtlIHN1cmUgUlVOLCBQQVVTRSBhbmQgUzAgYml0cyBhcmUgY2xlYXJlZCAqLworCQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgKFJVTiB8IFBBVVNFIHwgMSkgPDwgMTYpOworCQkJcGktPmRiZG1hX3Jpbmcuc3RvcHBpbmcgPSAwOworCQkJdGltZW91dCA9IDEwOworCQkJd2hpbGUgKGluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKSAmIEFDVElWRSkgeworCQkJCWlmICgtLXRpbWVvdXQgPD0gMCkKKwkJCQkJYnJlYWs7CisJCQkJdWRlbGF5KDEpOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyc2Rldi0+bG93X2xvY2ssIGZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJR19QTQordm9pZCBpMnNidXNfd2FpdF9mb3Jfc3RvcF9ib3RoKHN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYpCit7CisJc3RydWN0IHBjbV9pbmZvICpwaTsKKworCWdldF9wY21faW5mbyhpMnNkZXYsIDAsICZwaSwgTlVMTCk7CisJaTJzYnVzX3dhaXRfZm9yX3N0b3AoaTJzZGV2LCBwaSk7CisJZ2V0X3BjbV9pbmZvKGkyc2RldiwgMSwgJnBpLCBOVUxMKTsKKwlpMnNidXNfd2FpdF9mb3Jfc3RvcChpMnNkZXYsIHBpKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IGkyc2J1c19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7CiAJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7CiB9CiAKLXN0YXRpYyBpbnQgaTJzYnVzX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCitzdGF0aWMgaW5saW5lIGludCBpMnNidXNfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGluKQogeworCXN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHBjbV9pbmZvICpwaTsKKworCWdldF9wY21faW5mbyhpMnNkZXYsIGluLCAmcGksIE5VTEwpOworCWlmIChwaS0+ZGJkbWFfcmluZy5zdG9wcGluZykKKwkJaTJzYnVzX3dhaXRfZm9yX3N0b3AoaTJzZGV2LCBwaSk7CiAJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGkyc2J1c19wbGF5YmFja19od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiBpMnNidXNfaHdfZnJlZShzdWJzdHJlYW0sIDApOworfQorCitzdGF0aWMgaW50IGkyc2J1c19yZWNvcmRfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gaTJzYnVzX2h3X2ZyZWUoc3Vic3RyZWFtLCAxKTsKK30KKwogc3RhdGljIGludCBpMnNidXNfcGNtX3ByZXBhcmUoc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldiwgaW50IGluKQogewogCS8qIHdoZWUuIEhhcmQgd29yayBub3cuIFRoZSB1c2VyIGhhcyBzZWxlY3RlZCBhIGJpdHJhdGUKQEAgLTI2NCw3ICszMjUsNyBAQAogCSAqIEkyUyBjb250cm9sbGVyIGFwcHJvcHJpYXRlbHkuICovCiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKIAlzdHJ1Y3QgZGJkbWFfY21kICpjb21tYW5kOwotCWludCBpLCBwZXJpb2RzaXplOworCWludCBpLCBwZXJpb2RzaXplLCBucGVyaW9kczsKIAlkbWFfYWRkcl90IG9mZnNldDsKIAlzdHJ1Y3QgYnVzX2luZm8gYmk7CiAJc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpOwpAQCAtMjc0LDYgKzMzNSw3IEBACiAJc3RydWN0IHBjbV9pbmZvICpwaSwgKm90aGVyOwogCWludCBjbnQ7CiAJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IGNtZCwgc3RvcGFkZHI7CiAKIAltdXRleF9sb2NrKCZpMnNkZXYtPmxvY2spOwogCkBAIC0yODMsNiArMzQ1LDEzIEBACiAJCXJlc3VsdCA9IC1FQlVTWTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KKwlpZiAocGktPmRiZG1hX3Jpbmcuc3RvcHBpbmcpCisJCWkyc2J1c193YWl0X2Zvcl9zdG9wKGkyc2RldiwgcGkpOworCisJaWYgKCFwaS0+c3Vic3RyZWFtIHx8ICFwaS0+c3Vic3RyZWFtLT5ydW50aW1lKSB7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CiAKIAlydW50aW1lID0gcGktPnN1YnN0cmVhbS0+cnVudGltZTsKIAlwaS0+YWN0aXZlID0gMTsKQEAgLTI5NywyNCArMzY2LDQzIEBACiAJaTJzZGV2LT5yYXRlID0gcnVudGltZS0+cmF0ZTsKIAogCXBlcmlvZHNpemUgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMocGktPnN1YnN0cmVhbSk7CisJbnBlcmlvZHMgPSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2RzOwogCXBpLT5jdXJyZW50X3BlcmlvZCA9IDA7CiAKIAkvKiBnZW5lcmF0ZSBkYmRtYSBjb21tYW5kIHJpbmcgZmlyc3QgKi8KIAljb21tYW5kID0gcGktPmRiZG1hX3JpbmcuY21kczsKKwltZW1zZXQoY29tbWFuZCwgMCwgKG5wZXJpb2RzICsgMikgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkpOworCisJLyogY29tbWFuZHMgdG8gRE1BIHRvL2Zyb20gdGhlIHJpbmcgKi8KKwkvKgorCSAqIEZvciBpbnB1dCwgd2UgbmVlZCB0byBkbyBhIGdyYWNlZnVsIHN0b3A7IGlmIHdlIGFib3J0CisJICogdGhlIERNQSwgd2UgZW5kIHVwIHdpdGggbGVmdG92ZXIgYnl0ZXMgdGhhdCBjb3JydXB0CisJICogdGhlIG5leHQgcmVjb3JkaW5nLiAgVG8gZG8gdGhpcyB3ZSBzZXQgdGhlIFMwIHN0YXR1cworCSAqIGJpdCBhbmQgd2FpdCBmb3IgdGhlIERNQSBjb250cm9sbGVyIHRvIHN0b3AuICBFYWNoCisJICogY29tbWFuZCBoYXMgYSBicmFuY2ggY29uZGl0aW9uIHRvCisJICogbWFrZSBpdCBicmFuY2ggdG8gYSBzdG9wIGNvbW1hbmQgaWYgUzAgaXMgc2V0LgorCSAqIE9uIGlucHV0IHdlIGFsc28gbmVlZCB0byB3YWl0IGZvciB0aGUgUzcgYml0IHRvIGJlCisJICogc2V0IGJlZm9yZSB0dXJuaW5nIG9mZiB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICogSW4gZmFjdCB3ZSBkbyB0aGUgZ3JhY2VmdWwgc3RvcCBmb3Igb3V0cHV0IGFzIHdlbGwuCisJICovCiAJb2Zmc2V0ID0gcnVudGltZS0+ZG1hX2FkZHI7Ci0JZm9yIChpID0gMDsgaSA8IHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZHM7Ci0JICAgICBpKyssIGNvbW1hbmQrKywgb2Zmc2V0ICs9IHBlcmlvZHNpemUpIHsKLQkJbWVtc2V0KGNvbW1hbmQsIDAsIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSk7Ci0JCWNvbW1hbmQtPmNvbW1hbmQgPQotCQkgICAgY3B1X3RvX2xlMTYoKGluID8gSU5QVVRfTU9SRSA6IE9VVFBVVF9NT1JFKSB8IElOVFJfQUxXQVlTKTsKKwljbWQgPSAoaW4/IElOUFVUX01PUkU6IE9VVFBVVF9NT1JFKSB8IEJSX0lGU0VUIHwgSU5UUl9BTFdBWVM7CisJc3RvcGFkZHIgPSBwaS0+ZGJkbWFfcmluZy5idXNfY21kX3N0YXJ0ICsKKwkJKG5wZXJpb2RzICsgMSkgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCk7CisJZm9yIChpID0gMDsgaSA8IG5wZXJpb2RzOyBpKyssIGNvbW1hbmQrKywgb2Zmc2V0ICs9IHBlcmlvZHNpemUpIHsKKwkJY29tbWFuZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZCk7CisJCWNvbW1hbmQtPmNtZF9kZXAgPSBjcHVfdG9fbGUzMihzdG9wYWRkcik7CiAJCWNvbW1hbmQtPnBoeV9hZGRyID0gY3B1X3RvX2xlMzIob2Zmc2V0KTsKIAkJY29tbWFuZC0+cmVxX2NvdW50ID0gY3B1X3RvX2xlMTYocGVyaW9kc2l6ZSk7Ci0JCWNvbW1hbmQtPnhmZXJfc3RhdHVzID0gY3B1X3RvX2xlMTYoMCk7CiAJfQotCS8qIGxhc3Qgb25lIGJyYW5jaGVzIGJhY2sgdG8gZmlyc3QgKi8KLQljb21tYW5kLS07Ci0JY29tbWFuZC0+Y29tbWFuZCB8PSBjcHVfdG9fbGUxNihCUl9BTFdBWVMpOworCisJLyogYnJhbmNoIGJhY2sgdG8gYmVnaW5uaW5nIG9mIHJpbmcgKi8KKwljb21tYW5kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoREJETUFfTk9QIHwgQlJfQUxXQVlTKTsKIAljb21tYW5kLT5jbWRfZGVwID0gY3B1X3RvX2xlMzIocGktPmRiZG1hX3JpbmcuYnVzX2NtZF9zdGFydCk7CisJY29tbWFuZCsrOworCisJLyogc2V0IHN0b3AgY29tbWFuZCAqLworCWNvbW1hbmQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihEQkRNQV9TVE9QKTsKIAogCS8qIG9rLCBsZXQncyBzZXQgdGhlIHNlcmlhbCBmb3JtYXQgYW5kIHN0dWZmICovCiAJc3dpdGNoIChydW50aW1lLT5mb3JtYXQpIHsKQEAgLTQzNSwxNiArNTIzLDE4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHN0cnVjdCBkYmRtYV9jbWQgU1RPUF9DTUQgPSB7Ci0JLmNvbW1hbmQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KERCRE1BX1NUT1ApLAotfTsKKyNpZmRlZiBDT05GSUdfUE0KK3ZvaWQgaTJzYnVzX3BjbV9wcmVwYXJlX2JvdGgoc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldikKK3sKKwlpMnNidXNfcGNtX3ByZXBhcmUoaTJzZGV2LCAwKTsKKwlpMnNidXNfcGNtX3ByZXBhcmUoaTJzZGV2LCAxKTsKK30KKyNlbmRpZgogCiBzdGF0aWMgaW50IGkyc2J1c19wY21fdHJpZ2dlcihzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LCBpbnQgaW4sIGludCBjbWQpCiB7CiAJc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpOwogCXN0cnVjdCBwY21faW5mbyAqcGk7Ci0JaW50IHRpbWVvdXQ7Ci0Jc3RydWN0IGRiZG1hX2NtZCB0bXA7CiAJaW50IHJlc3VsdCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNDY0LDkyICs1NTQsNTAgQEAKIAkJCQljaWktPmNvZGVjLT5zdGFydChjaWksIHBpLT5zdWJzdHJlYW0pOwogCQlwaS0+ZGJkbWFfcmluZy5ydW5uaW5nID0gMTsKIAotCQkvKiByZXNldCBkbWEgZW5naW5lICovCi0JCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNvbnRyb2wsCi0JCQkgMCB8IChSVU4gfCBQQVVTRSB8IEZMVVNIIHwgV0FLRSkgPDwgMTYpOwotCQl0aW1lb3V0ID0gMTAwOwotCQl3aGlsZSAoaW5fbGUzMigmcGktPmRiZG1hLT5zdGF0dXMpICYgUlVOICYmIHRpbWVvdXQtLSkKLQkJCXVkZWxheSgxKTsKLQkJaWYgKHRpbWVvdXQgPD0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImkyc2J1czogZXJyb3Igd2FpdGluZyBmb3IgZG1hIHJlc2V0XG4iKTsKLQkJCXJlc3VsdCA9IC1FTlhJTzsKLQkJCWdvdG8gb3V0X3VubG9jazsKKwkJaWYgKHBpLT5kYmRtYV9yaW5nLnN0b3BwaW5nKSB7CisJCQkvKiBDbGVhciB0aGUgUzAgYml0LCB0aGVuIHNlZSBpZiB3ZSBzdG9wcGVkIHlldCAqLworCQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgMSA8PCAxNik7CisJCQlpZiAoaW5fbGUzMigmcGktPmRiZG1hLT5zdGF0dXMpICYgQUNUSVZFKSB7CisJCQkJLyogcG9zc2libGUgcmFjZSBoZXJlPyAqLworCQkJCXVkZWxheSgxMCk7CisJCQkJaWYgKGluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKSAmIEFDVElWRSkgeworCQkJCQlwaS0+ZGJkbWFfcmluZy5zdG9wcGluZyA9IDA7CisJCQkJCWdvdG8gb3V0X3VubG9jazsgLyoga2VlcCBydW5uaW5nICovCisJCQkJfQorCQkJfQogCQl9CiAKKwkJLyogbWFrZSBzdXJlIFJVTiwgUEFVU0UgYW5kIFMwIGJpdHMgYXJlIGNsZWFyZWQgKi8KKwkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgKFJVTiB8IFBBVVNFIHwgMSkgPDwgMTYpOworCisJCS8qIHNldCBicmFuY2ggY29uZGl0aW9uIHNlbGVjdCByZWdpc3RlciAqLworCQlvdXRfbGUzMigmcGktPmRiZG1hLT5icl9zZWwsICgxIDw8IDE2KSB8IDEpOworCiAJCS8qIHdyaXRlIGRtYSBjb21tYW5kIGJ1ZmZlciBhZGRyZXNzIHRvIHRoZSBkYmRtYSBjaGlwICovCiAJCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNtZHB0ciwgcGktPmRiZG1hX3JpbmcuYnVzX2NtZF9zdGFydCk7Ci0JCS8qIHBvc3QgUENJIHdyaXRlICovCi0JCW1iKCk7Ci0JCSh2b2lkKWluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKTsKIAotCQkvKiBjaGFuZ2UgZmlyc3QgY29tbWFuZCB0byBTVE9QICovCi0JCXRtcCA9ICpwaS0+ZGJkbWFfcmluZy5jbWRzOwotCQkqcGktPmRiZG1hX3JpbmcuY21kcyA9IFNUT1BfQ01EOwotCi0JCS8qIHNldCBydW5uaW5nIHN0YXRlLCByZW1lbWJlciB0aGF0IHRoZSBmaXJzdCBjb21tYW5kIGlzIFNUT1AgKi8KLQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgUlVOIHwgKFJVTiA8PCAxNikpOwotCQl0aW1lb3V0ID0gMTAwOwotCQkvKiB3YWl0IGZvciBTVE9QIHRvIGJlIGV4ZWN1dGVkICovCi0JCXdoaWxlIChpbl9sZTMyKCZwaS0+ZGJkbWEtPnN0YXR1cykgJiBBQ1RJVkUgJiYgdGltZW91dC0tKQotCQkJdWRlbGF5KDEpOwotCQlpZiAodGltZW91dCA8PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImkyc2J1czogZXJyb3Igd2FpdGluZyBmb3IgZG1hIHN0b3BcbiIpOwotCQkJcmVzdWx0ID0gLUVOWElPOwotCQkJZ290byBvdXRfdW5sb2NrOwotCQl9Ci0JCS8qIGFnYWluLCB3cml0ZSBkbWEgY29tbWFuZCBidWZmZXIgYWRkcmVzcyB0byB0aGUgZGJkbWEgY2hpcCwKLQkJICogdGhpcyB0aW1lIG9mIHRoZSBmaXJzdCByZWFsIGNvbW1hbmQgKi8KLQkJKnBpLT5kYmRtYV9yaW5nLmNtZHMgPSB0bXA7Ci0JCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNtZHB0ciwgcGktPmRiZG1hX3JpbmcuYnVzX2NtZF9zdGFydCk7Ci0JCS8qIHBvc3Qgd3JpdGUgKi8KLQkJbWIoKTsKLQkJKHZvaWQpaW5fbGUzMigmcGktPmRiZG1hLT5zdGF0dXMpOwotCi0JCS8qIHJlc2V0IGRtYSBlbmdpbmUgYWdhaW4gKi8KLQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwKLQkJCSAwIHwgKFJVTiB8IFBBVVNFIHwgRkxVU0ggfCBXQUtFKSA8PCAxNik7Ci0JCXRpbWVvdXQgPSAxMDA7Ci0JCXdoaWxlIChpbl9sZTMyKCZwaS0+ZGJkbWEtPnN0YXR1cykgJiBSVU4gJiYgdGltZW91dC0tKQotCQkJdWRlbGF5KDEpOwotCQlpZiAodGltZW91dCA8PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiaTJzYnVzOiBlcnJvciB3YWl0aW5nIGZvciBkbWEgcmVzZXRcbiIpOwotCQkJcmVzdWx0ID0gLUVOWElPOwotCQkJZ290byBvdXRfdW5sb2NrOwotCQl9Ci0KLQkJLyogd2FrZSB1cCB0aGUgY2hpcCB3aXRoIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KLQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwKLQkJCSAoUlVOIHwgV0FLRSkgfCAoKFJVTiB8IFdBS0UpIDw8IDE2KSk7Ci0JCS8qIGdldCB0aGUgZnJhbWUgY291bnQgICovCisJCS8qIGluaXRpYWxpemUgdGhlIGZyYW1lIGNvdW50IGFuZCBjdXJyZW50IHBlcmlvZCAqLworCQlwaS0+Y3VycmVudF9wZXJpb2QgPSAwOwogCQlwaS0+ZnJhbWVfY291bnQgPSBpbl9sZTMyKCZpMnNkZXYtPmludGZyZWdzLT5mcmFtZV9jb3VudCk7CiAKKwkJLyogc2V0IHRoZSBETUEgY29udHJvbGxlciBydW5uaW5nICovCisJCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNvbnRyb2wsIChSVU4gPDwgMTYpIHwgUlVOKTsKKwogCQkvKiBvZmYgeW91IGdvISAqLwogCQlicmVhazsKKwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CiAJCWlmICghcGktPmRiZG1hX3JpbmcucnVubmluZykgewogCQkJcmVzdWx0ID0gLUVBTFJFQURZOwogCQkJZ290byBvdXRfdW5sb2NrOwogCQl9Ci0KLQkJLyogdHVybiBvZmYgYWxsIHJlbGV2YW50IGJpdHMgKi8KLQkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwKLQkJCSAoUlVOIHwgV0FLRSB8IEZMVVNIIHwgUEFVU0UpIDw8IDE2KTsKLQkJewotCQkJLyogRklYTUU6IG1vdmUgdG8gb3duIGZ1bmN0aW9uICovCi0JCQlpbnQgdGltZW91dCA9IDUwMDA7Ci0JCQl3aGlsZSAoKGluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKSAmIFJVTikKLQkJCSAgICAgICAmJiAtLXRpbWVvdXQgPiAwKQotCQkJCXVkZWxheSgxKTsKLQkJCWlmICghdGltZW91dCkKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgImkyc2J1czogdGltZWQgb3V0IHR1cm5pbmcgIgotCQkJCSAgICAgICAib2ZmIGRiZG1hIGVuZ2luZSFcbiIpOwotCQl9Ci0KIAkJcGktPmRiZG1hX3JpbmcucnVubmluZyA9IDA7CisKKwkJLyogU2V0IHRoZSBTMCBiaXQgdG8gbWFrZSB0aGUgRE1BIGJyYW5jaCB0byB0aGUgc3RvcCBjbWQgKi8KKwkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgKDEgPDwgMTYpIHwgMSk7CisJCXBpLT5kYmRtYV9yaW5nLnN0b3BwaW5nID0gMTsKKwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmkyc2Rldi0+c291bmQuY29kZWNfbGlzdCwgbGlzdCkKIAkJCWlmIChjaWktPmNvZGVjLT5zdG9wKQogCQkJCWNpaS0+Y29kZWMtPnN0b3AoY2lpLCBwaS0+c3Vic3RyZWFtKTsKQEAgLTU3NCw3MCArNjIyLDgyIEBACiAJZmMgPSBpbl9sZTMyKCZpMnNkZXYtPmludGZyZWdzLT5mcmFtZV9jb3VudCk7CiAJZmMgPSBmYyAtIHBpLT5mcmFtZV9jb3VudDsKIAotCXJldHVybiAoYnl0ZXNfdG9fZnJhbWVzKHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWUsCi0JCQlwaS0+Y3VycmVudF9wZXJpb2QgKgotCQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBpLT5zdWJzdHJlYW0pKQotCQkrIGZjKSAlIHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCWlmIChmYyA+PSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJZmMgJT0gcGktPnN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemU7CisJcmV0dXJuIGZjOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LCBpbnQgaW4pCiB7CiAJc3RydWN0IHBjbV9pbmZvICpwaTsKLQl1MzIgZmM7Ci0JdTMyIGRlbHRhOworCXUzMiBmYywgbmZyYW1lczsKKwl1MzIgc3RhdHVzOworCWludCB0aW1lb3V0LCBpOworCWludCBkbWFfc3RvcHBlZCA9IDA7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKIAogCXNwaW5fbG9jaygmaTJzZGV2LT5sb3dfbG9jayk7CiAJZ2V0X3BjbV9pbmZvKGkyc2RldiwgaW4sICZwaSwgTlVMTCk7Ci0KLQlpZiAoIXBpLT5kYmRtYV9yaW5nLnJ1bm5pbmcpIHsKLQkJLyogdGhlcmUgd2FzIHN0aWxsIGFuIGludGVycnVwdCBwZW5kaW5nCi0JCSAqIHdoaWxlIHdlIHN0b3BwZWQuIG9yIG1heWJlIGFub3RoZXIKLQkJICogcHJvY2Vzc29yIChub3QgdGhlIG9uZSB0aGF0IHdhcyBzdG9wcGluZwotCQkgKiB0aGUgRE1BIGVuZ2luZSkgd2FzIHNwaW5uaW5nIGFib3ZlCi0JCSAqIHdhaXRpbmcgZm9yIHRoZSBsb2NrLiAqLworCWlmICghcGktPmRiZG1hX3JpbmcucnVubmluZyAmJiAhcGktPmRiZG1hX3Jpbmcuc3RvcHBpbmcpCiAJCWdvdG8gb3V0X3VubG9jazsKLQl9CiAKLQlmYyA9IGluX2xlMzIoJmkyc2Rldi0+aW50ZnJlZ3MtPmZyYW1lX2NvdW50KTsKLQkvKiBhIGNvdW50ZXIgb3ZlcmZsb3cgZG9lcyBub3QgY2hhbmdlIHRoZSBjYWxjdWxhdGlvbi4gKi8KLQlkZWx0YSA9IGZjIC0gcGktPmZyYW1lX2NvdW50OworCWkgPSBwaS0+Y3VycmVudF9wZXJpb2Q7CisJcnVudGltZSA9IHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWU7CisJd2hpbGUgKHBpLT5kYmRtYV9yaW5nLmNtZHNbaV0ueGZlcl9zdGF0dXMpIHsKKwkJaWYgKGxlMTZfdG9fY3B1KHBpLT5kYmRtYV9yaW5nLmNtZHNbaV0ueGZlcl9zdGF0dXMpICYgQlQpCisJCQkvKgorCQkJICogQlQgaXMgdGhlIGJyYW5jaCB0YWtlbiBiaXQuICBJZiBpdCB0b29rIGEgYnJhbmNoCisJCQkgKiBpdCBpcyBiZWNhdXNlIHdlIHNldCB0aGUgUzAgYml0IHRvIG1ha2UgaXQKKwkJCSAqIGJyYW5jaCB0byB0aGUgc3RvcCBjb21tYW5kLgorCQkJICovCisJCQlkbWFfc3RvcHBlZCA9IDE7CisJCXBpLT5kYmRtYV9yaW5nLmNtZHNbaV0ueGZlcl9zdGF0dXMgPSAwOwogCi0JLyogdXBkYXRlIGN1cnJlbnRfcGVyaW9kICovCi0Jd2hpbGUgKGRlbHRhID49IHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplKSB7Ci0JCXBpLT5jdXJyZW50X3BlcmlvZCsrOwotCQlkZWx0YSA9IGRlbHRhIC0gcGktPnN1YnN0cmVhbS0+cnVudGltZS0+cGVyaW9kX3NpemU7Ci0JfQotCi0JaWYgKHVubGlrZWx5KGRlbHRhKSkgewotCQkvKiBTb21lIGludGVycnVwdCBjYW1lIGxhdGUsIHNvIGNoZWNrIHRoZSBkYmRtYS4KLQkJICogVGhpcyBzcGVjaWFsIGNhc2UgZXhpc3RzIHRvIHN5bmNyb25pemUgdGhlIGZyYW1lX2NvdW50IHdpdGgKLQkJICogdGhlIGRiZG1hIHRyYW5zZmVyLCBidXQgaXMgaGl0IGV2ZXJ5IG9uY2UgaW4gYSB3aGlsZS4gKi8KLQkJaW50IHBlcmlvZDsKLQotCQlwZXJpb2QgPSAoaW5fbGUzMigmcGktPmRiZG1hLT5jbWRwdHIpCi0JCSAgICAgICAgLSBwaS0+ZGJkbWFfcmluZy5idXNfY21kX3N0YXJ0KQotCQkJCS8gc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpOwotCQlwaS0+Y3VycmVudF9wZXJpb2QgPSBwaS0+Y3VycmVudF9wZXJpb2QKLQkJCQkJJSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2RzOwotCi0JCXdoaWxlIChwaS0+Y3VycmVudF9wZXJpb2QgIT0gcGVyaW9kKSB7Ci0JCQlwaS0+Y3VycmVudF9wZXJpb2QrKzsKLQkJCXBpLT5jdXJyZW50X3BlcmlvZCAlPSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2RzOwotCQkJLyogU2V0IGRlbHRhIHRvIHplcm8sIGFzIHRoZSBmcmFtZV9jb3VudCB2YWx1ZSBpcyB0b28KLQkJCSAqIGhpZ2ggKG90aGVyd2lzZSB0aGUgY29kZSBwYXRoIHdpbGwgbm90IGJlIGV4ZWN1dGVkKS4KLQkJCSAqIFRoaXMgY29ycmVjdHMgdGhlIGZhY3QgdGhhdCB0aGUgZnJhbWVfY291bnQgaXMgdG9vCi0JCQkgKiBsb3cgYXQgdGhlIGJlZ2lubmluZyBkdWUgdG8gYnVmZmVyaW5nLiAqLwotCQkJZGVsdGEgPSAwOworCQlpZiAoKytpID49IHJ1bnRpbWUtPnBlcmlvZHMpIHsKKwkJCWkgPSAwOworCQkJcGktPmZyYW1lX2NvdW50ICs9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwogCQl9CisJCXBpLT5jdXJyZW50X3BlcmlvZCA9IGk7CisKKwkJLyoKKwkJICogQ2hlY2sgdGhlIGZyYW1lIGNvdW50LiAgVGhlIERNQSB0ZW5kcyB0byBnZXQgYSBiaXQKKwkJICogYWhlYWQgb2YgdGhlIGZyYW1lIGNvdW50ZXIsIHdoaWNoIGNvbmZ1c2VzIHRoZSBjb3JlLgorCQkgKi8KKwkJZmMgPSBpbl9sZTMyKCZpMnNkZXYtPmludGZyZWdzLT5mcmFtZV9jb3VudCk7CisJCW5mcmFtZXMgPSBpICogcnVudGltZS0+cGVyaW9kX3NpemU7CisJCWlmIChmYyA8IHBpLT5mcmFtZV9jb3VudCArIG5mcmFtZXMpCisJCQlwaS0+ZnJhbWVfY291bnQgPSBmYyAtIG5mcmFtZXM7CiAJfQogCi0JcGktPmZyYW1lX2NvdW50ID0gZmMgLSBkZWx0YTsKLQlwaS0+Y3VycmVudF9wZXJpb2QgJT0gcGktPnN1YnN0cmVhbS0+cnVudGltZS0+cGVyaW9kczsKKwlpZiAoZG1hX3N0b3BwZWQpIHsKKwkJdGltZW91dCA9IDEwMDA7CisJCWZvciAoOzspIHsKKwkJCXN0YXR1cyA9IGluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKTsKKwkJCWlmICghKHN0YXR1cyAmIEFDVElWRSkgJiYgKCFpbiB8fCAoc3RhdHVzICYgMHg4MCkpKQorCQkJCWJyZWFrOworCQkJaWYgKC0tdGltZW91dCA8PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJpMnNidXM6IHRpbWVkIG91dCAiCisJCQkJICAgICAgICJ3YWl0aW5nIGZvciBETUEgdG8gc3RvcCFcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJdWRlbGF5KDEpOworCQl9CiAKKwkJLyogVHVybiBvZmYgRE1BIGNvbnRyb2xsZXIsIGNsZWFyIFMwIGJpdCAqLworCQlvdXRfbGUzMigmcGktPmRiZG1hLT5jb250cm9sLCAoUlVOIHwgUEFVU0UgfCAxKSA8PCAxNik7CisKKwkJcGktPmRiZG1hX3Jpbmcuc3RvcHBpbmcgPSAwOworCQlpZiAocGktPnN0b3BfY29tcGxldGlvbikKKwkJCWNvbXBsZXRlKHBpLT5zdG9wX2NvbXBsZXRpb24pOworCX0KKworCWlmICghcGktPmRiZG1hX3JpbmcucnVubmluZykKKwkJZ290byBvdXRfdW5sb2NrOwogCXNwaW5fdW5sb2NrKCZpMnNkZXYtPmxvd19sb2NrKTsKIAkvKiBtYXkgY2FsbCBfdHJpZ2dlciBhZ2FpbiwgaGVuY2UgbmVlZHMgdG8gYmUgdW5sb2NrZWQgKi8KIAlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBpLT5zdWJzdHJlYW0pOwogCXJldHVybjsKKwogIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJmkyc2Rldi0+bG93X2xvY2spOwogfQpAQCAtNzE4LDcgKzc3OCw3IEBACiAJLmNsb3NlID0JaTJzYnVzX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAogCS5od19wYXJhbXMgPQlpMnNidXNfaHdfcGFyYW1zLAotCS5od19mcmVlID0JaTJzYnVzX2h3X2ZyZWUsCisJLmh3X2ZyZWUgPQlpMnNidXNfcGxheWJhY2tfaHdfZnJlZSwKIAkucHJlcGFyZSA9CWkyc2J1c19wbGF5YmFja19wcmVwYXJlLAogCS50cmlnZ2VyID0JaTJzYnVzX3BsYXliYWNrX3RyaWdnZXIsCiAJLnBvaW50ZXIgPQlpMnNidXNfcGxheWJhY2tfcG9pbnRlciwKQEAgLTc4OCw3ICs4NDgsNyBAQAogCS5jbG9zZSA9CWkyc2J1c19yZWNvcmRfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCiAJLmh3X3BhcmFtcyA9CWkyc2J1c19od19wYXJhbXMsCi0JLmh3X2ZyZWUgPQlpMnNidXNfaHdfZnJlZSwKKwkuaHdfZnJlZSA9CWkyc2J1c19yZWNvcmRfaHdfZnJlZSwKIAkucHJlcGFyZSA9CWkyc2J1c19yZWNvcmRfcHJlcGFyZSwKIAkudHJpZ2dlciA9CWkyc2J1c19yZWNvcmRfdHJpZ2dlciwKIAkucG9pbnRlciA9CWkyc2J1c19yZWNvcmRfcG9pbnRlciwKQEAgLTgxMiw3ICs4NzIsNiBAQAogCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogfQogCi0vKiBGSVhNRTogdGhpcyBmdW5jdGlvbiBuZWVkcyBhbiBlcnJvciBoYW5kbGluZyBzdHJhdGVneSB3aXRoIGxhYmVscyAqLwogaW50CiBpMnNidXNfYXR0YWNoX2NvZGVjKHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldiwgc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkgICAgc3RydWN0IGNvZGVjX2luZm8gKmNpLCB2b2lkICpkYXRhKQpAQCAtODgwLDQxICs5MzksMzEgQEAKIAlpZiAoIWNpaS0+c2RldikgewogCQlwcmludGsoS0VSTl9ERUJVRwogCQkgICAgICAgImkyc2J1czogZmFpbGVkIHRvIGdldCBzb3VuZGJ1cyBkZXYgcmVmZXJlbmNlXG4iKTsKLQkJa2ZyZWUoY2lpKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2ZyZWVfY2lpOwogCX0KIAogCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJpMnNidXM6IGZhaWxlZCB0byBnZXQgbW9kdWxlIHJlZmVyZW5jZSFcbiIpOwotCQlzb3VuZGJ1c19kZXZfcHV0KGRldik7Ci0JCWtmcmVlKGNpaSk7Ci0JCXJldHVybiAtRUJVU1k7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXRfcHV0X3NkZXY7CiAJfQogCiAJaWYgKCF0cnlfbW9kdWxlX2dldChjaS0+b3duZXIpKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHCiAJCSAgICAgICAiaTJzYnVzOiBmYWlsZWQgdG8gZ2V0IG1vZHVsZSByZWZlcmVuY2UgdG8gY29kZWMgb3duZXIhXG4iKTsKLQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCXNvdW5kYnVzX2Rldl9wdXQoZGV2KTsKLQkJa2ZyZWUoY2lpKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dF9wdXRfdGhpc19tb2R1bGU7CiAJfQogCiAJaWYgKCFkZXYtPnBjbSkgewotCQllcnIgPSBzbmRfcGNtX25ldyhjYXJkLAotCQkJCSAgZGV2LT5wY21uYW1lLAotCQkJCSAgZGV2LT5wY21pZCwKLQkJCQkgIDAsCi0JCQkJICAwLAorCQllcnIgPSBzbmRfcGNtX25ldyhjYXJkLCBkZXYtPnBjbW5hbWUsIGRldi0+cGNtaWQsIDAsIDAsCiAJCQkJICAmZGV2LT5wY20pOwogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiaTJzYnVzOiBmYWlsZWQgdG8gY3JlYXRlIHBjbVxuIik7Ci0JCQlrZnJlZShjaWkpOwotCQkJbW9kdWxlX3B1dChjaS0+b3duZXIpOwotCQkJc291bmRidXNfZGV2X3B1dChkZXYpOwotCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCQlyZXR1cm4gZXJyOworCQkJZ290byBvdXRfcHV0X2NpX21vZHVsZTsKIAkJfQorCQlkZXYtPnBjbS0+ZGV2ID0gJmRldi0+b2ZkZXYuZGV2OwogCX0KIAogCS8qIEFMU0EgeWV0IGFnYWluIHN1Y2tzLgpAQCAtOTI2LDIwICs5NzUsMTIgQEAKIAkJCS8qIGVoPyAqLwogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIkNhbid0IGF0dGFjaCBzYW1lIGJ1cyB0byBkaWZmZXJlbnQgY2FyZHMhXG4iKTsKLQkJCW1vZHVsZV9wdXQoY2ktPm93bmVyKTsKLQkJCWtmcmVlKGNpaSk7Ci0JCQlzb3VuZGJ1c19kZXZfcHV0KGRldik7Ci0JCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X3B1dF9jaV9tb2R1bGU7CiAJCX0KLQkJaWYgKChlcnIgPQotCQkgICAgIHNuZF9wY21fbmV3X3N0cmVhbShkZXYtPnBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgMSkpKSB7Ci0JCQltb2R1bGVfcHV0KGNpLT5vd25lcik7Ci0JCQlrZnJlZShjaWkpOwotCQkJc291bmRidXNfZGV2X3B1dChkZXYpOwotCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWVyciA9IHNuZF9wY21fbmV3X3N0cmVhbShkZXYtPnBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgMSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9wdXRfY2lfbW9kdWxlOwogCQlzbmRfcGNtX3NldF9vcHMoZGV2LT5wY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCiAJCQkJJmkyc2J1c19wbGF5YmFja19vcHMpOwogCQlpMnNkZXYtPm91dC5jcmVhdGVkID0gMTsKQEAgLTk0OSwyMCArOTkwLDExIEBACiAJCWlmIChkZXYtPnBjbS0+Y2FyZCAhPSBjYXJkKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiQ2FuJ3QgYXR0YWNoIHNhbWUgYnVzIHRvIGRpZmZlcmVudCBjYXJkcyFcbiIpOwotCQkJbW9kdWxlX3B1dChjaS0+b3duZXIpOwotCQkJa2ZyZWUoY2lpKTsKLQkJCXNvdW5kYnVzX2Rldl9wdXQoZGV2KTsKLQkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlnb3RvIG91dF9wdXRfY2lfbW9kdWxlOwogCQl9Ci0JCWlmICgoZXJyID0KLQkJICAgICBzbmRfcGNtX25ld19zdHJlYW0oZGV2LT5wY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgMSkpKSB7Ci0JCQltb2R1bGVfcHV0KGNpLT5vd25lcik7Ci0JCQlrZnJlZShjaWkpOwotCQkJc291bmRidXNfZGV2X3B1dChkZXYpOwotCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWVyciA9IHNuZF9wY21fbmV3X3N0cmVhbShkZXYtPnBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X3B1dF9jaV9tb2R1bGU7CiAJCXNuZF9wY21fc2V0X29wcyhkZXYtPnBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAogCQkJCSZpMnNidXNfcmVjb3JkX29wcyk7CiAJCWkyc2Rldi0+aW4uY3JlYXRlZCA9IDE7CkBAIC05NzcsMTEgKzEwMDksNyBAQAogCWVyciA9IHNuZF9kZXZpY2VfcmVnaXN0ZXIoY2FyZCwgZGV2LT5wY20pOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpMnNidXM6IGVycm9yIHJlZ2lzdGVyaW5nIG5ldyBwY21cbiIpOwotCQltb2R1bGVfcHV0KGNpLT5vd25lcik7Ci0JCWtmcmVlKGNpaSk7Ci0JCXNvdW5kYnVzX2Rldl9wdXQoZGV2KTsKLQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0X3B1dF9jaV9tb2R1bGU7CiAJfQogCS8qIG5vIGVycm9ycyBhbnkgbW9yZSwgc28gbGV0J3MgYWRkIHRoaXMgdG8gb3VyIGxpc3QgKi8KIAlsaXN0X2FkZCgmY2lpLT5saXN0LCAmZGV2LT5jb2RlY19saXN0KTsKQEAgLTk5Niw2ICsxMDI0LDE1IEBACiAJCTY0ICogMTAyNCwgNjQgKiAxMDI0KTsKIAogCXJldHVybiAwOworIG91dF9wdXRfY2lfbW9kdWxlOgorCW1vZHVsZV9wdXQoY2ktPm93bmVyKTsKKyBvdXRfcHV0X3RoaXNfbW9kdWxlOgorCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworIG91dF9wdXRfc2RldjoKKwlzb3VuZGJ1c19kZXZfcHV0KGRldik7Cisgb3V0X2ZyZWVfY2lpOgorCWtmcmVlKGNpaSk7CisJcmV0dXJuIGVycjsKIH0KIAogdm9pZCBpMnNidXNfZGV0YWNoX2NvZGVjKHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldiwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLmggYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy5oCmluZGV4IGVjMjBlZTYuLmZmMjk2NTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLmgKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMuaApAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KIApAQCAtMzQsNiArMzUsNyBAQAogCXZvaWQgKnNwYWNlOwogCWludCBzaXplOwogCXUzMiBydW5uaW5nOjE7CisJdTMyIHN0b3BwaW5nOjE7CiB9OwogCiBzdHJ1Y3QgcGNtX2luZm8gewpAQCAtNDUsNiArNDcsNyBAQAogCXUzMiBmcmFtZV9jb3VudDsKIAlzdHJ1Y3QgZGJkbWFfY29tbWFuZF9tZW0gZGJkbWFfcmluZzsKIAl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkYmRtYTsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqc3RvcF9jb21wbGV0aW9uOwogfTsKIAogZW51bSB7CkBAIC0xMDEsNiArMTA0LDkgQEAKIGV4dGVybiBpcnFyZXR1cm5fdAogaTJzYnVzX3J4X2ludHIoaW50IGlycSwgdm9pZCAqZGV2aWQpOwogCitleHRlcm4gdm9pZCBpMnNidXNfd2FpdF9mb3Jfc3RvcF9ib3RoKHN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYpOworZXh0ZXJuIHZvaWQgaTJzYnVzX3BjbV9wcmVwYXJlX2JvdGgoc3RydWN0IGkyc2J1c19kZXYgKmkyc2Rldik7CisKIC8qIGNvbnRyb2wgc3BlY2lmaWMgZnVuY3Rpb25zICovCiBleHRlcm4gaW50IGkyc2J1c19jb250cm9sX2luaXQoc3RydWN0IG1hY2lvX2RldiogZGV2LAogCQkJICAgICAgIHN0cnVjdCBpMnNidXNfY29udHJvbCAqKmMpOwpkaWZmIC0tZ2l0IGEvc291bmQvYXJtL2FhY2kuaCBiL3NvdW5kL2FybS9hYWNpLmgKaW5kZXggMDYyOTUxOS4uOTE3NWZmOSAxMDA2NDQKLS0tIGEvc291bmQvYXJtL2FhY2kuaAorKysgYi9zb3VuZC9hcm0vYWFjaS5oCkBAIC0yMjgsNyArMjI4LDcgQEAKIAogCS8qIEFDJzk3ICovCiAJc3RydWN0IG11dGV4CQlhYzk3X3NlbTsKLQlhYzk3X2J1c190CQkqYWM5N19idXM7CisJc3RydWN0IHNuZF9hYzk3X2J1cwkqYWM5N19idXM7CiAKIAl1MzIJCQltYWluY3I7CiAJc3BpbmxvY2tfdAkJbG9jazsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvY29udHJvbC5jIGIvc291bmQvY29yZS9jb250cm9sLmMKaW5kZXggMGM3YmNkNi4uNDJiY2YyNyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9jb250cm9sLmMKKysrIGIvc291bmQvY29yZS9jb250cm9sLmMKQEAgLTEwOCw3ICsxMDgsNiBAQAogc3RhdGljIGludCBzbmRfY3RsX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX2N0bF9maWxlICpjdGw7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqY29udHJvbDsKQEAgLTEyMiwxMiArMTIxLDEwIEBACiAJbGlzdF9kZWwoJmN0bC0+bGlzdCk7CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmN0bF9maWxlc19yd2xvY2ssIGZsYWdzKTsKIAlkb3duX3dyaXRlKCZjYXJkLT5jb250cm9sc19yd3NlbSk7Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmY2FyZC0+Y29udHJvbHMpIHsKLQkJY29udHJvbCA9IHNuZF9rY29udHJvbChsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbnRyb2wsICZjYXJkLT5jb250cm9scywgbGlzdCkKIAkJZm9yIChpZHggPSAwOyBpZHggPCBjb250cm9sLT5jb3VudDsgaWR4KyspCiAJCQlpZiAoY29udHJvbC0+dmRbaWR4XS5vd25lciA9PSBjdGwpCiAJCQkJY29udHJvbC0+dmRbaWR4XS5vd25lciA9IE5VTEw7Ci0JfQogCXVwX3dyaXRlKCZjYXJkLT5jb250cm9sc19yd3NlbSk7CiAJc25kX2N0bF9lbXB0eV9yZWFkX3F1ZXVlKGN0bCk7CiAJa2ZyZWUoY3RsKTsKQEAgLTE0MCw3ICsxMzcsNiBAQAogCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pZCAqaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpmbGlzdDsKIAlzdHJ1Y3Qgc25kX2N0bF9maWxlICpjdGw7CiAJc3RydWN0IHNuZF9rY3RsX2V2ZW50ICpldjsKIAkKQEAgLTE0OSwxNCArMTQ1LDExIEBACiAjaWYgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TU19NT0RVTEUpCiAJY2FyZC0+bWl4ZXJfb3NzX2NoYW5nZV9jb3VudCsrOwogI2VuZGlmCi0JbGlzdF9mb3JfZWFjaChmbGlzdCwgJmNhcmQtPmN0bF9maWxlcykgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICplbGlzdDsKLQkJY3RsID0gc25kX2N0bF9maWxlKGZsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0bCwgJmNhcmQtPmN0bF9maWxlcywgbGlzdCkgewogCQlpZiAoIWN0bC0+c3Vic2NyaWJlZCkKIAkJCWNvbnRpbnVlOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3RsLT5yZWFkX2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9mb3JfZWFjaChlbGlzdCwgJmN0bC0+ZXZlbnRzKSB7Ci0JCQlldiA9IHNuZF9rY3RsX2V2ZW50KGVsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShldiwgJmN0bC0+ZXZlbnRzLCBsaXN0KSB7CiAJCQlpZiAoZXYtPmlkLm51bWlkID09IGlkLT5udW1pZCkgewogCQkJCWV2LT5tYXNrIHw9IG1hc2s7CiAJCQkJZ290byBfZm91bmQ7CkBAIC0xOTAsNyArMTgzLDggQEAKICAqCiAgKiBSZXR1cm5zIHRoZSBwb2ludGVyIG9mIHRoZSBuZXcgaW5zdGFuY2UsIG9yIE5VTEwgb24gZmFpbHVyZS4KICAqLwotc3RydWN0IHNuZF9rY29udHJvbCAqc25kX2N0bF9uZXcoc3RydWN0IHNuZF9rY29udHJvbCAqY29udHJvbCwgdW5zaWduZWQgaW50IGFjY2VzcykKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sICpzbmRfY3RsX25ldyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjb250cm9sLAorCQkJCQl1bnNpZ25lZCBpbnQgYWNjZXNzKQogewogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CiAJdW5zaWduZWQgaW50IGlkeDsKQEAgLTIwOCw4ICsyMDIsNiBAQAogCXJldHVybiBrY3RsOwogfQogCi1FWFBPUlRfU1lNQk9MKHNuZF9jdGxfbmV3KTsKLQogLyoqCiAgKiBzbmRfY3RsX25ldzEgLSBjcmVhdGUgYSBjb250cm9sIGluc3RhbmNlIGZyb20gdGhlIHRlbXBsYXRlCiAgKiBAbmNvbnRyb2w6IHRoZSBpbml0aWFsaXphdGlvbiByZWNvcmQKQEAgLTI3NywxMSArMjY5LDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2N0bF9ob2xlX2NoZWNrKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IGNvdW50KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmNvbnRyb2xzKSB7Ci0JCWtjdGwgPSBzbmRfa2NvbnRyb2wobGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShrY3RsLCAmY2FyZC0+Y29udHJvbHMsIGxpc3QpIHsKIAkJaWYgKChrY3RsLT5pZC5udW1pZCA8PSBjYXJkLT5sYXN0X251bWlkICYmCiAJCSAgICAga2N0bC0+aWQubnVtaWQgKyBrY3RsLT5jb3VudCA+IGNhcmQtPmxhc3RfbnVtaWQpIHx8CiAJCSAgICAoa2N0bC0+aWQubnVtaWQgPD0gY2FyZC0+bGFzdF9udW1pZCArIGNvdW50IC0gMSAmJgpAQCAtNDk4LDEyICs0ODgsMTAgQEAKICAqLwogc3RydWN0IHNuZF9rY29udHJvbCAqc25kX2N0bF9maW5kX251bWlkKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IG51bWlkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAogCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMICYmIG51bWlkICE9IDAsIHJldHVybiBOVUxMKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5jb250cm9scykgewotCQlrY3RsID0gc25kX2tjb250cm9sKGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoa2N0bCwgJmNhcmQtPmNvbnRyb2xzLCBsaXN0KSB7CiAJCWlmIChrY3RsLT5pZC5udW1pZCA8PSBudW1pZCAmJiBrY3RsLT5pZC5udW1pZCArIGtjdGwtPmNvdW50ID4gbnVtaWQpCiAJCQlyZXR1cm4ga2N0bDsKIAl9CkBAIC01MjcsMTQgKzUxNSwxMiBAQAogc3RydWN0IHNuZF9rY29udHJvbCAqc25kX2N0bF9maW5kX2lkKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKIAkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faWQgKmlkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAogCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMICYmIGlkICE9IE5VTEwsIHJldHVybiBOVUxMKTsKIAlpZiAoaWQtPm51bWlkICE9IDApCiAJCXJldHVybiBzbmRfY3RsX2ZpbmRfbnVtaWQoY2FyZCwgaWQtPm51bWlkKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5jb250cm9scykgewotCQlrY3RsID0gc25kX2tjb250cm9sKGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoa2N0bCwgJmNhcmQtPmNvbnRyb2xzLCBsaXN0KSB7CiAJCWlmIChrY3RsLT5pZC5pZmFjZSAhPSBpZC0+aWZhY2UpCiAJCQljb250aW51ZTsKIAkJaWYgKGtjdGwtPmlkLmRldmljZSAhPSBpZC0+ZGV2aWNlKQpAQCAtMTE4Miw3ICsxMTY4LDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX2N0bF9maWxlICpjdGw7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9rY3RsX2lvY3RsICpwOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBfX3VzZXIgKmlwID0gYXJncDsKQEAgLTEyMzIsOCArMTIxNyw3IEBACiAjZW5kaWYKIAl9CiAJZG93bl9yZWFkKCZzbmRfaW9jdGxfcndzZW0pOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJnNuZF9jb250cm9sX2lvY3RscykgewotCQlwID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc25kX2tjdGxfaW9jdGwsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnNuZF9jb250cm9sX2lvY3RscywgbGlzdCkgewogCQllcnIgPSBwLT5maW9jdGwoY2FyZCwgY3RsLCBjbWQsIGFyZyk7CiAJCWlmIChlcnIgIT0gLUVOT0lPQ1RMQ01EKSB7CiAJCQl1cF9yZWFkKCZzbmRfaW9jdGxfcndzZW0pOwpAQCAtMTM1NywxMyArMTM0MSwxMSBAQAogc3RhdGljIGludCBfc25kX2N0bF91bnJlZ2lzdGVyX2lvY3RsKHNuZF9rY3RsX2lvY3RsX2Z1bmNfdCBmY24sCiAJCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0cykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBzbmRfa2N0bF9pb2N0bCAqcDsKIAogCXNuZF9hc3NlcnQoZmNuICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKIAlkb3duX3dyaXRlKCZzbmRfaW9jdGxfcndzZW0pOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgbGlzdHMpIHsKLQkJcCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHNuZF9rY3RsX2lvY3RsLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3RzLCBsaXN0KSB7CiAJCWlmIChwLT5maW9jdGwgPT0gZmNuKSB7CiAJCQlsaXN0X2RlbCgmcC0+bGlzdCk7CiAJCQl1cF93cml0ZSgmc25kX2lvY3RsX3J3c2VtKTsKQEAgLTE0NTMsNyArMTQzNSw2IEBACiBzdGF0aWMgaW50IHNuZF9jdGxfZGV2X2Rpc2Nvbm5lY3Qoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZpY2UtPmRldmljZV9kYXRhOwotCXN0cnVjdCBsaXN0X2hlYWQgKmZsaXN0OwogCXN0cnVjdCBzbmRfY3RsX2ZpbGUgKmN0bDsKIAlpbnQgZXJyLCBjYXJkbnVtOwogCkBAIC0xNDYyLDggKzE0NDMsNyBAQAogCXNuZF9hc3NlcnQoY2FyZG51bSA+PSAwICYmIGNhcmRudW0gPCBTTkRSVl9DQVJEUywgcmV0dXJuIC1FTlhJTyk7CiAKIAlkb3duX3JlYWQoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKLQlsaXN0X2Zvcl9lYWNoKGZsaXN0LCAmY2FyZC0+Y3RsX2ZpbGVzKSB7Ci0JCWN0bCA9IHNuZF9jdGxfZmlsZShmbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdGwsICZjYXJkLT5jdGxfZmlsZXMsIGxpc3QpIHsKIAkJd2FrZV91cCgmY3RsLT5jaGFuZ2Vfc2xlZXApOwogCQlraWxsX2Zhc3luYygmY3RsLT5mYXN5bmMsIFNJR0lPLCBQT0xMX0VSUik7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jIGIvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jCmluZGV4IGFiNDg5NjIuLjkzMTFjYTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvY29udHJvbF9jb21wYXQuYworKysgYi9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMKQEAgLTM5Miw3ICszOTIsNyBAQAogc3RhdGljIGlubGluZSBsb25nIHNuZF9jdGxfaW9jdGxfY29tcGF0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3Qgc25kX2N0bF9maWxlICpjdGw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3Qgc25kX2tjdGxfaW9jdGwgKnA7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSBjb21wYXRfcHRyKGFyZyk7CiAJaW50IGVycjsKIApAQCAtNDI3LDggKzQyNyw3IEBACiAJfQogCiAJZG93bl9yZWFkKCZzbmRfaW9jdGxfcndzZW0pOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJnNuZF9jb250cm9sX2NvbXBhdF9pb2N0bHMpIHsKLQkJc3RydWN0IHNuZF9rY3RsX2lvY3RsICpwID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc25kX2tjdGxfaW9jdGwsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnNuZF9jb250cm9sX2NvbXBhdF9pb2N0bHMsIGxpc3QpIHsKIAkJaWYgKHAtPmZpb2N0bCkgewogCQkJZXJyID0gcC0+ZmlvY3RsKGN0bC0+Y2FyZCwgY3RsLCBjbWQsIGFyZyk7CiAJCQlpZiAoZXJyICE9IC1FTk9JT0NUTENNRCkgewpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9kZXZpY2UuYyBiL3NvdW5kL2NvcmUvZGV2aWNlLmMKaW5kZXggY2NiMjU4MS4uNTg1OGIwMiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL2RldmljZS5jCkBAIC03OSwxMyArNzksMTEgQEAKICAqLwogaW50IHNuZF9kZXZpY2VfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKIAkKIAlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CiAJc25kX2Fzc2VydChkZXZpY2VfZGF0YSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChkZXYtPmRldmljZV9kYXRhICE9IGRldmljZV9kYXRhKQogCQkJY29udGludWU7CiAJCS8qIHVubGluayAqLwpAQCAtMTI0LDEzICsxMjIsMTEgQEAKICAqLwogaW50IHNuZF9kZXZpY2VfZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKIAogCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKIAlzbmRfYXNzZXJ0KGRldmljZV9kYXRhICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmRldmljZXMpIHsKLQkJZGV2ID0gc25kX2RldmljZShsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKIAkJaWYgKGRldi0+ZGV2aWNlX2RhdGEgIT0gZGV2aWNlX2RhdGEpCiAJCQljb250aW51ZTsKIAkJaWYgKGRldi0+c3RhdGUgPT0gU05EUlZfREVWX1JFR0lTVEVSRUQgJiYKQEAgLTE2MSwxNCArMTU3LDEyIEBACiAgKi8KIGludCBzbmRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgdm9pZCAqZGV2aWNlX2RhdGEpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OwogCWludCBlcnI7CiAKIAlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CiAJc25kX2Fzc2VydChkZXZpY2VfZGF0YSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChkZXYtPmRldmljZV9kYXRhICE9IGRldmljZV9kYXRhKQogCQkJY29udGludWU7CiAJCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9CVUlMRCAmJiBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKSB7CkBAIC0xOTIsMTMgKzE4NiwxMSBAQAogICovCiBpbnQgc25kX2RldmljZV9yZWdpc3Rlcl9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IHNuZF9kZXZpY2UgKmRldjsKIAlpbnQgZXJyOwogCQogCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChkZXYtPnN0YXRlID09IFNORFJWX0RFVl9CVUlMRCAmJiBkZXYtPm9wcy0+ZGV2X3JlZ2lzdGVyKSB7CiAJCQlpZiAoKGVyciA9IGRldi0+b3BzLT5kZXZfcmVnaXN0ZXIoZGV2KSkgPCAwKQogCQkJCXJldHVybiBlcnI7CkBAIC0yMTUsMTIgKzIwNywxMCBAQAogaW50IHNuZF9kZXZpY2VfZGlzY29ubmVjdF9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlpbnQgZXJyID0gMDsKIAogCXNuZF9hc3NlcnQoY2FyZCAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHNuZF9kZXZpY2UobGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChzbmRfZGV2aWNlX2Rpc2Nvbm5lY3QoY2FyZCwgZGV2LT5kZXZpY2VfZGF0YSkgPCAwKQogCQkJZXJyID0gLUVOWElPOwogCX0KQEAgLTIzNCw3ICsyMjQsNiBAQAogaW50IHNuZF9kZXZpY2VfZnJlZV9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzbmRfZGV2aWNlX2NtZF90IGNtZCkKIHsKIAlzdHJ1Y3Qgc25kX2RldmljZSAqZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBpbnQgcmFuZ2VfbG93LCByYW5nZV9oaWdoOwogCkBAIC0yNDIsOCArMjMxLDcgQEAKIAlyYW5nZV9sb3cgPSBjbWQgKiBTTkRSVl9ERVZfVFlQRV9SQU5HRV9TSVpFOwogCXJhbmdlX2hpZ2ggPSByYW5nZV9sb3cgKyBTTkRSVl9ERVZfVFlQRV9SQU5HRV9TSVpFIC0gMTsKICAgICAgIF9fYWdhaW46Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmY2FyZC0+ZGV2aWNlcykgewotCQlkZXYgPSBzbmRfZGV2aWNlKGxpc3QpOwkJCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjYXJkLT5kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChkZXYtPnR5cGUgPj0gcmFuZ2VfbG93ICYmIGRldi0+dHlwZSA8PSByYW5nZV9oaWdoKSB7CiAJCQlpZiAoKGVyciA9IHNuZF9kZXZpY2VfZnJlZShjYXJkLCBkZXYtPmRldmljZV9kYXRhKSkgPCAwKQogCQkJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2h3ZGVwLmMgYi9zb3VuZC9jb3JlL2h3ZGVwLmMKaW5kZXggNDZiNDc2OC4uMzljMDNmMyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9od2RlcC5jCisrKyBiL3NvdW5kL2NvcmUvaHdkZXAuYwpAQCAtNDcsMTQgKzQ3LDExIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2h3ZGVwICpzbmRfaHdkZXBfc2VhcmNoKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldmljZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmc25kX2h3ZGVwX2RldmljZXMpIHsKLQkJaHdkZXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfaHdkZXAsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaHdkZXAsICZzbmRfaHdkZXBfZGV2aWNlcywgbGlzdCkKIAkJaWYgKGh3ZGVwLT5jYXJkID09IGNhcmQgJiYgaHdkZXAtPmRldmljZSA9PSBkZXZpY2UpCiAJCQlyZXR1cm4gaHdkZXA7Ci0JfQogCXJldHVybiBOVUxMOwogfQogCkBAIC0xNTksMTUgKzE1NiwxNiBAQAogCWludCBlcnIgPSAtRU5YSU87CiAJc3RydWN0IHNuZF9od2RlcCAqaHcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG1vZHVsZSAqbW9kID0gaHctPmNhcmQtPm1vZHVsZTsKKwogCW11dGV4X2xvY2soJmh3LT5vcGVuX211dGV4KTsKLQlpZiAoaHctPm9wcy5yZWxlYXNlKSB7CisJaWYgKGh3LT5vcHMucmVsZWFzZSkKIAkJZXJyID0gaHctPm9wcy5yZWxlYXNlKGh3LCBmaWxlKTsKLQkJd2FrZV91cCgmaHctPm9wZW5fd2FpdCk7Ci0JfQogCWlmIChody0+dXNlZCA+IDApCiAJCWh3LT51c2VkLS07Ci0Jc25kX2NhcmRfZmlsZV9yZW1vdmUoaHctPmNhcmQsIGZpbGUpOwogCW11dGV4X3VubG9jaygmaHctPm9wZW5fbXV0ZXgpOworCXdha2VfdXAoJmh3LT5vcGVuX3dhaXQpOworCisJc25kX2NhcmRfZmlsZV9yZW1vdmUoaHctPmNhcmQsIGZpbGUpOwogCW1vZHVsZV9wdXQobW9kKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNDY4LDE1ICs0NjYsMTIgQEAKIHN0YXRpYyB2b2lkIHNuZF9od2RlcF9wcm9jX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKIAkJCQlzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcDsKIAogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZzbmRfaHdkZXBfZGV2aWNlcykgewotCQlod2RlcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9od2RlcCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShod2RlcCwgJnNuZF9od2RlcF9kZXZpY2VzLCBsaXN0KQogCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDJpLSUwMmk6ICVzXG4iLAogCQkJICAgIGh3ZGVwLT5jYXJkLT5udW1iZXIsIGh3ZGVwLT5kZXZpY2UsIGh3ZGVwLT5uYW1lKTsKLQl9CiAJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5pdC5jIGIvc291bmQvY29yZS9pbml0LmMKaW5kZXggYTRjYzZiMS4uZGI2MTAzNyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbml0LmMKKysrIGIvc291bmQvY29yZS9pbml0LmMKQEAgLTExNCwyMiArMTE0LDI4IEBACiAJaWYgKGlkeCA8IDApIHsKIAkJaW50IGlkeDI7CiAJCWZvciAoaWR4MiA9IDA7IGlkeDIgPCBTTkRSVl9DQVJEUzsgaWR4MisrKQorCQkJLyogaWR4ID09IC0xID09IDB4ZmZmZiBtZWFuczogdGFrZSBhbnkgZnJlZSBzbG90ICovCiAJCQlpZiAofnNuZF9jYXJkc19sb2NrICYgaWR4ICYgMTw8aWR4MikgewogCQkJCWlkeCA9IGlkeDI7CiAJCQkJaWYgKGlkeCA+PSBzbmRfZWNhcmRzX2xpbWl0KQogCQkJCQlzbmRfZWNhcmRzX2xpbWl0ID0gaWR4ICsgMTsKIAkJCQlicmVhazsKIAkJCX0KLQl9IGVsc2UgaWYgKGlkeCA8IHNuZF9lY2FyZHNfbGltaXQpIHsKLQkJaWYgKHNuZF9jYXJkc19sb2NrICYgKDEgPDwgaWR4KSkKLQkJCWVyciA9IC1FTk9ERVY7CS8qIGludmFsaWQgKi8KLQl9IGVsc2UgaWYgKGlkeCA8IFNORFJWX0NBUkRTKQotCQlzbmRfZWNhcmRzX2xpbWl0ID0gaWR4ICsgMTsgLyogaW5jcmVhc2UgdGhlIGxpbWl0ICovCi0JZWxzZQotCQllcnIgPSAtRU5PREVWOworCX0gZWxzZSB7CisJCSBpZiAoaWR4IDwgc25kX2VjYXJkc19saW1pdCkgeworCQkJaWYgKHNuZF9jYXJkc19sb2NrICYgKDEgPDwgaWR4KSkKKwkJCQllcnIgPSAtRUJVU1k7CS8qIGludmFsaWQgKi8KKwkJfSBlbHNlIHsKKwkJCWlmIChpZHggPCBTTkRSVl9DQVJEUykKKwkJCQlzbmRfZWNhcmRzX2xpbWl0ID0gaWR4ICsgMTsgLyogaW5jcmVhc2UgdGhlIGxpbWl0ICovCisJCQllbHNlCisJCQkJZXJyID0gLUVOT0RFVjsKKwkJfQorCX0KIAlpZiAoaWR4IDwgMCB8fCBlcnIgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmc25kX2NhcmRfbXV0ZXgpOwotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgZmluZCB0aGUgc2xvdCBmb3IgaW5kZXggJWQgKHJhbmdlIDAtJWkpXG4iLCBpZHgsIHNuZF9lY2FyZHNfbGltaXQgLSAxKTsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGZpbmQgdGhlIHNsb3QgZm9yIGluZGV4ICVkIChyYW5nZSAwLSVpKSwgZXJyb3I6ICVkXG4iLAorCQkJIGlkeCwgc25kX2VjYXJkc19saW1pdCAtIDEsIGVycik7CiAJCWdvdG8gX19lcnJvcjsKIAl9CiAJc25kX2NhcmRzX2xvY2sgfD0gMSA8PCBpZHg7CQkvKiBsb2NrIGl0ICovCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21lbWFsbG9jLmMgYi9zb3VuZC9jb3JlL21lbWFsbG9jLmMKaW5kZXggYmMwYmQwOS4uZjA1NzQzMCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9tZW1hbGxvYy5jCisrKyBiL3NvdW5kL2NvcmUvbWVtYWxsb2MuYwpAQCAtNDA2LDE5ICs0MDYsMTcgQEAKICAqLwogc2l6ZV90IHNuZF9kbWFfZ2V0X3Jlc2VydmVkX2J1ZihzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYWIsIHVuc2lnbmVkIGludCBpZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXN0cnVjdCBzbmRfbWVtX2xpc3QgKm1lbTsKIAogCXNuZF9hc3NlcnQoZG1hYiwgcmV0dXJuIDApOwogCiAJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmbWVtX2xpc3RfaGVhZCkgewotCQltZW0gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfbWVtX2xpc3QsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobWVtLCAmbWVtX2xpc3RfaGVhZCwgbGlzdCkgewogCQlpZiAobWVtLT5pZCA9PSBpZCAmJgogCQkgICAgKG1lbS0+YnVmZmVyLmRldi5kZXYgPT0gTlVMTCB8fCBkbWFiLT5kZXYuZGV2ID09IE5VTEwgfHwKIAkJICAgICAhIG1lbWNtcCgmbWVtLT5idWZmZXIuZGV2LCAmZG1hYi0+ZGV2LCBzaXplb2YoZG1hYi0+ZGV2KSkpKSB7CiAJCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkbWFiLT5kZXYuZGV2OwotCQkJbGlzdF9kZWwocCk7CisJCQlsaXN0X2RlbCgmbWVtLT5saXN0KTsKIAkJCSpkbWFiID0gbWVtLT5idWZmZXI7CiAJCQlpZiAoZG1hYi0+ZGV2LmRldiA9PSBOVUxMKQogCQkJCWRtYWItPmRldi5kZXYgPSBkZXY7CkBAIC00ODgsNyArNDg2LDYgQEAKIHsKIAlpbnQgbGVuID0gMDsKIAlsb25nIHBhZ2VzID0gc25kX2FsbG9jYXRlZF9wYWdlcyA+PiAoUEFHRV9TSElGVC0xMik7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX21lbV9saXN0ICptZW07CiAJaW50IGRldm5vOwogCXN0YXRpYyBjaGFyICp0eXBlc1tdID0geyAiVU5LTk9XTiIsICJDT05UIiwgIkRFViIsICJERVYtU0ciLCAiU0JVUyIgfTsKQEAgLTQ5OCw4ICs0OTUsNyBAQAogCQkJInBhZ2VzICA6ICVsaSBieXRlcyAoJWxpIHBhZ2VzIHBlciAlbGlrQilcbiIsCiAJCQlwYWdlcyAqIFBBR0VfU0laRSwgcGFnZXMsIFBBR0VfU0laRSAvIDEwMjQpOwogCWRldm5vID0gMDsKLQlsaXN0X2Zvcl9lYWNoKHAsICZtZW1fbGlzdF9oZWFkKSB7Ci0JCW1lbSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9tZW1fbGlzdCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtZW0sICZtZW1fbGlzdF9oZWFkLCBsaXN0KSB7CiAJCWRldm5vKys7CiAJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKIAkJCQkiYnVmZmVyICVkIDogSUQgJTA4eCA6IHR5cGUgJXNcbiIsCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21pc2MuYyBiL3NvdW5kL2NvcmUvbWlzYy5jCmluZGV4IDAzZmM3MTEuLjZkYjg2YTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvbWlzYy5jCisrKyBiL3NvdW5kL2NvcmUvbWlzYy5jCkBAIC03OCwzICs3OCwzMSBAQAogCiBFWFBPUlRfU1lNQk9MKHNuZF92ZXJib3NlX3ByaW50ZCk7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKy8qKgorICogc25kX3BjaV9xdWlya19sb29rdXAgLSBsb29rIHVwIGEgUENJIFNTSUQgcXVpcmsgbGlzdAorICogQHBjaTogcGNpX2RldiBoYW5kbGUKKyAqIEBsaXN0OiBxdWlyayBsaXN0LCB0ZXJtaW5hdGVkIGJ5IGEgbnVsbCBlbnRyeQorICoKKyAqIExvb2sgdGhyb3VnaCB0aGUgZ2l2ZW4gcXVpcmsgbGlzdCBhbmQgZmluZHMgYSBtYXRjaGluZyBlbnRyeQorICogd2l0aCB0aGUgc2FtZSBQQ0kgU1NJRC4gIFdoZW4gc3ViZGV2aWNlIGlzIDAsIGFsbCBzdWJkZXZpY2UKKyAqIHZhbHVlcyBtYXkgbWF0Y2guCisgKgorICogUmV0dXJucyB0aGUgbWF0Y2hlZCBlbnRyeSBwb2ludGVyLCBvciBOVUxMIGlmIG5vdGhpbmcgbWF0Y2hlZC4KKyAqLworY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKgorc25kX3BjaV9xdWlya19sb29rdXAoc3RydWN0IHBjaV9kZXYgKnBjaSwgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKmxpc3QpCit7CisJY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnE7CisKKwlmb3IgKHEgPSBsaXN0OyBxLT5zdWJ2ZW5kb3I7IHErKykKKwkJaWYgKHEtPnN1YnZlbmRvciA9PSBwY2ktPnN1YnN5c3RlbV92ZW5kb3IgJiYKKwkJICAgICghcS0+c3ViZGV2aWNlIHx8IHEtPnN1YmRldmljZSA9PSBwY2ktPnN1YnN5c3RlbV9kZXZpY2UpKQorCQkJcmV0dXJuIHE7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0woc25kX3BjaV9xdWlya19sb29rdXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbS5jIGIvc291bmQvY29yZS9wY20uYwppbmRleCA4ZTAxODk4Li4yNzQzNDE0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtLmMKQEAgLTQ1LDExICs0NSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbSAqc25kX3BjbV9zZWFyY2goc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2aWNlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF9wY21fZGV2aWNlcykgewotCQlwY20gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfcGNtLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjbSwgJnNuZF9wY21fZGV2aWNlcywgbGlzdCkgewogCQlpZiAocGNtLT5jYXJkID09IGNhcmQgJiYgcGNtLT5kZXZpY2UgPT0gZGV2aWNlKQogCQkJcmV0dXJuIHBjbTsKIAl9CkBAIC03ODIsNyArNzgwLDYgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOwogCXN0cnVjdCBzbmRfY3RsX2ZpbGUgKmtjdGw7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJaW50IHByZWZlcl9zdWJkZXZpY2UgPSAtMTsKIAlzaXplX3Qgc2l6ZTsKIApAQCAtNzk1LDggKzc5Miw3IEBACiAKIAljYXJkID0gcGNtLT5jYXJkOwogCWRvd25fcmVhZCgmY2FyZC0+Y29udHJvbHNfcndzZW0pOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmNhcmQtPmN0bF9maWxlcykgewotCQlrY3RsID0gc25kX2N0bF9maWxlKGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoa2N0bCwgJmNhcmQtPmN0bF9maWxlcywgbGlzdCkgewogCQlpZiAoa2N0bC0+cGlkID09IGN1cnJlbnQtPnBpZCkgewogCQkJcHJlZmVyX3N1YmRldmljZSA9IGtjdGwtPnByZWZlcl9wY21fc3ViZGV2aWNlOwogCQkJaWYgKHByZWZlcl9zdWJkZXZpY2UgIT0gLTEpCkBAIC05NDEsOSArOTM3LDEwIEBACiB7CiAJaW50IGNpZHgsIGVycjsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBzbmRfcGNtX25vdGlmeSAqbm90aWZ5OwogCWNoYXIgc3RyWzE2XTsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAlzbmRfYXNzZXJ0KHBjbSAhPSBOVUxMICYmIGRldmljZSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKIAltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CkBAIC05NjYsMTEgKzk2MywxOCBAQAogCQkJZGV2dHlwZSA9IFNORFJWX0RFVklDRV9UWVBFX1BDTV9DQVBUVVJFOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKChlcnIgPSBzbmRfcmVnaXN0ZXJfZGV2aWNlKGRldnR5cGUsIHBjbS0+Y2FyZCwKLQkJCQkJICAgICAgIHBjbS0+ZGV2aWNlLAotCQkJCQkgICAgICAgJnNuZF9wY21fZl9vcHNbY2lkeF0sCi0JCQkJCSAgICAgICBwY20sIHN0cikpIDwgMCkKLQkJeworCQkvKiBkZXZpY2UgcG9pbnRlciB0byB1c2UsIHBjbS0+ZGV2IHRha2VzIHByZWNlZGVuY2UgaWYKKwkJICogaXQgaXMgYXNzaWduZWQsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gY2FyZCdzIGRldmljZQorCQkgKiBpZiBwb3NzaWJsZSAqLworCQlkZXYgPSBwY20tPmRldjsKKwkJaWYgKCFkZXYpCisJCQlkZXYgPSBzbmRfY2FyZF9nZXRfZGV2aWNlX2xpbmsocGNtLT5jYXJkKTsKKwkJLyogcmVnaXN0ZXIgcGNtICovCisJCWVyciA9IHNuZF9yZWdpc3Rlcl9kZXZpY2VfZm9yX2RldihkZXZ0eXBlLCBwY20tPmNhcmQsCisJCQkJCQkgIHBjbS0+ZGV2aWNlLAorCQkJCQkJICAmc25kX3BjbV9mX29wc1tjaWR4XSwKKwkJCQkJCSAgcGNtLCBzdHIsIGRldik7CisJCWlmIChlcnIgPCAwKSB7CiAJCQlsaXN0X2RlbCgmcGNtLT5saXN0KTsKIAkJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQkJcmV0dXJuIGVycjsKQEAgLTk4MCwxMSArOTg0LDEwIEBACiAJCWZvciAoc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW2NpZHhdLnN1YnN0cmVhbTsgc3Vic3RyZWFtOyBzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQpCiAJCQlzbmRfcGNtX3RpbWVyX2luaXQoc3Vic3RyZWFtKTsKIAl9Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmc25kX3BjbV9ub3RpZnlfbGlzdCkgewotCQlzdHJ1Y3Qgc25kX3BjbV9ub3RpZnkgKm5vdGlmeTsKLQkJbm90aWZ5ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc25kX3BjbV9ub3RpZnksIGxpc3QpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShub3RpZnksICZzbmRfcGNtX25vdGlmeV9saXN0LCBsaXN0KQogCQlub3RpZnktPm5fcmVnaXN0ZXIocGNtKTsKLQl9CisKIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMjcsNyArMTAzMCw3IEBACiAKIGludCBzbmRfcGNtX25vdGlmeShzdHJ1Y3Qgc25kX3BjbV9ub3RpZnkgKm5vdGlmeSwgaW50IG5mcmVlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKIAogCXNuZF9hc3NlcnQobm90aWZ5ICE9IE5VTEwgJiYKIAkJICAgbm90aWZ5LT5uX3JlZ2lzdGVyICE9IE5VTEwgJiYKQEAgLTEwMzYsMTMgKzEwMzksMTIgQEAKIAltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJaWYgKG5mcmVlKSB7CiAJCWxpc3RfZGVsKCZub3RpZnktPmxpc3QpOwotCQlsaXN0X2Zvcl9lYWNoKHAsICZzbmRfcGNtX2RldmljZXMpCi0JCQlub3RpZnktPm5fdW5yZWdpc3RlcihsaXN0X2VudHJ5KHAsCi0JCQkJCQkJc3RydWN0IHNuZF9wY20sIGxpc3QpKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwY20sICZzbmRfcGNtX2RldmljZXMsIGxpc3QpCisJCQlub3RpZnktPm5fdW5yZWdpc3RlcihwY20pOwogCX0gZWxzZSB7CiAJCWxpc3RfYWRkX3RhaWwoJm5vdGlmeS0+bGlzdCwgJnNuZF9wY21fbm90aWZ5X2xpc3QpOwotCQlsaXN0X2Zvcl9lYWNoKHAsICZzbmRfcGNtX2RldmljZXMpCi0JCQlub3RpZnktPm5fcmVnaXN0ZXIobGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3BjbSwgbGlzdCkpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjbSwgJnNuZF9wY21fZGV2aWNlcywgbGlzdCkKKwkJCW5vdGlmeS0+bl9yZWdpc3RlcihwY20pOwogCX0KIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlyZXR1cm4gMDsKQEAgLTEwNTgsMTIgKzEwNjAsMTAgQEAKIHN0YXRpYyB2b2lkIHNuZF9wY21fcHJvY19yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCiAJCQkgICAgICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF9wY21fZGV2aWNlcykgewotCQlwY20gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfcGNtLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjbSwgJnNuZF9wY21fZGV2aWNlcywgbGlzdCkgewogCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDJpLSUwMmk6ICVzIDogJXMiLAogCQkJICAgIHBjbS0+Y2FyZC0+bnVtYmVyLCBwY20tPmRldmljZSwgcGNtLT5pZCwgcGNtLT5uYW1lKTsKIAkJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9saWIuYyBiL3NvdW5kL2NvcmUvcGNtX2xpYi5jCmluZGV4IGIzMzY3OTcuLjlmZWZjYWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX2xpYi5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX2xpYi5jCkBAIC03ODEsNiArNzgxLDExIEBACiB7CiAgICAgICAgIHVuc2lnbmVkIGludCBrOwogCWludCBjaGFuZ2VkID0gMDsKKworCWlmICghY291bnQpIHsKKwkJaS0+ZW1wdHkgPSAxOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjb3VudDsgaysrKSB7CiAJCWlmIChtYXNrICYmICEobWFzayAmICgxIDw8IGspKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbWVtb3J5LmMgYi9zb3VuZC9jb3JlL3BjbV9tZW1vcnkuYwppbmRleCBiZTAzMGNiLi45NWIxYjJmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9tZW1vcnkuYworKysgYi9zb3VuZC9jb3JlL3BjbV9tZW1vcnkuYwpAQCAtMTAxLDYgKzEwMSw4IEBACiB7CiAJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZG1hX2ZyZWUoc3Vic3RyZWFtKTsKICNpZmRlZiBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTCisJc25kX2luZm9fZnJlZV9lbnRyeShzdWJzdHJlYW0tPnByb2NfcHJlYWxsb2NfbWF4X2VudHJ5KTsKKwlzdWJzdHJlYW0tPnByb2NfcHJlYWxsb2NfbWF4X2VudHJ5ID0gTlVMTDsKIAlzbmRfaW5mb19mcmVlX2VudHJ5KHN1YnN0cmVhbS0+cHJvY19wcmVhbGxvY19lbnRyeSk7CiAJc3Vic3RyZWFtLT5wcm9jX3ByZWFsbG9jX2VudHJ5ID0gTlVMTDsKICNlbmRpZgpAQCAtMTQyLDYgKzE0NCwxOCBAQAogfQogCiAvKgorICogcmVhZCBjYWxsYmFjayBmb3IgcHJlYWxsb2NfbWF4IHByb2MgZmlsZQorICoKKyAqIHByaW50cyB0aGUgbWF4aW11bSBhbGxvd2VkIHNpemUgaW4ga0IuCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX21heF9wcm9jX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKKwkJCQkJCSAgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIlbHVcbiIsICh1bnNpZ25lZCBsb25nKSBzdWJzdHJlYW0tPmRtYV9tYXggLyAxMDI0KTsKK30KKworLyoKICAqIHdyaXRlIGNhbGxiYWNrIGZvciBwcmVhbGxvYyBwcm9jIGZpbGUKICAqCiAgKiBhY2NlcHRzIHRoZSBwcmVhbGxvY2F0aW9uIHNpemUgaW4ga0IuCkBAIC0yMDMsNiArMjE3LDE1IEBACiAJCX0KIAl9CiAJc3Vic3RyZWFtLT5wcm9jX3ByZWFsbG9jX2VudHJ5ID0gZW50cnk7CisJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KHN1YnN0cmVhbS0+cGNtLT5jYXJkLCAicHJlYWxsb2NfbWF4Iiwgc3Vic3RyZWFtLT5wcm9jX3Jvb3QpKSAhPSBOVUxMKSB7CisJCWVudHJ5LT5jLnRleHQucmVhZCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX21heF9wcm9jX3JlYWQ7CisJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBzdWJzdHJlYW07CisJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CisJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKKwkJCWVudHJ5ID0gTlVMTDsKKwkJfQorCX0KKwlzdWJzdHJlYW0tPnByb2NfcHJlYWxsb2NfbWF4X2VudHJ5ID0gZW50cnk7CiB9CiAKICNlbHNlIC8qICFDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTICovCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3Jhd21pZGkuYyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCmluZGV4IDBmMDU1YmYuLjdlNmNlZWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCkBAIC02MSwxNCArNjEsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfcmF3bWlkaSAqc25kX3Jhd21pZGlfc2VhcmNoKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldmljZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcmF3bWlkaTsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF9yYXdtaWRpX2RldmljZXMpIHsKLQkJcmF3bWlkaSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9yYXdtaWRpLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJhd21pZGksICZzbmRfcmF3bWlkaV9kZXZpY2VzLCBsaXN0KQogCQlpZiAocmF3bWlkaS0+Y2FyZCA9PSBjYXJkICYmIHJhd21pZGktPmRldmljZSA9PSBkZXZpY2UpCiAJCQlyZXR1cm4gcmF3bWlkaTsKLQl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM4OSw3ICszODYsNiBAQAogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcm1pZGk7CiAJc3RydWN0IHNuZF9yYXdtaWRpX2ZpbGUgKnJhd21pZGlfZmlsZTsKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBzbmRfY3RsX2ZpbGUgKmtjdGw7CiAKIAlpZiAobWFqID09IHNuZF9tYWpvcikgewpAQCAtNDI2LDggKzQyMiw3IEBACiAJd2hpbGUgKDEpIHsKIAkJc3ViZGV2aWNlID0gLTE7CiAJCWRvd25fcmVhZCgmY2FyZC0+Y29udHJvbHNfcndzZW0pOwotCQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZjYXJkLT5jdGxfZmlsZXMpIHsKLQkJCWtjdGwgPSBzbmRfY3RsX2ZpbGUobGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoa2N0bCwgJmNhcmQtPmN0bF9maWxlcywgbGlzdCkgewogCQkJaWYgKGtjdGwtPnBpZCA9PSBjdXJyZW50LT5waWQpIHsKIAkJCQlzdWJkZXZpY2UgPSBrY3RsLT5wcmVmZXJfcmF3bWlkaV9zdWJkZXZpY2U7CiAJCQkJaWYgKHN1YmRldmljZSAhPSAtMSkKQEAgLTU3NSw3ICs1NzAsNiBAQAogCXN0cnVjdCBzbmRfcmF3bWlkaSAqcm1pZGk7CiAJc3RydWN0IHNuZF9yYXdtaWRpX3N0ciAqcHN0cjsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW07Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlybWlkaSA9IHNuZF9yYXdtaWRpX3NlYXJjaChjYXJkLCBpbmZvLT5kZXZpY2UpOwpAQCAtNTg5LDggKzU4Myw3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCWlmIChpbmZvLT5zdWJkZXZpY2UgPj0gcHN0ci0+c3Vic3RyZWFtX2NvdW50KQogCQlyZXR1cm4gLUVOWElPOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJnBzdHItPnN1YnN0cmVhbXMpIHsKLQkJc3Vic3RyZWFtID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnN0cmVhbSwgJnBzdHItPnN1YnN0cmVhbXMsIGxpc3QpIHsKIAkJaWYgKCh1bnNpZ25lZCBpbnQpc3Vic3RyZWFtLT5udW1iZXIgPT0gaW5mby0+c3ViZGV2aWNlKQogCQkJcmV0dXJuIHNuZF9yYXdtaWRpX2luZm8oc3Vic3RyZWFtLCBpbmZvKTsKIAl9CkBAIC0xMzEzLDE0ICsxMzA2LDE0IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJc3RydWN0IHNuZF9yYXdtaWRpX3J1bnRpbWUgKnJ1bnRpbWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAogCXJtaWRpID0gZW50cnktPnByaXZhdGVfZGF0YTsKIAlzbmRfaXByaW50ZihidWZmZXIsICIlc1xuXG4iLCBybWlkaS0+bmFtZSk7CiAJbXV0ZXhfbG9jaygmcm1pZGktPm9wZW5fbXV0ZXgpOwogCWlmIChybWlkaS0+aW5mb19mbGFncyAmIFNORFJWX1JBV01JRElfSU5GT19PVVRQVVQpIHsKLQkJbGlzdF9mb3JfZWFjaChsaXN0LCAmcm1pZGktPnN0cmVhbXNbU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVUXS5zdWJzdHJlYW1zKSB7Ci0JCQlzdWJzdHJlYW0gPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0sIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnN0cmVhbSwKKwkJCQkgICAgJnJtaWRpLT5zdHJlYW1zW1NORFJWX1JBV01JRElfU1RSRUFNX09VVFBVVF0uc3Vic3RyZWFtcywKKwkJCQkgICAgbGlzdCkgewogCQkJc25kX2lwcmludGYoYnVmZmVyLAogCQkJCSAgICAiT3V0cHV0ICVkXG4iCiAJCQkJICAgICIgIFR4IGJ5dGVzICAgICA6ICVsdVxuIiwKQEAgLTEzMzksOCArMTMzMiw5IEBACiAJCX0KIAl9CiAJaWYgKHJtaWRpLT5pbmZvX2ZsYWdzICYgU05EUlZfUkFXTUlESV9JTkZPX0lOUFVUKSB7Ci0JCWxpc3RfZm9yX2VhY2gobGlzdCwgJnJtaWRpLT5zdHJlYW1zW1NORFJWX1JBV01JRElfU1RSRUFNX0lOUFVUXS5zdWJzdHJlYW1zKSB7Ci0JCQlzdWJzdHJlYW0gPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0sIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnN0cmVhbSwKKwkJCQkgICAgJnJtaWRpLT5zdHJlYW1zW1NORFJWX1JBV01JRElfU1RSRUFNX0lOUFVUXS5zdWJzdHJlYW1zLAorCQkJCSAgICBsaXN0KSB7CiAJCQlzbmRfaXByaW50ZihidWZmZXIsCiAJCQkJICAgICJJbnB1dCAlZFxuIgogCQkJCSAgICAiICBSeCBieXRlcyAgICAgOiAlbHVcbiIsCkBAIC0xNjI1LDEzICsxNjE5LDEwIEBACiB2b2lkIHNuZF9yYXdtaWRpX3NldF9vcHMoc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaSwgaW50IHN0cmVhbSwKIAkJCSBzdHJ1Y3Qgc25kX3Jhd21pZGlfb3BzICpvcHMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmcm1pZGktPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW1zKSB7Ci0JCXN1YnN0cmVhbSA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzdHJlYW0sICZybWlkaS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbXMsIGxpc3QpCiAJCXN1YnN0cmVhbS0+b3BzID0gb3BzOwotCX0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwppbmRleCA1MzJhNjYwLi5iYjlkZDlmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCkBAIC02NTksNyArNjU5LDYgQEAKIAlpbnQgZXJyID0gMCwgbnVtX2V2ID0gMDsKIAlzdHJ1Y3Qgc25kX3NlcV9ldmVudCBldmVudF9zYXZlZDsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqc3JjX3BvcnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNfaW5mbyAqZ3JwOwogCiAJc3JjX3BvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihjbGllbnQsIGV2ZW50LT5zb3VyY2UucG9ydCk7CkBAIC02NzQsOCArNjczLDcgQEAKIAkJcmVhZF9sb2NrKCZncnAtPmxpc3RfbG9jayk7CiAJZWxzZQogCQlkb3duX3JlYWQoJmdycC0+bGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmZ3JwLT5saXN0X2hlYWQpIHsKLQkJc3VicyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMsIHNyY19saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnMsICZncnAtPmxpc3RfaGVhZCwgc3JjX2xpc3QpIHsKIAkJZXZlbnQtPmRlc3QgPSBzdWJzLT5pbmZvLmRlc3Q7CiAJCWlmIChzdWJzLT5pbmZvLmZsYWdzICYgU05EUlZfU0VRX1BPUlRfU1VCU19USU1FU1RBTVApCiAJCQkvKiBjb252ZXJ0IHRpbWUgYWNjb3JkaW5nIHRvIGZsYWcgd2l0aCBzdWJzY3JpcHRpb24gKi8KQEAgLTcwOSwxNSArNzA3LDE0IEBACiB7CiAJaW50IG51bV9ldiA9IDAsIGVyciA9IDA7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpkZXN0X2NsaWVudDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0OwogCiAJZGVzdF9jbGllbnQgPSBnZXRfZXZlbnRfZGVzdF9jbGllbnQoZXZlbnQsIFNORFJWX1NFUV9GSUxURVJfQlJPQURDQVNUKTsKIAlpZiAoZGVzdF9jbGllbnQgPT0gTlVMTCkKIAkJcmV0dXJuIDA7IC8qIG5vIG1hdGNoaW5nIGRlc3RpbmF0aW9uICovCiAKIAlyZWFkX2xvY2soJmRlc3RfY2xpZW50LT5wb3J0c19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZkZXN0X2NsaWVudC0+cG9ydHNfbGlzdF9oZWFkKSB7Ci0JCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmZGVzdF9jbGllbnQtPnBvcnRzX2xpc3RfaGVhZCwgbGlzdCkgewogCQlldmVudC0+ZGVzdC5wb3J0ID0gcG9ydC0+YWRkci5wb3J0OwogCQkvKiBwYXNzIE5VTEwgYXMgc291cmNlIGNsaWVudCB0byBhdm9pZCBlcnJvciBib3VuY2UgKi8KIAkJZXJyID0gc25kX3NlcV9kZWxpdmVyX3NpbmdsZV9ldmVudChOVUxMLCBldmVudCwKQEAgLTI0NzMsMTEgKzI0NzAsMTAgQEAKIHN0YXRpYyB2b2lkIHNuZF9zZXFfaW5mb19kdW1wX3BvcnRzKHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlciwKIAkJCQkgICAgc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcDsKIAogCW11dGV4X2xvY2soJmNsaWVudC0+cG9ydHNfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2gobCwgJmNsaWVudC0+cG9ydHNfbGlzdF9oZWFkKSB7Ci0JCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xpZW50LT5wb3J0c19saXN0X2hlYWQsIGxpc3QpIHsKIAkJc25kX2lwcmludGYoYnVmZmVyLCAiICBQb3J0ICUzZCA6IFwiJXNcIiAoJWMlYyVjJWMpXG4iLAogCQkJICAgIHAtPmFkZHIucG9ydCwgcC0+bmFtZSwKIAkJCSAgICBGTEFHX1BFUk1fUkQocC0+Y2FwYWJpbGl0eSksCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMKaW5kZXggYjc5ZDAxMS4uMzc4NTJjZCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYwpAQCAtMTA2LDExICsxMDYsMTAgQEAKIHN0YXRpYyB2b2lkIHNuZF9zZXFfZGV2aWNlX2luZm8oc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKIAkJCQlzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKIAogCW11dGV4X2xvY2soJm9wc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChoZWFkLCAmb3BzbGlzdCkgewotCQlzdHJ1Y3Qgb3BzX2xpc3QgKm9wcyA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IG9wc19saXN0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJm9wc2xpc3QsIGxpc3QpIHsKIAkJc25kX2lwcmludGYoYnVmZmVyLCAic25kLSVzJXMlcyVzLCVkXG4iLAogCQkJCW9wcy0+aWQsCiAJCQkJb3BzLT5kcml2ZXIgJiBEUklWRVJfTE9BREVEID8gIixsb2FkZWQiIDogKG9wcy0+ZHJpdmVyID09IERSSVZFUl9FTVBUWSA/ICIsZW1wdHkiIDogIiIpLApAQCAtMTQzLDcgKzE0Miw3IEBACiB2b2lkIHNuZF9zZXFfZGV2aWNlX2xvYWRfZHJpdmVycyh2b2lkKQogewogI2lmZGVmIENPTkZJR19LTU9ECi0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKIAogCS8qIENhbGxpbmcgcmVxdWVzdF9tb2R1bGUgZHVyaW5nIG1vZHVsZV9pbml0KCkKIAkgKiBtYXkgY2F1c2UgYmxvY2tpbmcuCkBAIC0xNTUsOCArMTU0LDcgQEAKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmb3BzX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKGhlYWQsICZvcHNsaXN0KSB7Ci0JCXN0cnVjdCBvcHNfbGlzdCAqb3BzID0gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3Qgb3BzX2xpc3QsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkob3BzLCAmb3BzbGlzdCwgbGlzdCkgewogCQlpZiAoISAob3BzLT5kcml2ZXIgJiBEUklWRVJfTE9BREVEKSAmJgogCQkgICAgISAob3BzLT5kcml2ZXIgJiBEUklWRVJfUkVRVUVTVEVEKSkgewogCQkJb3BzLT51c2VkKys7CkBAIC0zMTQsOCArMzEyLDggQEAKIGludCBzbmRfc2VxX2RldmljZV9yZWdpc3Rlcl9kcml2ZXIoY2hhciAqaWQsIHN0cnVjdCBzbmRfc2VxX2Rldl9vcHMgKmVudHJ5LAogCQkJCSAgIGludCBhcmdzaXplKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IG9wc19saXN0ICpvcHM7CisJc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXY7CiAKIAlpZiAoaWQgPT0gTlVMTCB8fCBlbnRyeSA9PSBOVUxMIHx8CiAJICAgIGVudHJ5LT5pbml0X2RldmljZSA9PSBOVUxMIHx8IGVudHJ5LT5mcmVlX2RldmljZSA9PSBOVUxMKQpAQCAtMzQxLDggKzMzOSw3IEBACiAJb3BzLT5hcmdzaXplID0gYXJnc2l6ZTsKIAogCS8qIGluaXRpYWxpemUgZXhpc3RpbmcgZGV2aWNlcyBpZiBuZWNlc3NhcnkgKi8KLQlsaXN0X2Zvcl9lYWNoKGhlYWQsICZvcHMtPmRldl9saXN0KSB7Ci0JCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2ID0gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmb3BzLT5kZXZfbGlzdCwgbGlzdCkgewogCQlpbml0X2RldmljZShkZXYsIG9wcyk7CiAJfQogCW11dGV4X3VubG9jaygmb3BzLT5yZWdfbXV0ZXgpOwpAQCAtMzk0LDggKzM5MSw4IEBACiAgKi8KIGludCBzbmRfc2VxX2RldmljZV91bnJlZ2lzdGVyX2RyaXZlcihjaGFyICppZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwogCXN0cnVjdCBvcHNfbGlzdCAqb3BzOworCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2OwogCiAJb3BzID0gZmluZF9kcml2ZXIoaWQsIDApOwogCWlmIChvcHMgPT0gTlVMTCkKQEAgLTQxMSw4ICs0MDgsNyBAQAogCS8qIGNsb3NlIGFuZCByZWxlYXNlIGFsbCBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRyaXZlciAqLwogCW11dGV4X2xvY2soJm9wcy0+cmVnX211dGV4KTsKIAlvcHMtPmRyaXZlciB8PSBEUklWRVJfTE9DS0VEOyAvKiBkbyBub3QgcmVtb3ZlIHRoaXMgZHJpdmVyIHJlY3Vyc2l2ZWx5ICovCi0JbGlzdF9mb3JfZWFjaChoZWFkLCAmb3BzLT5kZXZfbGlzdCkgewotCQlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldiA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IHNuZF9zZXFfZGV2aWNlLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJm9wcy0+ZGV2X2xpc3QsIGxpc3QpIHsKIAkJZnJlZV9kZXZpY2UoZGV2LCBvcHMpOwogCX0KIApAQCAtNTEyLDExICs1MDgsMTAgQEAKICAqLwogc3RhdGljIHN0cnVjdCBvcHNfbGlzdCAqIGZpbmRfZHJpdmVyKGNoYXIgKmlkLCBpbnQgY3JlYXRlX2lmX2VtcHR5KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IG9wc19saXN0ICpvcHM7CiAKIAltdXRleF9sb2NrKCZvcHNfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2goaGVhZCwgJm9wc2xpc3QpIHsKLQkJc3RydWN0IG9wc19saXN0ICpvcHMgPSBsaXN0X2VudHJ5KGhlYWQsIHN0cnVjdCBvcHNfbGlzdCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZvcHNsaXN0LCBsaXN0KSB7CiAJCWlmIChzdHJjbXAob3BzLT5pZCwgaWQpID09IDApIHsKIAkJCW9wcy0+dXNlZCsrOwogCQkJbXV0ZXhfdW5sb2NrKCZvcHNfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYwppbmRleCA4YzY0YjU4Li5lZWZkMWNmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYwpAQCAtNTksMTQgKzU5LDEyIEBACiBzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqc25kX3NlcV9wb3J0X3VzZV9wdHIoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCiAJCQkJCQkgaW50IG51bSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0OwogCiAJaWYgKGNsaWVudCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlyZWFkX2xvY2soJmNsaWVudC0+cG9ydHNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmY2xpZW50LT5wb3J0c19saXN0X2hlYWQpIHsKLQkJcG9ydCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJmNsaWVudC0+cG9ydHNfbGlzdF9oZWFkLCBsaXN0KSB7CiAJCWlmIChwb3J0LT5hZGRyLnBvcnQgPT0gbnVtKSB7CiAJCQlpZiAocG9ydC0+Y2xvc2luZykKIAkJCQlicmVhazsgLyogZGVsZXRpbmcgbm93ICovCkBAIC04NSwxNCArODMsMTIgQEAKIAkJCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gKnBpbmZvKQogewogCWludCBudW07Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcG9ydCwgKmZvdW5kOwogCiAJbnVtID0gcGluZm8tPmFkZHIucG9ydDsKIAlmb3VuZCA9IE5VTEw7CiAJcmVhZF9sb2NrKCZjbGllbnQtPnBvcnRzX2xvY2spOwotCWxpc3RfZm9yX2VhY2gocCwgJmNsaWVudC0+cG9ydHNfbGlzdF9oZWFkKSB7Ci0JCXBvcnQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZjbGllbnQtPnBvcnRzX2xpc3RfaGVhZCwgbGlzdCkgewogCQlpZiAocG9ydC0+YWRkci5wb3J0IDwgbnVtKQogCQkJY29udGludWU7CiAJCWlmIChwb3J0LT5hZGRyLnBvcnQgPT0gbnVtKSB7CkBAIC0xMzEsOCArMTI3LDcgQEAKIAkJCQkJCWludCBwb3J0KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKm5ld19wb3J0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKm5ld19wb3J0LCAqcDsKIAlpbnQgbnVtID0gLTE7CiAJCiAJLyogc2FuaXR5IGNoZWNrICovCkBAIC0xNjEsMTUgKzE1NiwxNCBAQAogCW51bSA9IHBvcnQgPj0gMCA/IHBvcnQgOiAwOwogCW11dGV4X2xvY2soJmNsaWVudC0+cG9ydHNfbXV0ZXgpOwogCXdyaXRlX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5wb3J0c19sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaChsLCAmY2xpZW50LT5wb3J0c19saXN0X2hlYWQpIHsKLQkJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnAgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbGllbnQtPnBvcnRzX2xpc3RfaGVhZCwgbGlzdCkgewogCQlpZiAocC0+YWRkci5wb3J0ID4gbnVtKQogCQkJYnJlYWs7CiAJCWlmIChwb3J0IDwgMCkgLyogYXV0by1wcm9iZSBtb2RlICovCiAJCQludW0gPSBwLT5hZGRyLnBvcnQgKyAxOwogCX0KIAkvKiBpbnNlcnQgdGhlIG5ldyBwb3J0ICovCi0JbGlzdF9hZGRfdGFpbCgmbmV3X3BvcnQtPmxpc3QsIGwpOworCWxpc3RfYWRkX3RhaWwoJm5ld19wb3J0LT5saXN0LCAmcC0+bGlzdCk7CiAJY2xpZW50LT5udW1fcG9ydHMrKzsKIAluZXdfcG9ydC0+YWRkci5wb3J0ID0gbnVtOwkvKiBzdG9yZSB0aGUgcG9ydCBudW1iZXIgaW4gdGhlIHBvcnQgKi8KIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT5wb3J0c19sb2NrLCBmbGFncyk7CkBAIC0yNTEsOSArMjQ1LDkgQEAKIAkJCQlsaXN0X2RlbCgmc3Vicy0+ZGVzdF9saXN0KTsKIAkJCWVsc2UKIAkJCQlsaXN0X2RlbCgmc3Vicy0+c3JjX2xpc3QpOworCQkJdXBfd3JpdGUoJmFncnAtPmxpc3RfbXV0ZXgpOwogCQkJdW5zdWJzY3JpYmVfcG9ydChjLCBhcG9ydCwgYWdycCwgJnN1YnMtPmluZm8sIDEpOwogCQkJa2ZyZWUoc3Vicyk7Ci0JCQl1cF93cml0ZSgmYWdycC0+bGlzdF9tdXRleCk7CiAJCQlzbmRfc2VxX3BvcnRfdW5sb2NrKGFwb3J0KTsKIAkJCXNuZF9zZXFfY2xpZW50X3VubG9jayhjKTsKIAkJfQpAQCAtMjg3LDE2ICsyODEsMTQgQEAKIGludCBzbmRfc2VxX2RlbGV0ZV9wb3J0KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCBpbnQgcG9ydCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7Ci0Jc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKmZvdW5kID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqZm91bmQgPSBOVUxMLCAqcDsKIAogCW11dGV4X2xvY2soJmNsaWVudC0+cG9ydHNfbXV0ZXgpOwogCXdyaXRlX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5wb3J0c19sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaChsLCAmY2xpZW50LT5wb3J0c19saXN0X2hlYWQpIHsKLQkJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnAgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbGllbnQtPnBvcnRzX2xpc3RfaGVhZCwgbGlzdCkgewogCQlpZiAocC0+YWRkci5wb3J0ID09IHBvcnQpIHsKIAkJCS8qIG9rIGZvdW5kLiAgZGVsZXRlIGZyb20gdGhlIGxpc3QgYXQgZmlyc3QgKi8KLQkJCWxpc3RfZGVsKGwpOworCQkJbGlzdF9kZWwoJnAtPmxpc3QpOwogCQkJY2xpZW50LT5udW1fcG9ydHMtLTsKIAkJCWZvdW5kID0gcDsKIAkJCWJyZWFrOwpAQCAtMzE0LDcgKzMwNiw4IEBACiBpbnQgc25kX3NlcV9kZWxldGVfYWxsX3BvcnRzKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCBkZWxldGVkX2xpc3QsICpwLCAqbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGV0ZWRfbGlzdDsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcG9ydCwgKnRtcDsKIAkKIAkvKiBtb3ZlIHRoZSBwb3J0IGxpc3QgdG8gZGVsZXRlZF9saXN0LCBhbmQKIAkgKiBjbGVhciB0aGUgcG9ydCBsaXN0IGluIHRoZSBjbGllbnQgZGF0YS4KQEAgLTMzMSw5ICszMjQsOCBAQAogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnBvcnRzX2xvY2ssIGZsYWdzKTsKIAogCS8qIHJlbW92ZSBlYWNoIHBvcnQgaW4gZGVsZXRlZF9saXN0ICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZkZWxldGVkX2xpc3QpIHsKLQkJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnBvcnQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0LCBsaXN0KTsKLQkJbGlzdF9kZWwocCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcnQsIHRtcCwgJmRlbGV0ZWRfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmcG9ydC0+bGlzdCk7CiAJCXNuZF9zZXFfc3lzdGVtX2NsaWVudF9ldl9wb3J0X2V4aXQocG9ydC0+YWRkci5jbGllbnQsIHBvcnQtPmFkZHIucG9ydCk7CiAJCXBvcnRfZGVsZXRlKGNsaWVudCwgcG9ydCk7CiAJfQpAQCAtNTAwLDggKzQ5Miw3IEBACiB7CiAJc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzX2luZm8gKnNyYyA9ICZzcmNfcG9ydC0+Y19zcmM7CiAJc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzX2luZm8gKmRlc3QgPSAmZGVzdF9wb3J0LT5jX2Rlc3Q7Ci0Jc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMgKnN1YnM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqc3VicywgKnM7CiAJaW50IGVyciwgc3JjX2NhbGxlZCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXhjbHVzaXZlOwpAQCAtNTI1LDEzICs1MTYsMTEgQEAKIAkJaWYgKHNyYy0+ZXhjbHVzaXZlIHx8IGRlc3QtPmV4Y2x1c2l2ZSkKIAkJCWdvdG8gX19lcnJvcjsKIAkJLyogY2hlY2sgd2hldGhlciBhbHJlYWR5IGV4aXN0cyAqLwotCQlsaXN0X2Zvcl9lYWNoKHAsICZzcmMtPmxpc3RfaGVhZCkgewotCQkJc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMgKnMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzLCBzcmNfbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocywgJnNyYy0+bGlzdF9oZWFkLCBzcmNfbGlzdCkgewogCQkJaWYgKG1hdGNoX3N1YnNfaW5mbyhpbmZvLCAmcy0+aW5mbykpCiAJCQkJZ290byBfX2Vycm9yOwogCQl9Ci0JCWxpc3RfZm9yX2VhY2gocCwgJmRlc3QtPmxpc3RfaGVhZCkgewotCQkJc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMgKnMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzLCBkZXN0X2xpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZkZXN0LT5saXN0X2hlYWQsIGRlc3RfbGlzdCkgewogCQkJaWYgKG1hdGNoX3N1YnNfaW5mbyhpbmZvLCAmcy0+aW5mbykpCiAJCQkJZ290byBfX2Vycm9yOwogCQl9CkBAIC01ODIsNyArNTcxLDYgQEAKIAlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNfaW5mbyAqc3JjID0gJnNyY19wb3J0LT5jX3NyYzsKIAlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNfaW5mbyAqZGVzdCA9ICZkZXN0X3BvcnQtPmNfZGVzdDsKIAlzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqc3ViczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCWludCBlcnIgPSAtRU5PRU5UOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTU5MCw4ICs1NzgsNyBAQAogCWRvd25fd3JpdGVfbmVzdGVkKCZkZXN0LT5saXN0X211dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAKIAkvKiBsb29rIGZvciB0aGUgY29ubmVjdGlvbiAqLwotCWxpc3RfZm9yX2VhY2gocCwgJnNyYy0+bGlzdF9oZWFkKSB7Ci0JCXN1YnMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzLCBzcmNfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzLCAmc3JjLT5saXN0X2hlYWQsIHNyY19saXN0KSB7CiAJCWlmIChtYXRjaF9zdWJzX2luZm8oaW5mbywgJnN1YnMtPmluZm8pKSB7CiAJCQl3cml0ZV9sb2NrX2lycXNhdmUoJnNyYy0+bGlzdF9sb2NrLCBmbGFncyk7CiAJCQkvLyB3cml0ZV9sb2NrKCZkZXN0LT5saXN0X2xvY2spOyAgLy8gbm8gbG9jayB5ZXQKQEAgLTYyMCwxMiArNjA3LDEwIEBACiBzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqc25kX3NlcV9wb3J0X2dldF9zdWJzY3JpcHRpb24oc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzX2luZm8gKnNyY19ncnAsCiAJCQkJCQkJICBzdHJ1Y3Qgc25kX3NlcV9hZGRyICpkZXN0X2FkZHIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqcywgKmZvdW5kID0gTlVMTDsKIAogCWRvd25fcmVhZCgmc3JjX2dycC0+bGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmc3JjX2dycC0+bGlzdF9oZWFkKSB7Ci0JCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzLCBzcmNfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc3JjX2dycC0+bGlzdF9oZWFkLCBzcmNfbGlzdCkgewogCQlpZiAoYWRkcl9tYXRjaChkZXN0X2FkZHIsICZzLT5pbmZvLmRlc3QpKSB7CiAJCQlmb3VuZCA9IHM7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jCmluZGV4IDBjZmEwNmMuLjk3MmY5MzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3Zpcm1pZGkuYwpAQCAtODEsMTMgKzgxLDExIEBACiAJCQkJCSBzdHJ1Y3Qgc25kX3NlcV9ldmVudCAqZXYpCiB7CiAJc3RydWN0IHNuZF92aXJtaWRpICp2bWlkaTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXVuc2lnbmVkIGNoYXIgbXNnWzRdOwogCWludCBsZW47CiAKIAlyZWFkX2xvY2soJnJkZXYtPmZpbGVsaXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2gobGlzdCwgJnJkZXYtPmZpbGVsaXN0KSB7Ci0JCXZtaWRpID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc25kX3Zpcm1pZGksIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodm1pZGksICZyZGV2LT5maWxlbGlzdCwgbGlzdCkgewogCQlpZiAoIXZtaWRpLT50cmlnZ2VyKQogCQkJY29udGludWU7CiAJCWlmIChldi0+dHlwZSA9PSBTTkRSVl9TRVFfRVZFTlRfU1lTRVgpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc291bmQuYyBiL3NvdW5kL2NvcmUvc291bmQuYwppbmRleCA4MmE2MWM2Li40MDg0ZGUwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NvdW5kLmMKKysrIGIvc291bmQvY29yZS9zb3VuZC5jCkBAIC0yMTksMjYgKzIxOSwyNyBAQAogI2VuZGlmCiAKIC8qKgotICogc25kX3JlZ2lzdGVyX2RldmljZSAtIFJlZ2lzdGVyIHRoZSBBTFNBIGRldmljZSBmaWxlIGZvciB0aGUgY2FyZAorICogc25kX3JlZ2lzdGVyX2RldmljZV9mb3JfZGV2IC0gUmVnaXN0ZXIgdGhlIEFMU0EgZGV2aWNlIGZpbGUgZm9yIHRoZSBjYXJkCiAgKiBAdHlwZTogdGhlIGRldmljZSB0eXBlLCBTTkRSVl9ERVZJQ0VfVFlQRV9YWFgKICAqIEBjYXJkOiB0aGUgY2FyZCBpbnN0YW5jZQogICogQGRldjogdGhlIGRldmljZSBpbmRleAogICogQGZfb3BzOiB0aGUgZmlsZSBvcGVyYXRpb25zCiAgKiBAcHJpdmF0ZV9kYXRhOiB1c2VyIHBvaW50ZXIgZm9yIGZfb3BzLT5vcGVuKCkKICAqIEBuYW1lOiB0aGUgZGV2aWNlIGZpbGUgbmFtZQorICogQGRldmljZTogdGhlICZzdHJ1Y3QgZGV2aWNlIHRvIGxpbmsgdGhpcyBuZXcgZGV2aWNlIHRvCiAgKgogICogUmVnaXN0ZXJzIGFuIEFMU0EgZGV2aWNlIGZpbGUgZm9yIHRoZSBnaXZlbiBjYXJkLgogICogVGhlIG9wZXJhdG9ycyBoYXZlIHRvIGJlIHNldCBpbiByZWcgcGFyYW1ldGVyLgogICoKLSAqIFJldHJ1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKiBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLWludCBzbmRfcmVnaXN0ZXJfZGV2aWNlKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYsCi0JCQljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wcywgdm9pZCAqcHJpdmF0ZV9kYXRhLAotCQkJY29uc3QgY2hhciAqbmFtZSkKK2ludCBzbmRfcmVnaXN0ZXJfZGV2aWNlX2Zvcl9kZXYoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wcywKKwkJCQl2b2lkICpwcml2YXRlX2RhdGEsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCWludCBtaW5vcjsKIAlzdHJ1Y3Qgc25kX21pbm9yICpwcmVnOwotCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9IHNuZF9jYXJkX2dldF9kZXZpY2VfbGluayhjYXJkKTsKIAogCXNuZF9hc3NlcnQobmFtZSwgcmV0dXJuIC1FSU5WQUwpOwogCXByZWcgPSBrbWFsbG9jKHNpemVvZiAqcHJlZywgR0ZQX0tFUk5FTCk7CkBAIC0yNzIsNyArMjczLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfcmVnaXN0ZXJfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0woc25kX3JlZ2lzdGVyX2RldmljZV9mb3JfZGV2KTsKIAogLyogZmluZCB0aGUgbWF0Y2hpbmcgbWlub3IgcmVjb3JkCiAgKiByZXR1cm4gdGhlIGluZGV4IG9mIHNuZF9taW5vciwgb3IgLTEgaWYgbm90IGZvdW5kCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3RpbWVyLmMgYi9zb3VuZC9jb3JlL3RpbWVyLmMKaW5kZXggMTBhNzlhZS4uM2UwNjM4MyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS90aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvdGltZXIuYwpAQCAtMzUsOSArMzUsNiBAQAogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaWZkZWYgQ09ORklHX0tFUk5FTEQKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxkLmg+Ci0jZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NORF9IUEVUKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfSFBFVF9NT0RVTEUpCiAjZGVmaW5lIERFRkFVTFRfVElNRVJfTElNSVQgMwpAQCAtMTMwLDExICsxMjcsOCBAQAogc3RhdGljIHN0cnVjdCBzbmRfdGltZXIgKnNuZF90aW1lcl9maW5kKHN0cnVjdCBzbmRfdGltZXJfaWQgKnRpZCkKIHsKIAlzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lciA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF90aW1lcl9saXN0KSB7Ci0JCXRpbWVyID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3RpbWVyLCBkZXZpY2VfbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpbWVyLCAmc25kX3RpbWVyX2xpc3QsIGRldmljZV9saXN0KSB7CiAJCWlmICh0aW1lci0+dG1yX2NsYXNzICE9IHRpZC0+ZGV2X2NsYXNzKQogCQkJY29udGludWU7CiAJCWlmICgodGltZXItPnRtcl9jbGFzcyA9PSBTTkRSVl9USU1FUl9DTEFTU19DQVJEIHx8CkBAIC0xODQsMTMgKzE3OCwxMCBAQAogewogCXN0cnVjdCBzbmRfdGltZXIgKnRpbWVyOwogCXN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UgKm1hc3RlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcTsKIAogCS8qIEZJWE1FOiBpdCdzIHJlYWxseSBkdW1iIHRvIGxvb2sgdXAgYWxsIGVudHJpZXMuLiAqLwotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF90aW1lcl9saXN0KSB7Ci0JCXRpbWVyID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3RpbWVyLCBkZXZpY2VfbGlzdCk7Ci0JCWxpc3RfZm9yX2VhY2gocSwgJnRpbWVyLT5vcGVuX2xpc3RfaGVhZCkgewotCQkJbWFzdGVyID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBvcGVuX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIsICZzbmRfdGltZXJfbGlzdCwgZGV2aWNlX2xpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXN0ZXIsICZ0aW1lci0+b3Blbl9saXN0X2hlYWQsIG9wZW5fbGlzdCkgewogCQkJaWYgKHNsYXZlLT5zbGF2ZV9jbGFzcyA9PSBtYXN0ZXItPnNsYXZlX2NsYXNzICYmCiAJCQkgICAgc2xhdmUtPnNsYXZlX2lkID09IG1hc3Rlci0+c2xhdmVfaWQpIHsKIAkJCQlsaXN0X2RlbCgmc2xhdmUtPm9wZW5fbGlzdCk7CkBAIC0yMTQsMTYgKzIwNSwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBzbmRfdGltZXJfY2hlY2tfbWFzdGVyKHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UgKm1hc3RlcikKIHsKLQlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICpzbGF2ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKwlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICpzbGF2ZSwgKnRtcDsKIAogCS8qIGNoZWNrIGFsbCBwZW5kaW5nIHNsYXZlcyAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmc25kX3RpbWVyX3NsYXZlX2xpc3QpIHsKLQkJc2xhdmUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UsIG9wZW5fbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsYXZlLCB0bXAsICZzbmRfdGltZXJfc2xhdmVfbGlzdCwgb3Blbl9saXN0KSB7CiAJCWlmIChzbGF2ZS0+c2xhdmVfY2xhc3MgPT0gbWFzdGVyLT5zbGF2ZV9jbGFzcyAmJgogCQkgICAgc2xhdmUtPnNsYXZlX2lkID09IG1hc3Rlci0+c2xhdmVfaWQpIHsKLQkJCWxpc3RfZGVsKHApOwotCQkJbGlzdF9hZGRfdGFpbChwLCAmbWFzdGVyLT5zbGF2ZV9saXN0X2hlYWQpOworCQkJbGlzdF9tb3ZlX3RhaWwoJnNsYXZlLT5vcGVuX2xpc3QsICZtYXN0ZXItPnNsYXZlX2xpc3RfaGVhZCk7CiAJCQlzcGluX2xvY2tfaXJxKCZzbGF2ZV9hY3RpdmVfbG9jayk7CiAJCQlzbGF2ZS0+bWFzdGVyID0gbWFzdGVyOwogCQkJc2xhdmUtPnRpbWVyID0gbWFzdGVyLT50aW1lcjsKQEAgLTMxNyw4ICszMDUsNyBAQAogaW50IHNuZF90aW1lcl9jbG9zZShzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aW1lcmkpCiB7CiAJc3RydWN0IHNuZF90aW1lciAqdGltZXIgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwotCXN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UgKnNsYXZlOworCXN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UgKnNsYXZlLCAqdG1wOwogCiAJc25kX2Fzc2VydCh0aW1lcmkgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CiAKQEAgLTM1MywxMiArMzQwLDExIEBACiAJCSAgICB0aW1lci0+aHcuY2xvc2UpCiAJCQl0aW1lci0+aHcuY2xvc2UodGltZXIpOwogCQkvKiByZW1vdmUgc2xhdmUgbGlua3MgKi8KLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZ0aW1lcmktPnNsYXZlX2xpc3RfaGVhZCkgewotCQkJc2xhdmUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UsIG9wZW5fbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbGF2ZSwgdG1wLCAmdGltZXJpLT5zbGF2ZV9saXN0X2hlYWQsCisJCQkJCSBvcGVuX2xpc3QpIHsKIAkJCXNwaW5fbG9ja19pcnEoJnNsYXZlX2FjdGl2ZV9sb2NrKTsKIAkJCV9zbmRfdGltZXJfc3RvcChzbGF2ZSwgMSwgU05EUlZfVElNRVJfRVZFTlRfUkVTT0xVVElPTik7Ci0JCQlsaXN0X2RlbChwKTsKLQkJCWxpc3RfYWRkX3RhaWwocCwgJnNuZF90aW1lcl9zbGF2ZV9saXN0KTsKKwkJCWxpc3RfbW92ZV90YWlsKCZzbGF2ZS0+b3Blbl9saXN0LCAmc25kX3RpbWVyX3NsYXZlX2xpc3QpOwogCQkJc2xhdmUtPm1hc3RlciA9IE5VTEw7CiAJCQlzbGF2ZS0+dGltZXIgPSBOVUxMOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZzbGF2ZV9hY3RpdmVfbG9jayk7CkBAIC0zOTQsNyArMzgwLDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgcmVzb2x1dGlvbiA9IDA7CiAJc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSAqdHM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbjsKIAlzdHJ1Y3QgdGltZXNwZWMgdHN0YW1wOwogCiAJZ2V0bnN0aW1lb2ZkYXkoJnRzdGFtcCk7CkBAIC00MTMsMTEgKzM5OCw5IEBACiAJaWYgKHRpbWVyLT5ody5mbGFncyAmIFNORFJWX1RJTUVSX0hXX1NMQVZFKQogCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVyLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaChuLCAmdGktPnNsYXZlX2FjdGl2ZV9oZWFkKSB7Ci0JCXRzID0gbGlzdF9lbnRyeShuLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBhY3RpdmVfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cywgJnRpLT5zbGF2ZV9hY3RpdmVfaGVhZCwgYWN0aXZlX2xpc3QpCiAJCWlmICh0cy0+Y2NhbGxiYWNrKQogCQkJdHMtPmNjYWxsYmFjayh0aSwgZXZlbnQgKyAxMDAsICZ0c3RhbXAsIHJlc29sdXRpb24pOwotCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lci0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC01OTMsMTAgKzU3Niw4IEBACiB7CiAJc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSAqdGk7CiAJdW5zaWduZWQgbG9uZyB0aWNrcyA9IH4wVUw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnRpbWVyLT5hY3RpdmVfbGlzdF9oZWFkKSB7Ci0JCXRpID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBhY3RpdmVfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aSwgJnRpbWVyLT5hY3RpdmVfbGlzdF9oZWFkLCBhY3RpdmVfbGlzdCkgewogCQlpZiAodGktPmZsYWdzICYgU05EUlZfVElNRVJfSUZMR19TVEFSVCkgewogCQkJdGktPmZsYWdzICY9IH5TTkRSVl9USU1FUl9JRkxHX1NUQVJUOwogCQkJdGktPmZsYWdzIHw9IFNORFJWX1RJTUVSX0lGTEdfUlVOTklORzsKQEAgLTY2MSw5ICs2NDIsOSBAQAogICovCiB2b2lkIHNuZF90aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHNuZF90aW1lciAqIHRpbWVyLCB1bnNpZ25lZCBsb25nIHRpY2tzX2xlZnQpCiB7Ci0Jc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSAqdGksICp0czsKKwlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aSwgKnRzLCAqdG1wOwogCXVuc2lnbmVkIGxvbmcgcmVzb2x1dGlvbiwgdGlja3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCwgKnEsICpuLCAqYWNrX2xpc3RfaGVhZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqYWNrX2xpc3RfaGVhZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB1c2VfdGFza2xldCA9IDA7CiAKQEAgLTY3OSwxMiArNjYwLDEyIEBACiAJCXJlc29sdXRpb24gPSB0aW1lci0+aHcucmVzb2x1dGlvbjsKIAogCS8qIGxvb3AgZm9yIGFsbCBhY3RpdmUgaW5zdGFuY2VzCi0JICogSGVyZSB3ZSBjYW5ub3QgdXNlIGxpc3RfZm9yX2VhY2ggYmVjYXVzZSB0aGUgYWN0aXZlX2xpc3Qgb2YgYQorCSAqIEhlcmUgd2UgY2Fubm90IHVzZSBsaXN0X2Zvcl9lYWNoX2VudHJ5IGJlY2F1c2UgdGhlIGFjdGl2ZV9saXN0IG9mIGEKIAkgKiBwcm9jZXNzZWQgaW5zdGFuY2UgaXMgcmVsaW5rZWQgdG8gZG9uZV9saXN0X2hlYWQgYmVmb3JlIHRoZSBjYWxsYmFjawogCSAqIGlzIGNhbGxlZC4KIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJnRpbWVyLT5hY3RpdmVfbGlzdF9oZWFkKSB7Ci0JCXRpID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBhY3RpdmVfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRpLCB0bXAsICZ0aW1lci0+YWN0aXZlX2xpc3RfaGVhZCwKKwkJCQkgYWN0aXZlX2xpc3QpIHsKIAkJaWYgKCEodGktPmZsYWdzICYgU05EUlZfVElNRVJfSUZMR19SVU5OSU5HKSkKIAkJCWNvbnRpbnVlOwogCQl0aS0+cHRpY2tzICs9IHRpY2tzX2xlZnQ7CkBAIC03MDAsNyArNjgxLDcgQEAKIAkJfSBlbHNlIHsKIAkJCXRpLT5mbGFncyAmPSB+U05EUlZfVElNRVJfSUZMR19SVU5OSU5HOwogCQkJaWYgKC0tdGltZXItPnJ1bm5pbmcpCi0JCQkJbGlzdF9kZWwocCk7CisJCQkJbGlzdF9kZWwoJnRpLT5hY3RpdmVfbGlzdCk7CiAJCX0KIAkJaWYgKCh0aW1lci0+aHcuZmxhZ3MgJiBTTkRSVl9USU1FUl9IV19UQVNLTEVUKSB8fAogCQkgICAgKHRpLT5mbGFncyAmIFNORFJWX1RJTUVSX0lGTEdfRkFTVCkpCkBAIC03MDksOCArNjkwLDcgQEAKIAkJCWFja19saXN0X2hlYWQgPSAmdGltZXItPnNhY2tfbGlzdF9oZWFkOwogCQlpZiAobGlzdF9lbXB0eSgmdGktPmFja19saXN0KSkKIAkJCWxpc3RfYWRkX3RhaWwoJnRpLT5hY2tfbGlzdCwgYWNrX2xpc3RfaGVhZCk7Ci0JCWxpc3RfZm9yX2VhY2gocSwgJnRpLT5zbGF2ZV9hY3RpdmVfaGVhZCkgewotCQkJdHMgPSBsaXN0X2VudHJ5KHEsIHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UsIGFjdGl2ZV9saXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cywgJnRpLT5zbGF2ZV9hY3RpdmVfaGVhZCwgYWN0aXZlX2xpc3QpIHsKIAkJCXRzLT5wdGlja3MgPSB0aS0+cHRpY2tzOwogCQkJdHMtPnJlc29sdXRpb24gPSByZXNvbHV0aW9uOwogCQkJaWYgKGxpc3RfZW1wdHkoJnRzLT5hY2tfbGlzdCkpCkBAIC04NDQsNyArODI0LDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lciA9IGRldi0+ZGV2aWNlX2RhdGE7CiAJc3RydWN0IHNuZF90aW1lciAqdGltZXIxOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKIAlzbmRfYXNzZXJ0KHRpbWVyICE9IE5VTEwgJiYgdGltZXItPmh3LnN0YXJ0ICE9IE5VTEwgJiYKIAkJICAgdGltZXItPmh3LnN0b3AgIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CkBAIC04NTMsOCArODMyLDcgQEAKIAkgICAgCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2gocCwgJnNuZF90aW1lcl9saXN0KSB7Ci0JCXRpbWVyMSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF90aW1lciwgZGV2aWNlX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIxLCAmc25kX3RpbWVyX2xpc3QsIGRldmljZV9saXN0KSB7CiAJCWlmICh0aW1lcjEtPnRtcl9jbGFzcyA+IHRpbWVyLT50bXJfY2xhc3MpCiAJCQlicmVhazsKIAkJaWYgKHRpbWVyMS0+dG1yX2NsYXNzIDwgdGltZXItPnRtcl9jbGFzcykKQEAgLTg3Nyw3ICs4NTUsNyBAQAogCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0JbGlzdF9hZGRfdGFpbCgmdGltZXItPmRldmljZV9saXN0LCBwKTsKKwlsaXN0X2FkZF90YWlsKCZ0aW1lci0+ZGV2aWNlX2xpc3QsICZ0aW1lcjEtPmRldmljZV9saXN0KTsKIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg5Niw3ICs4NzQsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyByZXNvbHV0aW9uID0gMDsKIAlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aSwgKnRzOwotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwogCiAJaWYgKCEgKHRpbWVyLT5ody5mbGFncyAmIFNORFJWX1RJTUVSX0hXX1NMQVZFKSkKIAkJcmV0dXJuOwpAQCAtOTExLDE1ICs4ODgsMTIgQEAKIAkJZWxzZQogCQkJcmVzb2x1dGlvbiA9IHRpbWVyLT5ody5yZXNvbHV0aW9uOwogCX0KLQlsaXN0X2Zvcl9lYWNoKHAsICZ0aW1lci0+YWN0aXZlX2xpc3RfaGVhZCkgewotCQl0aSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSwgYWN0aXZlX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGksICZ0aW1lci0+YWN0aXZlX2xpc3RfaGVhZCwgYWN0aXZlX2xpc3QpIHsKIAkJaWYgKHRpLT5jY2FsbGJhY2spCiAJCQl0aS0+Y2NhbGxiYWNrKHRpLCBldmVudCwgdHN0YW1wLCByZXNvbHV0aW9uKTsKLQkJbGlzdF9mb3JfZWFjaChuLCAmdGktPnNsYXZlX2FjdGl2ZV9oZWFkKSB7Ci0JCQl0cyA9IGxpc3RfZW50cnkobiwgc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSwgYWN0aXZlX2xpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRzLCAmdGktPnNsYXZlX2FjdGl2ZV9oZWFkLCBhY3RpdmVfbGlzdCkKIAkJCWlmICh0cy0+Y2NhbGxiYWNrKQogCQkJCXRzLT5jY2FsbGJhY2sodHMsIGV2ZW50LCB0c3RhbXAsIHJlc29sdXRpb24pOwotCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5sb2NrLCBmbGFncyk7CiB9CkBAIC0xMDU3LDExICsxMDMxLDkgQEAKIHsKIAlzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lcjsKIAlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcTsKIAogCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZzbmRfdGltZXJfbGlzdCkgewotCQl0aW1lciA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF90aW1lciwgZGV2aWNlX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXIsICZzbmRfdGltZXJfbGlzdCwgZGV2aWNlX2xpc3QpIHsKIAkJc3dpdGNoICh0aW1lci0+dG1yX2NsYXNzKSB7CiAJCWNhc2UgU05EUlZfVElNRVJfQ0xBU1NfR0xPQkFMOgogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiRyVpOiAiLCB0aW1lci0+dG1yX2RldmljZSk7CkBAIC0xMDg4LDE0ICsxMDYwLDEyIEBACiAJCWlmICh0aW1lci0+aHcuZmxhZ3MgJiBTTkRSVl9USU1FUl9IV19TTEFWRSkKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBTTEFWRSIpOwogCQlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOwotCQlsaXN0X2Zvcl9lYWNoKHEsICZ0aW1lci0+b3Blbl9saXN0X2hlYWQpIHsKLQkJCXRpID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlLCBvcGVuX2xpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpLCAmdGltZXItPm9wZW5fbGlzdF9oZWFkLCBvcGVuX2xpc3QpCiAJCQlzbmRfaXByaW50ZihidWZmZXIsICIgIENsaWVudCAlcyA6ICVzXG4iLAogCQkJCSAgICB0aS0+b3duZXIgPyB0aS0+b3duZXIgOiAidW5rbm93biIsCiAJCQkJICAgIHRpLT5mbGFncyAmIChTTkRSVl9USU1FUl9JRkxHX1NUQVJUIHwKIAkJCQkJCSBTTkRSVl9USU1FUl9JRkxHX1JVTk5JTkcpCiAJCQkJICAgID8gInJ1bm5pbmciIDogInN0b3BwZWQiKTsKLQkJfQogCX0KIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvS2NvbmZpZyBiL3NvdW5kL2RyaXZlcnMvS2NvbmZpZwppbmRleCA0MGViZDJmLi44MzUyOWIwIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL0tjb25maWcKKysrIGIvc291bmQvZHJpdmVycy9LY29uZmlnCkBAIC0xMDksNCArMTA5LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzbmQtbXB1NDAxLgogCitjb25maWcgU05EX1BPUlRNQU4yWDQKKwl0cmlzdGF0ZSAiUG9ydG1hbiAyeDQgZHJpdmVyIgorCWRlcGVuZHMgb24gU05EICYmIFBBUlBPUlQKKwlzZWxlY3QgU05EX1JBV01JREkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgTWlkaW1hbiBQb3J0bWFuIDJ4NCBwYXJhbGxlbAorCSAgcG9ydCBNSURJIGRldmljZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc25kLXBvcnRtYW4yeDQuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvTWFrZWZpbGUgYi9zb3VuZC9kcml2ZXJzL01ha2VmaWxlCmluZGV4IGM5YmFkNmQuLjA0MTEyNjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvc291bmQvZHJpdmVycy9NYWtlZmlsZQpAQCAtNiw2ICs2LDcgQEAKIHNuZC1kdW1teS1vYmpzIDo9IGR1bW15Lm8KIHNuZC1tdHBhdi1vYmpzIDo9IG10cGF2Lm8KIHNuZC1tdHM2NC1vYmpzIDo9IG10czY0Lm8KK3NuZC1wb3J0bWFuMng0LW9ianMgOj0gcG9ydG1hbjJ4NC5vCiBzbmQtc2VyaWFsLXUxNjU1MC1vYmpzIDo9IHNlcmlhbC11MTY1NTAubwogc25kLXZpcm1pZGktb2JqcyA6PSB2aXJtaWRpLm8KIApAQCAtMTUsNSArMTYsNiBAQAogb2JqLSQoQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwKSArPSBzbmQtc2VyaWFsLXUxNjU1MC5vCiBvYmotJChDT05GSUdfU05EX01UUEFWKSArPSBzbmQtbXRwYXYubwogb2JqLSQoQ09ORklHX1NORF9NVFM2NCkgKz0gc25kLW10czY0Lm8KK29iai0kKENPTkZJR19TTkRfUE9SVE1BTjJYNCkgKz0gc25kLXBvcnRtYW4yeDQubwogCiBvYmotJChDT05GSUdfU05EKSArPSBvcGwzLyBvcGw0LyBtcHU0MDEvIHZ4LwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9kdW1teS5jIGIvc291bmQvZHJpdmVycy9kdW1teS5jCmluZGV4IDQyMDAxZWYuLjgzMzliYWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvZHVtbXkuYworKysgYi9zb3VuZC9kcml2ZXJzL2R1bW15LmMKQEAgLTUwMSw3ICs1MDEsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9kdW1teSwgLTQ1MDAsIDMwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9kdW1teSwgLTQ1MDAsIDMwLCAwKTsKIAogI2RlZmluZSBEVU1NWV9DQVBTUkMoeG5hbWUsIHhpbmRleCwgYWRkcikgXAogeyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0geGluZGV4LCBcCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYyBiL3NvdW5kL2RyaXZlcnMvcG9ydG1hbjJ4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDg3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYwpAQCAtMCwwICsxLDg3NiBAQAorLyoKKyAqICAgRHJpdmVyIGZvciBNaWRpbWFuIFBvcnRtYW4yeDQgcGFyYWxsZWwgcG9ydCBtaWRpIGludGVyZmFjZQorICoKKyAqICAgQ29weXJpZ2h0IChjKSBieSBMZXZlbnQgR3VlbmRvZ2R1IDxsZXZvbkBmZWF0dXJlLWl0LmNvbT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogQ2hhbmdlTG9nCisgKiBKYW4gMjQgMjAwNyBNYXR0aGlhcyBLb2VuaWcgPG1rb2VuaWdAc3VzZS5kZT4KKyAqICAgICAgLSBjbGVhbnVwIGFuZCByZXdyaXRlCisgKiBTZXAgMzAgMjAwNCBUb2JpYXMgR2VocmlnIDx0b2JpYXNAZ2VocmlnLnRrPgorICogICAgICAtIHNvdXJjZSBjb2RlIGNsZWFudXAKKyAqIFNlcCAwMyAyMDA0IFRvYmlhcyBHZWhyaWcgPHRvYmlhc0BnZWhyaWcudGs+CisgKiAgICAgIC0gZml4ZWQgY29tcGlsYXRpb24gcHJvYmxlbSB3aXRoIGFsc2EgMS4wLjZhIChyZW1vdmVkIE1PRFVMRV9DTEFTU0VTLAorICogICAgICAgIE1PRFVMRV9QQVJNX1NZTlRBWCBhbmQgY2hhbmdlZCBNT0RVTEVfREVWSUNFUyB0bworICogICAgICAgIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKQorICogTWFyIDI0IDIwMDQgVG9iaWFzIEdlaHJpZyA8dG9iaWFzQGdlaHJpZy50az4KKyAqICAgICAgLSBhZGRlZCAyLjYga2VybmVsIHN1cHBvcnQKKyAqIE1hciAxOCAyMDA0IFRvYmlhcyBHZWhyaWcgPHRvYmlhc0BnZWhyaWcudGs+CisgKiAgICAgIC0gYWRkZWQgcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlciB0byB0aGUgc3RhcnR1cCByb3V0aW5lIGlmIHRoZSBkcml2ZXIgZmFpbHMgdG8gZGV0ZWN0IGEgcG9ydG1hbgorICogICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIGFsbCA0IG91dHB1dCBwb3J0cyBpbiBwb3J0bWFuX3B1dG1pZGkKKyAqIE1hciAxNyAyMDA0IFRvYmlhcyBHZWhyaWcgPHRvYmlhc0BnZWhyaWcudGs+CisgKiAgICAgIC0gYWRkZWQgY2hlY2tzIGZvciBvcGVuZWQgaW5wdXQgZGV2aWNlIGluIGludGVycnVwdCBoYW5kbGVyCisgKiBGZWIgMjAgMjAwNCBUb2JpYXMgR2VocmlnIDx0b2JpYXNAZ2VocmlnLnRrPgorICogICAgICAtIHBvcnRlZCBmcm9tIGFsc2EgMC41IHRvIDEuMAorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Jhd21pZGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisKKyNkZWZpbmUgQ0FSRF9OQU1FICJQb3J0bWFuIDJ4NCIKKyNkZWZpbmUgRFJJVkVSX05BTUUgInBvcnRtYW4iCisjZGVmaW5lIFBMQVRGT1JNX0RSSVZFUiAic25kX3BvcnRtYW4yeDQiCisKK3N0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdICA9IFNORFJWX0RFRkFVTFRfSURYOworc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSAgID0gU05EUlZfREVGQVVMVF9TVFI7CitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW1NORFJWX0NBUkRTXTsgCitzdGF0aWMgaW50IGRldmljZV9jb3VudDsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciAiIENBUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgIiBDQVJEX05BTUUgIiBzb3VuZGNhcmQuIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICIgQ0FSRF9OQU1FICIgc291bmRjYXJkLiIpOworCitNT0RVTEVfQVVUSE9SKCJMZXZlbnQgR3VlbmRvZ2R1LCBUb2JpYXMgR2VocmlnLCBNYXR0aGlhcyBLb2VuaWciKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWlkaW1hbiBQb3J0bWFuMng0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tNaWRpbWFuLFBvcnRtYW4yeDR9fSIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGlwIHNwZWNpZmljCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQT1JUTUFOX05VTV9JTlBVVF9QT1JUUyAyCisjZGVmaW5lIFBPUlRNQU5fTlVNX09VVFBVVF9QT1JUUyA0CisKK3N0cnVjdCBwb3J0bWFuIHsKKwlzcGlubG9ja190IHJlZ19sb2NrOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOworCXN0cnVjdCBwYXJkZXZpY2UgKnBhcmRldjsKKwlpbnQgcGFyZGV2X2NsYWltZWQ7CisKKwlpbnQgb3Blbl9jb3VudDsKKwlpbnQgbW9kZVtQT1JUTUFOX05VTV9JTlBVVF9QT1JUU107CisJc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqbWlkaV9pbnB1dFtQT1JUTUFOX05VTV9JTlBVVF9QT1JUU107Cit9OworCitzdGF0aWMgaW50IHBvcnRtYW5fZnJlZShzdHJ1Y3QgcG9ydG1hbiAqcG0pCit7CisJa2ZyZWUocG0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwb3J0bWFuX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIAorCQkJCSAgICBzdHJ1Y3QgcGFyZGV2aWNlICpwYXJkZXYsIAorCQkJCSAgICBzdHJ1Y3QgcG9ydG1hbiAqKnJjaGlwKQoreworCXN0cnVjdCBwb3J0bWFuICpwbTsKKworCSpyY2hpcCA9IE5VTEw7CisKKwlwbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwb3J0bWFuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBtID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEluaXQgY2hpcCBzcGVjaWZpYyBkYXRhICovCisJc3Bpbl9sb2NrX2luaXQoJnBtLT5yZWdfbG9jayk7CisJcG0tPmNhcmQgPSBjYXJkOworCXBtLT5wYXJkZXYgPSBwYXJkZXY7CisKKwkqcmNoaXAgPSBwbTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIVyByZWxhdGVkIGNvbnN0YW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU3RhbmRhcmQgUEMgcGFyYWxsZWwgcG9ydCBzdGF0dXMgcmVnaXN0ZXIgZXF1YXRlcy4gKi8KKyNkZWZpbmUJUFBfU1RBVF9CU1kgICAJMHg4MAkvKiBCdXN5IHN0YXR1cy4gIEludmVydGVkLiAqLworI2RlZmluZQlQUF9TVEFUX0FDSyAgIAkweDQwCS8qIEFja25vd2xlZGdlLiAgTm9uLUludmVydGVkLiAqLworI2RlZmluZQlQUF9TVEFUX1BPVVQgIAkweDIwCS8qIFBhcGVyIE91dC4gICAgTm9uLUludmVydGVkLiAqLworI2RlZmluZQlQUF9TVEFUX1NFTCAgIAkweDEwCS8qIFNlbGVjdC4gICAgICAgTm9uLUludmVydGVkLiAqLworI2RlZmluZQlQUF9TVEFUX0VSUiAgIAkweDA4CS8qIEVycm9yLiAgICAgICAgTm9uLUludmVydGVkLiAqLworCisvKiBTdGFuZGFyZCBQQyBwYXJhbGxlbCBwb3J0IGNvbW1hbmQgcmVnaXN0ZXIgZXF1YXRlcy4gKi8KKyNkZWZpbmUJUFBfQ01EX0lFTiAgCTB4MTAJLyogSVJRIEVuYWJsZS4gICBOb24tSW52ZXJ0ZWQuICovCisjZGVmaW5lCVBQX0NNRF9TRUxJIAkweDA4CS8qIFNlbGVjdCBJbnB1dC4gSW52ZXJ0ZWQuICovCisjZGVmaW5lCVBQX0NNRF9JTklUIAkweDA0CS8qIEluaXQgUHJpbnRlci4gTm9uLUludmVydGVkLiAqLworI2RlZmluZQlQUF9DTURfRkVFRCAJMHgwMgkvKiBBdXRvIEZlZWQuICAgIEludmVydGVkLiAqLworI2RlZmluZQlQUF9DTURfU1RCICAgICAgMHgwMQkvKiBTdHJvYmUuICAgICAgIEludmVydGVkLiAqLworCisvKiBQYXJhbGxlbCBQb3J0IENvbW1hbmQgUmVnaXN0ZXIgYXMgaW1wbGVtZW50ZWQgYnkgUENQMng0LiAqLworI2RlZmluZQlJTlRfRU4JIAlQUF9DTURfSUVOCS8qIEludGVycnVwdCBlbmFibGUuICovCisjZGVmaW5lCVNUUk9CRQkgICAgICAgIFBQX0NNRF9TVEIJLyogQ29tbWFuZCBzdHJvYmUuICovCisKKy8qIFRoZSBwYXJhbGxlbCBwb3J0IGNvbW1hbmQgcmVnaXN0ZXIgZmllbGQgKGIxLi5iMykgc2VsZWN0cyB0aGUgCisgKiB2YXJpb3VzICJyZWdpc3RlcnMiIHdpdGhpbiB0aGUgUEMvUCAyeDQuICBUaGVzZSBhcmUgdGhlIGludGVybmFsCisgKiBhZGRyZXNzIG9mIHRoZXNlICJyZWdpc3RlcnMiIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvIHRoZSBwYXJhbGxlbAorICogcG9ydCBjb21tYW5kIHJlZ2lzdGVyLgorICovCisjZGVmaW5lCVJYREFUQTAJCSgwIDw8IDEpCS8qIFBDUCBSeERhdGEgY2hhbm5lbCAwLiAqLworI2RlZmluZQlSWERBVEExCQkoMSA8PCAxKQkvKiBQQ1AgUnhEYXRhIGNoYW5uZWwgMS4gKi8KKyNkZWZpbmUJR0VOX0NUTAkJKDIgPDwgMSkJLyogUENQIEdlbmVyYWwgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUJU1lOQ19DVEwgCSgzIDw8IDEpCS8qIFBDUCBTeW5jIENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lCVRYREFUQTAJCSg0IDw8IDEpCS8qIFBDUCBUeERhdGEgY2hhbm5lbCAwLiAqLworI2RlZmluZQlUWERBVEExCQkoNSA8PCAxKQkvKiBQQ1AgVHhEYXRhIGNoYW5uZWwgMS4gKi8KKyNkZWZpbmUJVFhEQVRBMgkJKDYgPDwgMSkJLyogUENQIFR4RGF0YSBjaGFubmVsIDIuICovCisjZGVmaW5lCVRYREFUQTMJCSg3IDw8IDEpCS8qIFBDUCBUeERhdGEgY2hhbm5lbCAzLiAqLworCisvKiBQYXJhbGxlbCBQb3J0IFN0YXR1cyBSZWdpc3RlciBhcyBpbXBsZW1lbnRlZCBieSBQQ1AyeDQuICovCisjZGVmaW5lCUVTVEIJCVBQX1NUQVRfUE9VVAkvKiBFY2hvZWQgc3Ryb2JlLiAqLworI2RlZmluZQlJTlRfUkVRICAgICAgICAgUFBfU1RBVF9BQ0sJLyogSW5wdXQgZGF0YSBpbnQgcmVxdWVzdC4gKi8KKyNkZWZpbmUJQlVTWSAgICAgICAgICAgIFBQX1NUQVRfRVJSCS8qIEludGVyZmFjZSBCdXN5LiAqLworCisvKiBQYXJhbGxlbCBQb3J0IFN0YXR1cyBSZWdpc3RlciBCVVNZIGFuZCBTRUxFQ1QgbGluZXMgYXJlIG11bHRpcGxleGVkCisgKiBiZXR3ZWVuIHNldmVyYWwgZnVuY3Rpb25zLiAgRGVwZW5kaW5nIG9uIHdoaWNoIDJ4NCAicmVnaXN0ZXIiIGlzCisgKiBjdXJyZW50bHkgc2VsZWN0ZWQgKGIxLi5iMyksIHRoZSBCVVNZIGFuZCBTRUxFQ1QgbGluZXMgYXJlCisgKiBhc3NpZ25lZCBhcyBmb2xsb3dzOgorICoKKyAqICAgU0VMRUNUIExJTkU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzIEEyIEExCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLQorICovCisjZGVmaW5lCVJYQVZBSUwJCVBQX1NUQVRfU0VMCS8qIFJ4IEF2YWlsYWJsZSwgY2hhbm5lbCAwLiAgIDAgMCAwICovCisvLyAgUlhBVkFJTDEgICAgUFBfU1RBVF9TRUwgICAgICAgICAgICAgLyogUnggQXZhaWxhYmxlLCBjaGFubmVsIDEuICAgMCAwIDEgKi8KKyNkZWZpbmUJU1lOQ19TVEFUCVBQX1NUQVRfU0VMCS8qIFJlc2VydmVkIC0gU3luYyBTdGF0dXMuICAgIDAgMSAwICovCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgMCAxIDEgKi8KKyNkZWZpbmUJVFhFTVBUWQkJUFBfU1RBVF9TRUwJLyogVHggRW1wdHksIGNoYW5uZWwgMC4gICAgICAgMSAwIDAgKi8KKy8vICAgICAgVFhFTVBUWTEgICAgICAgIFBQX1NUQVRfU0VMICAgICAvKiBUeCBFbXB0eSwgY2hhbm5lbCAxLiAgICAgICAxIDAgMSAqLworLy8gIFRYRU1QVFkyICAgIFBQX1NUQVRfU0VMICAgICAgICAgICAgIC8qIFR4IEVtcHR5LCBjaGFubmVsIDIuICAgICAgIDEgMSAwICovCisvLyAgVFhFTVBUWTMgICAgUFBfU1RBVF9TRUwgICAgICAgICAgICAgLyogVHggRW1wdHksIGNoYW5uZWwgMy4gICAgICAgMSAxIDEgKi8KKworLyogICBCVVNZIExJTkU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTMgQTIgQTEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tCisgKi8KKyNkZWZpbmUJUlhEQVRBCQlQUF9TVEFUX0JTWQkvKiBSeCBJbnB1dCBEYXRhLCBjaGFubmVsIDAuICAwIDAgMCAqLworLy8gICAgICBSWERBVEExICAgICAgICAgUFBfU1RBVF9CU1kgICAgIC8qIFJ4IElucHV0IERhdGEsIGNoYW5uZWwgMS4gIDAgMCAxICovCisjZGVmaW5lCVNZTkNfREFUQSAgICAgICBQUF9TVEFUX0JTWQkvKiBSZXNlcnZlZCAtIFN5bmMgRGF0YS4gICAgICAwIDEgMCAqLworCQkJCQkvKiBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAwIDEgMSAqLworI2RlZmluZQlEQVRBX0VDSE8gICAgICAgUFBfU1RBVF9CU1kJLyogUGFyYWxsZWwgUG9ydCBEYXRhIEVjaG8uICAgMSAwIDAgKi8KKyNkZWZpbmUJQTBfRUNITyAgICAgICAgIFBQX1NUQVRfQlNZCS8qIEFkZHJlc3MgMCBFY2hvLiAgICAgICAgICAgIDEgMCAxICovCisjZGVmaW5lCUExX0VDSE8gICAgICAgICBQUF9TVEFUX0JTWQkvKiBBZGRyZXNzIDEgRWNoby4gICAgICAgICAgICAxIDEgMCAqLworI2RlZmluZQlBMl9FQ0hPICAgICAgICAgUFBfU1RBVF9CU1kJLyogQWRkcmVzcyAyIEVjaG8uICAgICAgICAgICAgMSAxIDEgKi8KKworI2RlZmluZSBQT1JUTUFOMlg0X01PREVfSU5QVVRfVFJJR0dFUkVECSAweDAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhhcmR3YXJlIHNwZWNpZmljIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwb3J0bWFuX3dyaXRlX2NvbW1hbmQoc3RydWN0IHBvcnRtYW4gKnBtLCB1OCB2YWx1ZSkKK3sKKwlwYXJwb3J0X3dyaXRlX2NvbnRyb2wocG0tPnBhcmRldi0+cG9ydCwgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHU4IHBvcnRtYW5fcmVhZF9jb21tYW5kKHN0cnVjdCBwb3J0bWFuICpwbSkKK3sKKwlyZXR1cm4gcGFycG9ydF9yZWFkX2NvbnRyb2wocG0tPnBhcmRldi0+cG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggcG9ydG1hbl9yZWFkX3N0YXR1cyhzdHJ1Y3QgcG9ydG1hbiAqcG0pCit7CisJcmV0dXJuIHBhcnBvcnRfcmVhZF9zdGF0dXMocG0tPnBhcmRldi0+cG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggcG9ydG1hbl9yZWFkX2RhdGEoc3RydWN0IHBvcnRtYW4gKnBtKQoreworCXJldHVybiBwYXJwb3J0X3JlYWRfZGF0YShwbS0+cGFyZGV2LT5wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBvcnRtYW5fd3JpdGVfZGF0YShzdHJ1Y3QgcG9ydG1hbiAqcG0sIHU4IHZhbHVlKQoreworCXBhcnBvcnRfd3JpdGVfZGF0YShwbS0+cGFyZGV2LT5wb3J0LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRtYW5fd3JpdGVfbWlkaShzdHJ1Y3QgcG9ydG1hbiAqcG0sIAorCQkJICAgICAgIGludCBwb3J0LCB1OCBtaWRpZGF0YSkKK3sKKwlpbnQgY29tbWFuZCA9ICgocG9ydCArIDQpIDw8IDEpOworCisJLyogR2V0IGVudGVyaW5nIGRhdGEgYnl0ZSBhbmQgcG9ydCBudW1iZXIgaW4gQkwgYW5kIEJIIHJlc3BlY3RpdmVseS4KKwkgKiBTZXQgdXAgVHggQ2hhbm5lbCBhZGRyZXNzIGZpZWxkIGZvciB1c2Ugd2l0aCBQUCBDbWQgUmVnaXN0ZXIuCisJICogU3RvcmUgYWRkcmVzcyBmaWVsZCBpbiBCSCByZWdpc3Rlci4KKwkgKiBJbnB1dHM6ICAgICAgQUggPSBPdXRwdXQgcG9ydCBudW1iZXIgKDAuLjMpLgorCSAqICAgICAgICAgICAgICBBTCA9IERhdGEgYnl0ZS4KKwkgKiAgICBjb21tYW5kID0gVFhEQVRBMCB8IElOVF9FTjsKKwkgKiBBbGlnbiBwb3J0IG51bSB3aXRoIGFkZHJlc3MgZmllbGQgKGIxLi4uYjMpLAorCSAqIHNldCBhZGRyZXNzIGZvciBUWERhdGF4LCBTdHJvYmU9MAorCSAqLworCWNvbW1hbmQgfD0gSU5UX0VOOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHNvIHRoYXQgdGhlIHByb2Nlc3MgaXMgbm90IGludGVycnVwdGVkLCB0aGVuIAorCSAqIHdyaXRlIHRoZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBUeCBjaGFubmVsIHRvIHRoZSAKKwkgKiBQUCBDb21tYW5kIFJlZy4gIERvIG5vdCBzZXQgdGhlIFN0cm9iZSBzaWduYWwgeWV0LgorCSAqLworCisJZG8geworCQlwb3J0bWFuX3dyaXRlX2NvbW1hbmQocG0sIGNvbW1hbmQpOworCisJCS8qIFdoaWxlIHRoZSBhZGRyZXNzIGxpbmVzIHNldHRsZSwgd3JpdGUgcGFyYWxsZWwgb3V0cHV0IGRhdGEgdG8gCisJCSAqIFBQIERhdGEgUmVnLiAgVGhpcyBoYXMgbm8gZWZmZWN0IHVudGlsIFN0cm9iZSBzaWduYWwgaXMgYXNzZXJ0ZWQuCisJCSAqLworCisJCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgbWlkaWRhdGEpOworCQkKKwkJLyogSWYgUENQIGNoYW5uZWwncyBUeEVtcHR5IGlzIHNldCAoVHhFbXB0eSBpcyByZWFkIHRocm91Z2ggdGhlIFBQCisJCSAqIFN0YXR1cyBSZWdpc3RlciksIHRoZW4gZ28gd3JpdGUgZGF0YS4gIEVsc2UgZ28gYmFjayBhbmQgd2FpdC4KKwkJICovCisJfSB3aGlsZSAoKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pICYgVFhFTVBUWSkgIT0gVFhFTVBUWSk7CisKKwkvKiBUeEVtcHR5IGlzIHNldC4gIE1haW50YWluIFBDL1AgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgYXNzZXJ0CisJICogU3Ryb2JlIHRocm91Z2ggdGhlIFBQIENvbW1hbmQgUmVnLiAgVGhpcyB3aWxsIFN0cm9iZSBkYXRhIGludG8KKwkgKiB0aGUgUEMvUCB0cmFuc21pdHRlciBhbmQgc2V0IHRoZSBQQy9QIEJVU1kgc2lnbmFsLgorCSAqLworCisJcG9ydG1hbl93cml0ZV9jb21tYW5kKHBtLCBjb21tYW5kIHwgU1RST0JFKTsKKworCS8qIFdhaXQgZm9yIHN0cm9iZSBsaW5lIHRvIHNldHRsZSBhbmQgZWNobyBiYWNrIHRocm91Z2ggaGFyZHdhcmUuCisJICogT25jZSBpdCBoYXMgZWNob2VkIGJhY2ssIGFzc3VtZSB0aGF0IHRoZSBhZGRyZXNzIGFuZCBkYXRhIGxpbmVzCisJICogaGF2ZSBzZXR0bGVkIQorCSAqLworCisJd2hpbGUgKChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSAmIEVTVEIpID09IDApCisJCWNwdV9yZWxheCgpOworCisJLyogUmVsZWFzZSBzdHJvYmUgYW5kIGltbWVkaWF0ZWx5IHJlLWFsbG93IGludGVycnVwdHMuICovCisJcG9ydG1hbl93cml0ZV9jb21tYW5kKHBtLCBjb21tYW5kKTsKKworCXdoaWxlICgocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgJiBFU1RCKSA9PSBFU1RCKQorCQljcHVfcmVsYXgoKTsKKworCS8qIFBDL1AgQlVTWSBpcyBub3cgc2V0LiAgV2UgbXVzdCB3YWl0IHVudGlsIEJVU1kgcmVzZXRzIGl0c2VsZi4KKwkgKiBXZSdsbCByZWVuYWJsZSBpbnRzIHdoaWxlIHdlJ3JlIHdhaXRpbmcuCisJICovCisKKwl3aGlsZSAoKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pICYgQlVTWSkgPT0gQlVTWSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiBEYXRhIHNlbnQuICovCit9CisKKworLyoKKyAqICBSZWFkIE1JREkgYnl0ZSBmcm9tIHBvcnQKKyAqICBBdHRlbXB0IHRvIHJlYWQgaW5wdXQgYnl0ZSBmcm9tIHNwZWNpZmllZCBoYXJkd2FyZSBpbnB1dCBwb3J0ICgwLi4pLgorICogIFJldHVybiAtMSBpZiBubyBkYXRhCisgKi8KK3N0YXRpYyBpbnQgcG9ydG1hbl9yZWFkX21pZGkoc3RydWN0IHBvcnRtYW4gKnBtLCBpbnQgcG9ydCkKK3sKKwl1bnNpZ25lZCBjaGFyIG1pZGlfZGF0YSA9IDA7CisJdW5zaWduZWQgY2hhciBjbWRvdXQ7CS8qIFNhdmVkIGFkZHJlc3MrSUUgYml0LiAqLworCisJLyogTWFrZSBzdXJlIGNsb2NraW5nIGVkZ2UgaXMgZG93biBiZWZvcmUgc3RhcnRpbmcuLi4gKi8KKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDApOwkvKiBNYWtlIHN1cmUgZWRnZSBpcyBkb3duLiAqLworCisJLyogU2V0IGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gUENQLiAqLworCWNtZG91dCA9IChwb3J0IDw8IDEpIHwgSU5UX0VOOwkvKiBBZGRyZXNzICsgSUUgKyBObyBTdHJvYmUuICovCisJcG9ydG1hbl93cml0ZV9jb21tYW5kKHBtLCBjbWRvdXQpOworCisJd2hpbGUgKChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSAmIEVTVEIpID09IEVTVEIpCisJCWNwdV9yZWxheCgpOwkvKiBXYWl0IGZvciBzdHJvYmUgZWNoby4gKi8KKworCS8qIEFmdGVyIHRoZSBhZGRyZXNzIGxpbmVzIHNldHRsZSwgY2hlY2sgbXVsdGlwbGV4ZWQgUnhBdmFpbCBzaWduYWwuCisJICogSWYgZGF0YSBpcyBhdmFpbGFibGUsIHJlYWQgaXQuCisJICovCisJaWYgKChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSAmIFJYQVZBSUwpID09IDApCisJCXJldHVybiAtMTsJLyogTm8gZGF0YS4gKi8KKworCS8qIFNldCB0aGUgU3Ryb2JlIHNpZ25hbCB0byBlbmFibGUgdGhlIFJ4IGNsb2NraW5nIGNpcmN1aXRyeS4gKi8KKwlwb3J0bWFuX3dyaXRlX2NvbW1hbmQocG0sIGNtZG91dCB8IFNUUk9CRSk7CS8qIFdyaXRlIGFkZHJlc3MrSUUrU3Ryb2JlLiAqLworCisJd2hpbGUgKChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSAmIEVTVEIpID09IDApCisJCWNwdV9yZWxheCgpOyAvKiBXYWl0IGZvciBzdHJvYmUgZWNoby4gKi8KKworCS8qIFRoZSBmaXJzdCBkYXRhIGJpdCAobXNiKSBpcyBhbHJlYWR5IHNpdHRpbmcgb24gdGhlIGlucHV0IGxpbmUuICovCisJbWlkaV9kYXRhID0gKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pICYgMTI4KTsKKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDEpOwkvKiBDYXVzZSByaXNpbmcgZWRnZSwgd2hpY2ggc2hpZnRzIGRhdGEuICovCisKKwkvKiBEYXRhIGJpdCA2LiAqLworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMCk7CS8qIENhdXNlIGZhbGxpbmcgZWRnZSB3aGlsZSBkYXRhIHNldHRsZXMuICovCisJbWlkaV9kYXRhIHw9IChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSA+PiAxKSAmIDY0OworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMSk7CS8qIENhdXNlIHJpc2luZyBlZGdlLCB3aGljaCBzaGlmdHMgZGF0YS4gKi8KKworCS8qIERhdGEgYml0IDUuICovCisJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAwKTsJLyogQ2F1c2UgZmFsbGluZyBlZGdlIHdoaWxlIGRhdGEgc2V0dGxlcy4gKi8KKwltaWRpX2RhdGEgfD0gKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pID4+IDIpICYgMzI7CisJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAxKTsJLyogQ2F1c2UgcmlzaW5nIGVkZ2UsIHdoaWNoIHNoaWZ0cyBkYXRhLiAqLworCisJLyogRGF0YSBiaXQgNC4gKi8KKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDApOwkvKiBDYXVzZSBmYWxsaW5nIGVkZ2Ugd2hpbGUgZGF0YSBzZXR0bGVzLiAqLworCW1pZGlfZGF0YSB8PSAocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgPj4gMykgJiAxNjsKKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDEpOwkvKiBDYXVzZSByaXNpbmcgZWRnZSwgd2hpY2ggc2hpZnRzIGRhdGEuICovCisKKwkvKiBEYXRhIGJpdCAzLiAqLworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMCk7CS8qIENhdXNlIGZhbGxpbmcgZWRnZSB3aGlsZSBkYXRhIHNldHRsZXMuICovCisJbWlkaV9kYXRhIHw9IChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSA+PiA0KSAmIDg7CisJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAxKTsJLyogQ2F1c2UgcmlzaW5nIGVkZ2UsIHdoaWNoIHNoaWZ0cyBkYXRhLiAqLworCisJLyogRGF0YSBiaXQgMi4gKi8KKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDApOwkvKiBDYXVzZSBmYWxsaW5nIGVkZ2Ugd2hpbGUgZGF0YSBzZXR0bGVzLiAqLworCW1pZGlfZGF0YSB8PSAocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgPj4gNSkgJiA0OworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMSk7CS8qIENhdXNlIHJpc2luZyBlZGdlLCB3aGljaCBzaGlmdHMgZGF0YS4gKi8KKworCS8qIERhdGEgYml0IDEuICovCisJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAwKTsJLyogQ2F1c2UgZmFsbGluZyBlZGdlIHdoaWxlIGRhdGEgc2V0dGxlcy4gKi8KKwltaWRpX2RhdGEgfD0gKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pID4+IDYpICYgMjsKKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDEpOwkvKiBDYXVzZSByaXNpbmcgZWRnZSwgd2hpY2ggc2hpZnRzIGRhdGEuICovCisKKwkvKiBEYXRhIGJpdCAwLiAqLworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMCk7CS8qIENhdXNlIGZhbGxpbmcgZWRnZSB3aGlsZSBkYXRhIHNldHRsZXMuICovCisJbWlkaV9kYXRhIHw9IChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSA+PiA3KSAmIDE7CisJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAxKTsJLyogQ2F1c2UgcmlzaW5nIGVkZ2UsIHdoaWNoIHNoaWZ0cyBkYXRhLiAqLworCXBvcnRtYW5fd3JpdGVfZGF0YShwbSwgMCk7CS8qIFJldHVybiBkYXRhIGNsb2NrIGxvdy4gKi8KKworCisJLyogRGUtYXNzZXJ0IFN0cm9iZSBhbmQgcmV0dXJuIGRhdGEuICovCisJcG9ydG1hbl93cml0ZV9jb21tYW5kKHBtLCBjbWRvdXQpOwkvKiBPdXRwdXQgc2F2ZWQgYWRkcmVzcytJRS4gKi8KKworCS8qIFdhaXQgZm9yIHN0cm9iZSBlY2hvLiAqLworCXdoaWxlICgocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgJiBFU1RCKSA9PSBFU1RCKQorCQljcHVfcmVsYXgoKTsKKworCXJldHVybiAobWlkaV9kYXRhICYgMjU1KTsJLyogU2hpZnQgYmFjayBhbmQgcmV0dXJuIHZhbHVlLiAqLworfQorCisvKgorICogIENoZWNrcyBpZiBhbnkgaW5wdXQgZGF0YSBvbiB0aGUgZ2l2ZW4gY2hhbm5lbCBpcyBhdmFpbGFibGUKKyAqICBDaGVja3MgUnhBdmFpbCAKKyAqLworc3RhdGljIGludCBwb3J0bWFuX2RhdGFfYXZhaWwoc3RydWN0IHBvcnRtYW4gKnBtLCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgY29tbWFuZCA9IElOVF9FTjsKKwlzd2l0Y2ggKGNoYW5uZWwpIHsKKwljYXNlIDA6CisJCWNvbW1hbmQgfD0gUlhEQVRBMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQljb21tYW5kIHw9IFJYREFUQTE7CisJCWJyZWFrOworCX0KKwkvKiBXcml0ZSBoYXJkd2FyZSAoYXNzdW1tZSBTVFJPQkU9MCkgKi8KKwlwb3J0bWFuX3dyaXRlX2NvbW1hbmQocG0sIGNvbW1hbmQpOworCS8qIENoZWNrIG11bHRpcGxleGVkIFJ4QXZhaWwgc2lnbmFsICovCisJaWYgKChwb3J0bWFuX3JlYWRfc3RhdHVzKHBtKSAmIFJYQVZBSUwpID09IFJYQVZBSUwpCisJCXJldHVybiAxOwkvKiBEYXRhIGF2YWlsYWJsZSAqLworCisJLyogTm8gRGF0YSBhdmFpbGFibGUgKi8KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogIEZsdXNoZXMgYW55IGlucHV0CisgKi8KK3N0YXRpYyB2b2lkIHBvcnRtYW5fZmx1c2hfaW5wdXQoc3RydWN0IHBvcnRtYW4gKnBtLCB1bnNpZ25lZCBjaGFyIHBvcnQpCit7CisJLyogTG9jYWwgdmFyaWFibGUgZm9yIGNvdW50aW5nIHRoaW5ncyAqLworCXVuc2lnbmVkIGludCBpID0gMDsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmQgPSAwOworCisJc3dpdGNoIChwb3J0KSB7CisJY2FzZSAwOgorCQljb21tYW5kID0gUlhEQVRBMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQljb21tYW5kID0gUlhEQVRBMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICJwb3J0bWFuX2ZsdXNoX2lucHV0KCkgV29uJ3QgZmx1c2ggcG9ydCAlaVxuIiwKKwkJCSAgIHBvcnQpOworCQlyZXR1cm47CisJfQorCisJLyogU2V0IGFkZHJlc3MgZm9yIHNwZWNpZmllZCBjaGFubmVsIGluIHBvcnQgYW5kIGFsbG93IHRvIHNldHRsZS4gKi8KKwlwb3J0bWFuX3dyaXRlX2NvbW1hbmQocG0sIGNvbW1hbmQpOworCisJLyogQXNzZXJ0IHRoZSBTdHJvYmUgYW5kIHdhaXQgZm9yIGVjaG8gYmFjay4gKi8KKwlwb3J0bWFuX3dyaXRlX2NvbW1hbmQocG0sIGNvbW1hbmQgfCBTVFJPQkUpOworCisJLyogV2FpdCBmb3IgRVNUQiAqLworCXdoaWxlICgocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgJiBFU1RCKSA9PSAwKQorCQljcHVfcmVsYXgoKTsKKworCS8qIE91dHB1dCBjbG9jayBjeWNsZXMgdG8gdGhlIFJ4IGNpcmN1aXRyeS4gKi8KKwlwb3J0bWFuX3dyaXRlX2RhdGEocG0sIDApOworCisJLyogRmx1c2ggMjUwIGJpdHMuLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjUwOyBpKyspIHsKKwkJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAxKTsKKwkJcG9ydG1hbl93cml0ZV9kYXRhKHBtLCAwKTsKKwl9CisKKwkvKiBEZWFzc2VydCB0aGUgU3Ryb2JlIHNpZ25hbCBvZiB0aGUgcG9ydCBhbmQgd2FpdCBmb3IgaXQgdG8gc2V0dGxlLiAqLworCXBvcnRtYW5fd3JpdGVfY29tbWFuZChwbSwgY29tbWFuZCB8IElOVF9FTik7CisKKwkvKiBXYWl0IGZvciBzZXR0bGluZyAqLworCXdoaWxlICgocG9ydG1hbl9yZWFkX3N0YXR1cyhwbSkgJiBFU1RCKSA9PSBFU1RCKQorCQljcHVfcmVsYXgoKTsKK30KKworc3RhdGljIGludCBwb3J0bWFuX3Byb2JlKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCS8qIEluaXRpYWxpemUgdGhlIHBhcmFsbGVsIHBvcnQgZGF0YSByZWdpc3Rlci4gIFdpbGwgc2V0IFJ4IGNsb2NrcworCSAqIGxvdyBpbiBjYXNlIHdlIGhhcHBlbiB0byBiZSBhZGRyZXNzaW5nIHRoZSBSeCBwb3J0cyBhdCB0aGlzIHRpbWUuCisJICovCisJLyogMSAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwLCAwKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHBhcmFsbGVsIHBvcnQgY29tbWFuZCByZWdpc3RlciwgdGh1cyBpbml0aWFsaXppbmcKKwkgKiBoYXJkd2FyZSBoYW5kc2hha2UgbGluZXMgdG8gbWlkaSBib3g6CisJICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJvYmUgPSAwCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJydXB0IEVuYWJsZSA9IDAgICAgICAgICAgICAKKwkgKi8KKwkvKiAyICovCisJcGFycG9ydF93cml0ZV9jb250cm9sKHAsIDApOworCisJLyogQ2hlY2sgaWYgUG9ydG1hbiBQQy9QIDJ4NCBpcyBvdXQgdGhlcmUuICovCisJLyogMyAqLworCXBhcnBvcnRfd3JpdGVfY29udHJvbChwLCBSWERBVEEwKTsJLyogV3JpdGUgU3Ryb2JlPTAgdG8gY29tbWFuZCByZWcuICovCisKKwkvKiBDaGVjayBmb3IgRVNUQiB0byBiZSBjbGVhciAqLworCS8qIDQgKi8KKwlpZiAoKHBhcnBvcnRfcmVhZF9zdGF0dXMocCkgJiBFU1RCKSA9PSBFU1RCKQorCQlyZXR1cm4gMTsJLyogQ09ERSAxIC0gU3Ryb2JlIEZhaWx1cmUuICovCisKKwkvKiBTZXQgZm9yIFJYREFUQTAgd2hlcmUgbm8gZGFtYWdlIHdpbGwgYmUgZG9uZS4gKi8KKwkvKiA1ICovCisJcGFycG9ydF93cml0ZV9jb250cm9sKHAsIFJYREFUQTAgKyBTVFJPQkUpOwkvKiBXcml0ZSBTdHJvYmU9MSB0byBjb21tYW5kIHJlZy4gKi8KKworCS8qIDYgKi8KKwlpZiAoKHBhcnBvcnRfcmVhZF9zdGF0dXMocCkgJiBFU1RCKSAhPSBFU1RCKQorCQlyZXR1cm4gMTsJLyogQ09ERSAxIC0gU3Ryb2JlIEZhaWx1cmUuICovCisKKwkvKiA3ICovCisJcGFycG9ydF93cml0ZV9jb250cm9sKHAsIDApOwkvKiBSZXNldCBTdHJvYmU9MC4gKi8KKworCS8qIENoZWNrIGlmIFR4IGNpcmN1aXRyeSBpcyBmdW5jdGlvbmluZyBwcm9wZXJseS4gIElmIGluaXRpYWxpemVkIAorCSAqIHVuaXQgVHhFbXB0eSBpcyBmYWxzZSwgc2VuZCBvdXQgY2hhciBhbmQgc2VlIGlmIGlmIGdvZXMgdHJ1ZS4KKwkgKi8KKwkvKiA4ICovCisJcGFycG9ydF93cml0ZV9jb250cm9sKHAsIFRYREFUQTApOwkvKiBUeCBjaGFubmVsIDAsIHN0cm9iZSBvZmYuICovCisKKwkvKiBJZiBQQ1AgY2hhbm5lbCdzIFR4RW1wdHkgaXMgc2V0IChUeEVtcHR5IGlzIHJlYWQgdGhyb3VnaCB0aGUgUFAKKwkgKiBTdGF0dXMgUmVnaXN0ZXIpLCB0aGVuIGdvIHdyaXRlIGRhdGEuICBFbHNlIGdvIGJhY2sgYW5kIHdhaXQuCisJICovCisJLyogOSAqLworCWlmICgocGFycG9ydF9yZWFkX3N0YXR1cyhwKSAmIFRYRU1QVFkpID09IDApCisJCXJldHVybiAyOworCisJLyogUmV0dXJuIE9LIHN0YXR1cy4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3J0bWFuX2RldmljZV9pbml0KHN0cnVjdCBwb3J0bWFuICpwbSkKK3sKKwlwb3J0bWFuX2ZsdXNoX2lucHV0KHBtLCAwKTsKKwlwb3J0bWFuX2ZsdXNoX2lucHV0KHBtLCAxKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYXdtaWRpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzbmRfcG9ydG1hbl9taWRpX29wZW4oc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9wb3J0bWFuX21pZGlfY2xvc2Uoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfcG9ydG1hbl9taWRpX2lucHV0X3RyaWdnZXIoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQkgICBpbnQgdXApCit7CisJc3RydWN0IHBvcnRtYW4gKnBtID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG0tPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKHVwKQorCQlwbS0+bW9kZVtzdWJzdHJlYW0tPm51bWJlcl0gfD0gUE9SVE1BTjJYNF9NT0RFX0lOUFVUX1RSSUdHRVJFRDsKKwllbHNlCisJCXBtLT5tb2RlW3N1YnN0cmVhbS0+bnVtYmVyXSAmPSB+UE9SVE1BTjJYNF9NT0RFX0lOUFVUX1RSSUdHRVJFRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbS0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc25kX3BvcnRtYW5fbWlkaV9vdXRwdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCSAgICBpbnQgdXApCit7CisJc3RydWN0IHBvcnRtYW4gKnBtID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBieXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBtLT5yZWdfbG9jaywgZmxhZ3MpOworCWlmICh1cCkgeworCQl3aGlsZSAoKHNuZF9yYXdtaWRpX3RyYW5zbWl0KHN1YnN0cmVhbSwgJmJ5dGUsIDEpID09IDEpKQorCQkJcG9ydG1hbl93cml0ZV9taWRpKHBtLCBzdWJzdHJlYW0tPm51bWJlciwgYnl0ZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtLT5yZWdfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9yYXdtaWRpX29wcyBzbmRfcG9ydG1hbl9taWRpX291dHB1dCA9IHsKKwkub3BlbiA9CQlzbmRfcG9ydG1hbl9taWRpX29wZW4sCisJLmNsb3NlID0Jc25kX3BvcnRtYW5fbWlkaV9jbG9zZSwKKwkudHJpZ2dlciA9CXNuZF9wb3J0bWFuX21pZGlfb3V0cHV0X3RyaWdnZXIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9yYXdtaWRpX29wcyBzbmRfcG9ydG1hbl9taWRpX2lucHV0ID0geworCS5vcGVuID0JCXNuZF9wb3J0bWFuX21pZGlfb3BlbiwKKwkuY2xvc2UgPQlzbmRfcG9ydG1hbl9taWRpX2Nsb3NlLAorCS50cmlnZ2VyID0Jc25kX3BvcnRtYW5fbWlkaV9pbnB1dF90cmlnZ2VyLAorfTsKKworLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSByYXdtaWRpIGNvbXBvbmVudCAqLworc3RhdGljIGludCBfX2RldmluaXQgc25kX3BvcnRtYW5fcmF3bWlkaV9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBwb3J0bWFuICpwbSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOworCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlpbnQgZXJyOworCQorCWVyciA9IHNuZF9yYXdtaWRpX25ldyhjYXJkLCBDQVJEX05BTUUsIDAsIAorCQkJICAgICAgUE9SVE1BTl9OVU1fT1VUUFVUX1BPUlRTLCAKKwkJCSAgICAgIFBPUlRNQU5fTlVNX0lOUFVUX1BPUlRTLCAKKwkJCSAgICAgICZybWlkaSk7CisJaWYgKGVyciA8IDApIAorCQlyZXR1cm4gZXJyOworCisJcm1pZGktPnByaXZhdGVfZGF0YSA9IHBtOworCXN0cmNweShybWlkaS0+bmFtZSwgQ0FSRF9OQU1FKTsKKwlybWlkaS0+aW5mb19mbGFncyA9IFNORFJWX1JBV01JRElfSU5GT19PVVRQVVQgfAorCQkgICAgICAgICAgICBTTkRSVl9SQVdNSURJX0lORk9fSU5QVVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNORFJWX1JBV01JRElfSU5GT19EVVBMRVg7CisKKwlwbS0+cm1pZGkgPSBybWlkaTsKKworCS8qIHJlZ2lzdGVyIHJhd21pZGkgb3BzICovCisJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVULCAKKwkJCSAgICAmc25kX3BvcnRtYW5fbWlkaV9vdXRwdXQpOworCXNuZF9yYXdtaWRpX3NldF9vcHMocm1pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX0lOUFVULCAKKwkJCSAgICAmc25kX3BvcnRtYW5fbWlkaV9pbnB1dCk7CisKKwkvKiBuYW1lIHN1YnN0cmVhbXMgKi8KKwkvKiBvdXRwdXQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnN0cmVhbSwKKwkJCSAgICAmcm1pZGktPnN0cmVhbXNbU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVUXS5zdWJzdHJlYW1zLAorCQkJICAgIGxpc3QpIHsKKwkJc3ByaW50ZihzdWJzdHJlYW0tPm5hbWUsCisJCQkiUG9ydG1hbjJ4NCAlZCIsIHN1YnN0cmVhbS0+bnVtYmVyKzEpOworCX0KKwkvKiBpbnB1dCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic3RyZWFtLAorCQkJICAgICZybWlkaS0+c3RyZWFtc1tTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVF0uc3Vic3RyZWFtcywKKwkJCSAgICBsaXN0KSB7CisJCXBtLT5taWRpX2lucHV0W3N1YnN0cmVhbS0+bnVtYmVyXSA9IHN1YnN0cmVhbTsKKwkJc3ByaW50ZihzdWJzdHJlYW0tPm5hbWUsCisJCQkiUG9ydG1hbjJ4NCAlZCIsIHN1YnN0cmVhbS0+bnVtYmVyKzEpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBhcnBvcnQgc3R1ZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzbmRfcG9ydG1hbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqdXNlcmRhdGEpCit7CisJdW5zaWduZWQgY2hhciBtaWRpdmFsdWUgPSAwOworCXN0cnVjdCBwb3J0bWFuICpwbSA9ICgoc3RydWN0IHNuZF9jYXJkKil1c2VyZGF0YSktPnByaXZhdGVfZGF0YTsKKworCXNwaW5fbG9jaygmcG0tPnJlZ19sb2NrKTsKKworCS8qIFdoaWxlIGFueSBpbnB1dCBkYXRhIGlzIHdhaXRpbmcgKi8KKwl3aGlsZSAoKHBvcnRtYW5fcmVhZF9zdGF0dXMocG0pICYgSU5UX1JFUSkgPT0gSU5UX1JFUSkgeworCQkvKiBJZiBkYXRhIGF2YWlsYWJsZSBvbiBjaGFubmVsIDAsIAorCQkgICByZWFkIGl0IGFuZCBzdHVmZiBpdCBpbnRvIHRoZSBxdWV1ZS4gKi8KKwkJaWYgKHBvcnRtYW5fZGF0YV9hdmFpbChwbSwgMCkpIHsKKwkJCS8qIFJlYWQgTWlkaSAqLworCQkJbWlkaXZhbHVlID0gcG9ydG1hbl9yZWFkX21pZGkocG0sIDApOworCQkJLyogcHV0IG1pZGkgaW50byBxdWV1ZS4uLiAqLworCQkJaWYgKHBtLT5tb2RlWzBdICYgUE9SVE1BTjJYNF9NT0RFX0lOUFVUX1RSSUdHRVJFRCkKKwkJCQlzbmRfcmF3bWlkaV9yZWNlaXZlKHBtLT5taWRpX2lucHV0WzBdLAorCQkJCQkJICAgICZtaWRpdmFsdWUsIDEpOworCisJCX0KKwkJLyogSWYgZGF0YSBhdmFpbGFibGUgb24gY2hhbm5lbCAxLCAKKwkJICAgcmVhZCBpdCBhbmQgc3R1ZmYgaXQgaW50byB0aGUgcXVldWUuICovCisJCWlmIChwb3J0bWFuX2RhdGFfYXZhaWwocG0sIDEpKSB7CisJCQkvKiBSZWFkIE1pZGkgKi8KKwkJCW1pZGl2YWx1ZSA9IHBvcnRtYW5fcmVhZF9taWRpKHBtLCAxKTsKKwkJCS8qIHB1dCBtaWRpIGludG8gcXVldWUuLi4gKi8KKwkJCWlmIChwbS0+bW9kZVsxXSAmIFBPUlRNQU4yWDRfTU9ERV9JTlBVVF9UUklHR0VSRUQpCisJCQkJc25kX3Jhd21pZGlfcmVjZWl2ZShwbS0+bWlkaV9pbnB1dFsxXSwKKwkJCQkJCSAgICAmbWlkaXZhbHVlLCAxKTsKKwkJfQorCisJfQorCisJc3Bpbl91bmxvY2soJnBtLT5yZWdfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9wb3J0bWFuX3Byb2JlX3BvcnQoc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IHBhcmRldmljZSAqcGFyZGV2OworCWludCByZXM7CisKKwlwYXJkZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwLCBEUklWRVJfTkFNRSwKKwkJCQkJIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCSAwLCBOVUxMKTsKKwlpZiAoIXBhcmRldikKKwkJcmV0dXJuIC1FSU87CisJCisJaWYgKHBhcnBvcnRfY2xhaW0ocGFyZGV2KSkgeworCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBhcmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJlcyA9IHBvcnRtYW5fcHJvYmUocCk7CisKKwlwYXJwb3J0X3JlbGVhc2UocGFyZGV2KTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBhcmRldik7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX3BvcnRtYW5fYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZTsKKworCWRldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhQTEFURk9STV9EUklWRVIsIGRldmljZV9jb3VudCk7CisJaWYgKCFkZXZpY2UpIAorCQlyZXR1cm47CisKKwkvKiBUZW1wb3JhcnkgYXNzaWdubWVudCB0byBmb3J3YXJkIHRoZSBwYXJwb3J0ICovCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2aWNlLCBwKTsKKworCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoZGV2aWNlKSA8IDApIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChkZXZpY2UpOworCQlyZXR1cm47CisJfQorCisJLyogU2luY2Ugd2UgZG9udCBnZXQgdGhlIHJldHVybiB2YWx1ZSBvZiBwcm9iZQorCSAqIFdlIG5lZWQgdG8gY2hlY2sgaWYgZGV2aWNlIHByb2Jpbmcgc3VjY2VlZGVkIG9yIG5vdCAqLworCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkZXZpY2UpOworCQlyZXR1cm47CisJfQorCisJLyogcmVnaXN0ZXIgZGV2aWNlIGluIGdsb2JhbCB0YWJsZSAqLworCXBsYXRmb3JtX2RldmljZXNbZGV2aWNlX2NvdW50XSA9IGRldmljZTsKKwlkZXZpY2VfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQgc25kX3BvcnRtYW5fZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHBvcnRtYW5fcGFycG9ydF9kcml2ZXIgPSB7CisJLm5hbWUgICA9ICJwb3J0bWFuMng0IiwKKwkuYXR0YWNoID0gc25kX3BvcnRtYW5fYXR0YWNoLAorCS5kZXRhY2ggPSBzbmRfcG9ydG1hbl9kZXRhY2gKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBsYXRmb3JtIHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc25kX3BvcnRtYW5fY2FyZF9wcml2YXRlX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBwb3J0bWFuICpwbSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGFyZGV2aWNlICpwYXJkZXYgPSBwbS0+cGFyZGV2OworCisJaWYgKHBhcmRldikgeworCQlpZiAocG0tPnBhcmRldl9jbGFpbWVkKQorCQkJcGFycG9ydF9yZWxlYXNlKHBhcmRldik7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocGFyZGV2KTsKKwl9CisKKwlwb3J0bWFuX2ZyZWUocG0pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfcG9ydG1hbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwYXJkZXZpY2UgKnBhcmRldjsKKwlzdHJ1Y3QgcGFycG9ydCAqcDsKKwlpbnQgZGV2ID0gcGRldi0+aWQ7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gTlVMTDsKKwlzdHJ1Y3QgcG9ydG1hbiAqcG0gPSBOVUxMOworCWludCBlcnI7CisKKwlwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlpZiAoZGV2ID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWVuYWJsZVtkZXZdKSAKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAoKGVyciA9IHNuZF9wb3J0bWFuX3Byb2JlX3BvcnQocCkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOworCWlmIChjYXJkID09IE5VTEwpIHsKKwkJc25kX3ByaW50ZCgiQ2Fubm90IGNyZWF0ZSBjYXJkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXN0cmNweShjYXJkLT5kcml2ZXIsIERSSVZFUl9OQU1FKTsKKwlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCBDQVJEX05BTUUpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICAiJXMgYXQgMHglbHgsIGlycSAlaSIsIAorCQljYXJkLT5zaG9ydG5hbWUsIHAtPmJhc2UsIHAtPmlycSk7CisKKwlwYXJkZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwLCAgICAgICAgICAgICAgICAgICAgIC8qIHBvcnQgKi8KKwkJCQkJIERSSVZFUl9OQU1FLCAgICAgICAgICAgLyogbmFtZSAqLworCQkJCQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBwcmVlbXB0ICovCisJCQkJCSBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHdha2V1cCAqLworCQkJCQkgc25kX3BvcnRtYW5faW50ZXJydXB0LCAvKiBJU1IgKi8KKwkJCQkJIFBBUlBPUlRfREVWX0VYQ0wsICAgICAgLyogZmxhZ3MgKi8KKwkJCQkJICh2b2lkICopY2FyZCk7ICAgICAgICAgLyogcHJpdmF0ZSAqLworCWlmIChwYXJkZXYgPT0gTlVMTCkgeworCQlzbmRfcHJpbnRkKCJDYW5ub3QgcmVnaXN0ZXIgcGFyZGV2aWNlXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBfX2VycjsKKwl9CisKKwlpZiAoKGVyciA9IHBvcnRtYW5fY3JlYXRlKGNhcmQsIHBhcmRldiwgJnBtKSkgPCAwKSB7CisJCXNuZF9wcmludGQoIkNhbm5vdCBjcmVhdGUgbWFpbiBjb21wb25lbnRcbiIpOworCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBhcmRldik7CisJCWdvdG8gX19lcnI7CisJfQorCWNhcmQtPnByaXZhdGVfZGF0YSA9IHBtOworCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF9wb3J0bWFuX2NhcmRfcHJpdmF0ZV9mcmVlOworCQorCWlmICgoZXJyID0gc25kX3BvcnRtYW5fcmF3bWlkaV9jcmVhdGUoY2FyZCkpIDwgMCkgeworCQlzbmRfcHJpbnRkKCJDcmVhdGluZyBSYXdtaWRpIGNvbXBvbmVudCBmYWlsZWRcbiIpOworCQlnb3RvIF9fZXJyOworCX0KKworCS8qIGNsYWltIHBhcnBvcnQgKi8KKwlpZiAocGFycG9ydF9jbGFpbShwYXJkZXYpKSB7CisJCXNuZF9wcmludGQoIkNhbm5vdCBjbGFpbSBwYXJwb3J0IDB4JWx4XG4iLCBwYXJkZXYtPnBvcnQtPmJhc2UpOworCQllcnIgPSAtRUlPOworCQlnb3RvIF9fZXJyOworCX0KKwlwbS0+cGFyZGV2X2NsYWltZWQgPSAxOworCisJLyogaW5pdCBkZXZpY2UgKi8KKwlpZiAoKGVyciA9IHBvcnRtYW5fZGV2aWNlX2luaXQocG0pKSA8IDApCisJCWdvdG8gX19lcnI7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKworCS8qIEF0IHRoaXMgcG9pbnQgY2FyZCB3aWxsIGJlIHVzYWJsZSAqLworCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgeworCQlzbmRfcHJpbnRkKCJDYW5ub3QgcmVnaXN0ZXIgY2FyZFxuIik7CisJCWdvdG8gX19lcnI7CisJfQorCisJc25kX3ByaW50ayhLRVJOX0lORk8gIlBvcnRtYW4gMng0IG9uIDB4JWx4XG4iLCBwLT5iYXNlKTsKKwlyZXR1cm4gMDsKKworX19lcnI6CisJc25kX2NhcmRfZnJlZShjYXJkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNuZF9wb3J0bWFuX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGNhcmQpCisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfcG9ydG1hbl9kcml2ZXIgPSB7CisJLnByb2JlICA9IHNuZF9wb3J0bWFuX3Byb2JlLAorCS5yZW1vdmUgPSBzbmRfcG9ydG1hbl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBQTEFURk9STV9EUklWRVIKKwl9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb2R1bGUgaW5pdCBzdHVmZgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHNuZF9wb3J0bWFuX3VucmVnaXN0ZXJfYWxsKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7ICsraSkgeworCQlpZiAocGxhdGZvcm1fZGV2aWNlc1tpXSkgeworCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGxhdGZvcm1fZGV2aWNlc1tpXSk7CisJCQlwbGF0Zm9ybV9kZXZpY2VzW2ldID0gTlVMTDsKKwkJfQorCX0JCQorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfcG9ydG1hbl9kcml2ZXIpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBvcnRtYW5fcGFycG9ydF9kcml2ZXIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbmRfcG9ydG1hbl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kX3BvcnRtYW5fZHJpdmVyKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZwb3J0bWFuX3BhcnBvcnRfZHJpdmVyKSAhPSAwKSB7CisJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfcG9ydG1hbl9kcml2ZXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoZGV2aWNlX2NvdW50ID09IDApIHsKKwkJc25kX3BvcnRtYW5fdW5yZWdpc3Rlcl9hbGwoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbmRfcG9ydG1hbl9tb2R1bGVfZXhpdCh2b2lkKQoreworCXNuZF9wb3J0bWFuX3VucmVnaXN0ZXJfYWxsKCk7Cit9CisKK21vZHVsZV9pbml0KHNuZF9wb3J0bWFuX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHNuZF9wb3J0bWFuX21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvc2VyaWFsLXUxNjU1MC5jIGIvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKaW5kZXggNzQwMjhiMi4uM2E4NmE1OCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKKysrIGIvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKQEAgLTExNywxMyArMTE3LDEzIEBACiAjZGVmaW5lIFNFUklBTF9NT0RFX0lOUFVUX1RSSUdHRVJFRAkoMSA8PCAyKQogI2RlZmluZSBTRVJJQUxfTU9ERV9PVVRQVVRfVFJJR0dFUkVECSgxIDw8IDMpCiAKLXR5cGVkZWYgc3RydWN0IF9zbmRfdWFydDE2NTUwIHsKK3N0cnVjdCBzbmRfdWFydDE2NTUwIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICptaWRpX291dHB1dFtTTkRSVl9TRVJJQUxfTUFYX09VVFNdOwogCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKm1pZGlfaW5wdXRbU05EUlZfU0VSSUFMX01BWF9JTlNdOwogCi0JaW50IGZpbGVtb2RlOwkJLy9vcGVuIHN0YXR1cyBvZiBmaWxlCisJaW50IGZpbGVtb2RlOwkJLyogb3BlbiBzdGF0dXMgb2YgZmlsZSAqLwogCiAJc3BpbmxvY2tfdCBvcGVuX2xvY2s7CiAKQEAgLTE0MCwzOSArMTQwLDM5IEBACiAJdW5zaWduZWQgY2hhciBvbGRfZGl2aXNvcl9tc2I7CiAJdW5zaWduZWQgY2hhciBvbGRfbGluZV9jdHJsX3JlZzsKIAotCS8vIHBhcmFtZXRlciBmb3IgdXNpbmcgb2Ygd3JpdGUgbG9vcAotCXNob3J0IGludCBmaWZvX2xpbWl0OwkvL3VzZWQgaW4gdWFydDE2NTUwCi0gICAgICAgIHNob3J0IGludCBmaWZvX2NvdW50OwkvL3VzZWQgaW4gdWFydDE2NTUwCisJLyogcGFyYW1ldGVyIGZvciB1c2luZyBvZiB3cml0ZSBsb29wICovCisJc2hvcnQgaW50IGZpZm9fbGltaXQ7CS8qIHVzZWQgaW4gdWFydDE2NTUwICovCisgICAgICAgIHNob3J0IGludCBmaWZvX2NvdW50OwkvKiB1c2VkIGluIHVhcnQxNjU1MCAqLwogCi0JLy8gdHlwZSBvZiBhZGFwdG9yCisJLyogdHlwZSBvZiBhZGFwdG9yICovCiAJaW50IGFkYXB0b3I7CiAKLQkvLyBpbnB1dHMKKwkvKiBpbnB1dHMgKi8KIAlpbnQgcHJldl9pbjsKIAl1bnNpZ25lZCBjaGFyIHJzdGF0dXM7CiAKLQkvLyBvdXRwdXRzCisJLyogb3V0cHV0cyAqLwogCWludCBwcmV2X291dDsKIAl1bnNpZ25lZCBjaGFyIHByZXZfc3RhdHVzW1NORFJWX1NFUklBTF9NQVhfT1VUU107CiAKLQkvLyB3cml0ZSBidWZmZXIgYW5kIGl0cyB3cml0aW5nL3JlYWRpbmcgcG9zaXRpb24KKwkvKiB3cml0ZSBidWZmZXIgYW5kIGl0cyB3cml0aW5nL3JlYWRpbmcgcG9zaXRpb24gKi8KIAl1bnNpZ25lZCBjaGFyIHR4X2J1ZmZbVFhfQlVGRl9TSVpFXTsKIAlpbnQgYnVmZl9pbl9jb3VudDsKICAgICAgICAgaW50IGJ1ZmZfaW47CiAgICAgICAgIGludCBidWZmX291dDsKICAgICAgICAgaW50IGRyb3Bfb25fZnVsbDsKIAotCS8vIHdhaXQgdGltZXIKKwkvKiB3YWl0IHRpbWVyICovCiAJdW5zaWduZWQgaW50IHRpbWVyX3J1bm5pbmc6MTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBidWZmZXJfdGltZXI7CiAKLX0gc25kX3VhcnQxNjU1MF90OworfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbU05EUlZfQ0FSRFNdOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgc25kX3VhcnQxNjU1MF9hZGRfdGltZXIoc25kX3VhcnQxNjU1MF90ICp1YXJ0KQorc3RhdGljIGlubGluZSB2b2lkIHNuZF91YXJ0MTY1NTBfYWRkX3RpbWVyKHN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0KQogewotCWlmICghIHVhcnQtPnRpbWVyX3J1bm5pbmcpIHsKKwlpZiAoIXVhcnQtPnRpbWVyX3J1bm5pbmcpIHsKIAkJLyogdGltZXIgMzg2MDBicHMgKiAxMGJpdCAqIDE2Ynl0ZSAqLwogCQl1YXJ0LT5idWZmZXJfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSForMjU1KS8yNTY7CiAJCXVhcnQtPnRpbWVyX3J1bm5pbmcgPSAxOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc25kX3VhcnQxNjU1MF9kZWxfdGltZXIoc25kX3VhcnQxNjU1MF90ICp1YXJ0KQorc3RhdGljIGlubGluZSB2b2lkIHNuZF91YXJ0MTY1NTBfZGVsX3RpbWVyKHN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0KQogewogCWlmICh1YXJ0LT50aW1lcl9ydW5uaW5nKSB7CiAJCWRlbF90aW1lcigmdWFydC0+YnVmZmVyX3RpbWVyKTsKQEAgLTE4OSwxMCArMTg5LDEwIEBACiB9CiAKIC8qIFRoaXMgbWFjcm8gaXMgb25seSB1c2VkIGluIHNuZF91YXJ0MTY1NTBfaW9fbG9vcCAqLwotc3RhdGljIGlubGluZSB2b2lkIHNuZF91YXJ0MTY1NTBfYnVmZmVyX291dHB1dChzbmRfdWFydDE2NTUwX3QgKnVhcnQpCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX3VhcnQxNjU1MF9idWZmZXJfb3V0cHV0KHN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0KQogewogCXVuc2lnbmVkIHNob3J0IGJ1ZmZfb3V0ID0gdWFydC0+YnVmZl9vdXQ7Ci0JaWYoIHVhcnQtPmJ1ZmZfaW5fY291bnQgPiAwICkgeworCWlmICh1YXJ0LT5idWZmX2luX2NvdW50ID4gMCkgewogCQlvdXRiKHVhcnQtPnR4X2J1ZmZbYnVmZl9vdXRdLCB1YXJ0LT5iYXNlICsgVUFSVF9UWCk7CiAJCXVhcnQtPmZpZm9fY291bnQrKzsKIAkJYnVmZl9vdXQrKzsKQEAgLTIwNiw3ICsyMDYsNyBAQAogICogV2UgZG9uJ3Qgd2FudCB0byBpbnRlcnJ1cHQgdGhpcywgCiAgKiBhcyB3ZSdyZSBhbHJlYWR5IGhhbmRsaW5nIGFuIGludGVycnVwdCAKICAqLwotc3RhdGljIHZvaWQgc25kX3VhcnQxNjU1MF9pb19sb29wKHNuZF91YXJ0MTY1NTBfdCAqIHVhcnQpCitzdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX2lvX2xvb3Aoc3RydWN0IHNuZF91YXJ0MTY1NTAgKiB1YXJ0KQogewogCXVuc2lnbmVkIGNoYXIgYywgc3RhdHVzOwogCWludCBzdWJzdHJlYW07CkBAIC0yMjAsOSArMjIwLDggQEAKIAkJYyA9IGluYih1YXJ0LT5iYXNlICsgVUFSVF9SWCk7CiAKIAkJLyoga2VlcCB0cmFjayBvZiBsYXN0IHN0YXR1cyBieXRlICovCi0JCWlmIChjICYgMHg4MCkgeworCQlpZiAoYyAmIDB4ODApCiAJCQl1YXJ0LT5yc3RhdHVzID0gYzsKLQkJfQogCiAJCS8qIGhhbmRsZSBzdHJlYW0gc3dpdGNoICovCiAJCWlmICh1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9HRU5FUklDKSB7CkBAIC0yMzAsMTQgKzIyOSwxNiBAQAogCQkJCWlmIChjIDw9IFNORFJWX1NFUklBTF9NQVhfSU5TICYmIGMgPiAwKQogCQkJCQlzdWJzdHJlYW0gPSBjIC0gMTsKIAkJCQlpZiAoYyAhPSAweGY1KQotCQkJCQl1YXJ0LT5yc3RhdHVzID0gMDsgLyogcHJldmVudCBmdXR1cmUgYnl0ZXMgZnJvbSBiZWluZyBpbnRlcnByZXRlZCBhcyBzdHJlYW1zICovCi0JCQl9Ci0JCQllbHNlIGlmICgodWFydC0+ZmlsZW1vZGUgJiBTRVJJQUxfTU9ERV9JTlBVVF9PUEVOKSAmJiAodWFydC0+bWlkaV9pbnB1dFtzdWJzdHJlYW1dICE9IE5VTEwpKSB7Ci0JCQkJc25kX3Jhd21pZGlfcmVjZWl2ZSh1YXJ0LT5taWRpX2lucHV0W3N1YnN0cmVhbV0sICZjLCAxKTsKLQkJCX0KLQkJfSBlbHNlIGlmICgodWFydC0+ZmlsZW1vZGUgJiBTRVJJQUxfTU9ERV9JTlBVVF9PUEVOKSAmJiAodWFydC0+bWlkaV9pbnB1dFtzdWJzdHJlYW1dICE9IE5VTEwpKSB7CisJCQkJCS8qIHByZXZlbnQgZnV0dXJlIGJ5dGVzIGZyb20gYmVpbmcKKwkJCQkJICAgaW50ZXJwcmV0ZWQgYXMgc3RyZWFtcyAqLworCQkJCQl1YXJ0LT5yc3RhdHVzID0gMDsKKwkJCX0gZWxzZSBpZiAoKHVhcnQtPmZpbGVtb2RlICYgU0VSSUFMX01PREVfSU5QVVRfT1BFTikKKwkJCQkgICAmJiB1YXJ0LT5taWRpX2lucHV0W3N1YnN0cmVhbV0pCisJCQkJc25kX3Jhd21pZGlfcmVjZWl2ZSh1YXJ0LT5taWRpX2lucHV0W3N1YnN0cmVhbV0sCisJCQkJCQkgICAgJmMsIDEpOworCQl9IGVsc2UgaWYgKCh1YXJ0LT5maWxlbW9kZSAmIFNFUklBTF9NT0RFX0lOUFVUX09QRU4pICYmCisJCQkgICB1YXJ0LT5taWRpX2lucHV0W3N1YnN0cmVhbV0pCiAJCQlzbmRfcmF3bWlkaV9yZWNlaXZlKHVhcnQtPm1pZGlfaW5wdXRbc3Vic3RyZWFtXSwgJmMsIDEpOwotCQl9CiAKIAkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX09FKQogCQkJc25kX3ByaW50aygiJXM6IE92ZXJydW4gb24gZGV2aWNlIGF0IDB4JWx4XG4iLApAQCAtMjUwLDIxICsyNTEsMjAgQEAKIAkvKiBubyBuZWVkIG9mIGNoZWNrIFNFUklBTF9NT0RFX09VVFBVVF9PUEVOIGJlY2F1c2UgaWYgbm90LAogCSAgIGJ1ZmZlciBpcyBuZXZlciBmaWxsZWQuICovCiAJLyogQ2hlY2sgd3JpdGUgc3RhdHVzICovCi0JaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpIHsKKwlpZiAoc3RhdHVzICYgVUFSVF9MU1JfVEhSRSkKIAkJdWFydC0+Zmlmb19jb3VudCA9IDA7Ci0JfQogCWlmICh1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9NUzEyNFdfU0EKIAkgICB8fCB1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9HRU5FUklDKSB7CiAJCS8qIENhbid0IHVzZSBGSUZPLCBtdXN0IHNlbmQgb25seSB3aGVuIENUUyBpcyB0cnVlICovCiAJCXN0YXR1cyA9IGluYih1YXJ0LT5iYXNlICsgVUFSVF9NU1IpOwotCQl3aGlsZSggKHVhcnQtPmZpZm9fY291bnQgPT0gMCkgJiYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgJiYKLQkJICAgICAgKHVhcnQtPmJ1ZmZfaW5fY291bnQgPiAwKSApIHsKKwkJd2hpbGUgKHVhcnQtPmZpZm9fY291bnQgPT0gMCAmJiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSAmJgorCQkgICAgICAgdWFydC0+YnVmZl9pbl9jb3VudCA+IDApIHsKIAkJICAgICAgIHNuZF91YXJ0MTY1NTBfYnVmZmVyX291dHB1dCh1YXJ0KTsKLQkJICAgICAgIHN0YXR1cyA9IGluYiggdWFydC0+YmFzZSArIFVBUlRfTVNSICk7CisJCSAgICAgICBzdGF0dXMgPSBpbmIodWFydC0+YmFzZSArIFVBUlRfTVNSKTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIFdyaXRlIGxvb3AgKi8KLQkJd2hpbGUgKHVhcnQtPmZpZm9fY291bnQgPCB1YXJ0LT5maWZvX2xpbWl0CS8qIENhbiB3ZSB3cml0ZSA/ICovCisJCXdoaWxlICh1YXJ0LT5maWZvX2NvdW50IDwgdWFydC0+Zmlmb19saW1pdCAvKiBDYW4gd2Ugd3JpdGUgPyAqLwogCQkgICAgICAgJiYgdWFydC0+YnVmZl9pbl9jb3VudCA+IDApCS8qIERvIHdlIHdhbnQgdG8/ICovCiAJCQlzbmRfdWFydDE2NTUwX2J1ZmZlcl9vdXRwdXQodWFydCk7CiAJfQpAQCAtMjk0LDE1ICsyOTQsMTYgQEAKICAqLwogc3RhdGljIGlycXJldHVybl90IHNuZF91YXJ0MTY1NTBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzbmRfdWFydDE2NTUwX3QgKnVhcnQ7CisJc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQ7CiAKLQl1YXJ0ID0gKHNuZF91YXJ0MTY1NTBfdCAqKSBkZXZfaWQ7CisJdWFydCA9IGRldl9pZDsKIAlzcGluX2xvY2soJnVhcnQtPm9wZW5fbG9jayk7CiAJaWYgKHVhcnQtPmZpbGVtb2RlID09IFNFUklBTF9NT0RFX05PVF9PUEVORUQpIHsKIAkJc3Bpbl91bmxvY2soJnVhcnQtPm9wZW5fbG9jayk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9Ci0JaW5iKHVhcnQtPmJhc2UgKyBVQVJUX0lJUik7CQkvKiBpbmRpY2F0ZSB0byB0aGUgVUFSVCB0aGF0IHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gc2VydmljZWQgKi8KKwkvKiBpbmRpY2F0ZSB0byB0aGUgVUFSVCB0aGF0IHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gc2VydmljZWQgKi8KKwlpbmIodWFydC0+YmFzZSArIFVBUlRfSUlSKTsKIAlzbmRfdWFydDE2NTUwX2lvX2xvb3AodWFydCk7CiAJc3Bpbl91bmxvY2soJnVhcnQtPm9wZW5fbG9jayk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMzEyLDkgKzMxMyw5IEBACiBzdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX2J1ZmZlcl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzbmRfdWFydDE2NTUwX3QgKnVhcnQ7CisJc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQ7CiAKLQl1YXJ0ID0gKHNuZF91YXJ0MTY1NTBfdCAqKWRhdGE7CisJdWFydCA9IChzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqKWRhdGE7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcnQtPm9wZW5fbG9jaywgZmxhZ3MpOwogCXNuZF91YXJ0MTY1NTBfZGVsX3RpbWVyKHVhcnQpOwogCXNuZF91YXJ0MTY1NTBfaW9fbG9vcCh1YXJ0KTsKQEAgLTMyNiw3ICszMjcsNyBAQAogICogIHJldHVybiAwIGlmIGZvdW5kCiAgKiAgcmV0dXJuIG5lZ2F0aXZlIGVycm9yIGlmIG5vdCBmb3VuZAogICovCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfdWFydDE2NTUwX2RldGVjdChzbmRfdWFydDE2NTUwX3QgKnVhcnQpCitzdGF0aWMgaW50IF9faW5pdCBzbmRfdWFydDE2NTUwX2RldGVjdChzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCkKIHsKIAl1bnNpZ25lZCBsb25nIGlvX2Jhc2UgPSB1YXJ0LT5iYXNlOwogCWludCBvazsKQEAgLTM0Myw3ICszNDQsOCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCW9rID0gMTsJCQkvKiB1YXJ0IGRldGVjdGVkIHVubGVzcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBzaG91bGQgZmFpbCAqLworCS8qIHVhcnQgZGV0ZWN0ZWQgdW5sZXNzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIHNob3VsZCBmYWlsICovCisJb2sgPSAxOwogCS8qIDggZGF0YS1iaXRzLCAxIHN0b3AtYml0LCBwYXJpdHkgb2ZmLCBETEFCID0gMCAqLwogCW91dGIoVUFSVF9MQ1JfV0xFTjgsIGlvX2Jhc2UgKyBVQVJUX0xDUik7IC8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAqLwogCWMgPSBpbmIoaW9fYmFzZSArIFVBUlRfSUVSKTsKQEAgLTM2OCw3ICszNzAsNyBAQAogCXJldHVybiBvazsKIH0KIAotc3RhdGljIHZvaWQgc25kX3VhcnQxNjU1MF9kb19vcGVuKHNuZF91YXJ0MTY1NTBfdCAqIHVhcnQpCitzdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX2RvX29wZW4oc3RydWN0IHNuZF91YXJ0MTY1NTAgKiB1YXJ0KQogewogCWNoYXIgYnl0ZTsKIApAQCAtNDYwLDcgKzQ2Miw3IEBACiAJaW5iKHVhcnQtPmJhc2UgKyBVQVJUX1JYKTsJLyogQ2xlYXIgYW55IHByZS1leGlzdGluZyByZWNlaXZlIGludGVycnVwdCAqLwogfQogCi1zdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX2RvX2Nsb3NlKHNuZF91YXJ0MTY1NTBfdCAqIHVhcnQpCitzdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX2RvX2Nsb3NlKHN0cnVjdCBzbmRfdWFydDE2NTUwICogdWFydCkKIHsKIAlpZiAodWFydC0+aXJxIDwgMCkKIAkJc25kX3VhcnQxNjU1MF9kZWxfdGltZXIodWFydCk7CkBAIC01MTQsNyArNTE2LDcgQEAKIHN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9pbnB1dF9vcGVuKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNuZF91YXJ0MTY1NTBfdCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1YXJ0LT5vcGVuX2xvY2ssIGZsYWdzKTsKIAlpZiAodWFydC0+ZmlsZW1vZGUgPT0gU0VSSUFMX01PREVfTk9UX09QRU5FRCkKQEAgLTUyOCw3ICs1MzAsNyBAQAogc3RhdGljIGludCBzbmRfdWFydDE2NTUwX2lucHV0X2Nsb3NlKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNuZF91YXJ0MTY1NTBfdCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1YXJ0LT5vcGVuX2xvY2ssIGZsYWdzKTsKIAl1YXJ0LT5maWxlbW9kZSAmPSB+U0VSSUFMX01PREVfSU5QVVRfT1BFTjsKQEAgLTUzOSwyNCArNTQxLDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNuZF91YXJ0MTY1NTBfaW5wdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCB1cCkKK3N0YXRpYyB2b2lkIHNuZF91YXJ0MTY1NTBfaW5wdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCWludCB1cCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNuZF91YXJ0MTY1NTBfdCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1YXJ0LT5vcGVuX2xvY2ssIGZsYWdzKTsKLQlpZiAodXApIHsKKwlpZiAodXApCiAJCXVhcnQtPmZpbGVtb2RlIHw9IFNFUklBTF9NT0RFX0lOUFVUX1RSSUdHRVJFRDsKLQl9IGVsc2UgeworCWVsc2UKIAkJdWFydC0+ZmlsZW1vZGUgJj0gflNFUklBTF9NT0RFX0lOUFVUX1RSSUdHRVJFRDsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWFydC0+b3Blbl9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9vdXRwdXRfb3BlbihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzbmRfdWFydDE2NTUwX3QgKnVhcnQgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdWFydC0+b3Blbl9sb2NrLCBmbGFncyk7CiAJaWYgKHVhcnQtPmZpbGVtb2RlID09IFNFUklBTF9NT0RFX05PVF9PUEVORUQpCkBAIC01NzAsNyArNTcyLDcgQEAKIHN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9vdXRwdXRfY2xvc2Uoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc25kX3VhcnQxNjU1MF90ICp1YXJ0ID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0ID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcnQtPm9wZW5fbG9jaywgZmxhZ3MpOwogCXVhcnQtPmZpbGVtb2RlICY9IH5TRVJJQUxfTU9ERV9PVVRQVVRfT1BFTjsKQEAgLTU4MSwxOCArNTgzLDIwIEBACiAJcmV0dXJuIDA7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBzbmRfdWFydDE2NTUwX2J1ZmZlcl9jYW5fd3JpdGUoIHNuZF91YXJ0MTY1NTBfdCAqdWFydCwgaW50IE51bSApCitzdGF0aWMgaW5saW5lIGludCBzbmRfdWFydDE2NTUwX2J1ZmZlcl9jYW5fd3JpdGUoc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQsCisJCQkJCQkgaW50IE51bSkKIHsKLQlpZiggdWFydC0+YnVmZl9pbl9jb3VudCArIE51bSA8IFRYX0JVRkZfU0laRSApCisJaWYgKHVhcnQtPmJ1ZmZfaW5fY291bnQgKyBOdW0gPCBUWF9CVUZGX1NJWkUpCiAJCXJldHVybiAxOwogCWVsc2UKIAkJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNuZF91YXJ0MTY1NTBfd3JpdGVfYnVmZmVyKHNuZF91YXJ0MTY1NTBfdCAqdWFydCwgdW5zaWduZWQgY2hhciBieXRlKQorc3RhdGljIGlubGluZSBpbnQgc25kX3VhcnQxNjU1MF93cml0ZV9idWZmZXIoc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQsCisJCQkJCSAgICAgdW5zaWduZWQgY2hhciBieXRlKQogewogCXVuc2lnbmVkIHNob3J0IGJ1ZmZfaW4gPSB1YXJ0LT5idWZmX2luOwotCWlmKCB1YXJ0LT5idWZmX2luX2NvdW50IDwgVFhfQlVGRl9TSVpFICkgeworCWlmICh1YXJ0LT5idWZmX2luX2NvdW50IDwgVFhfQlVGRl9TSVpFKSB7CiAJCXVhcnQtPnR4X2J1ZmZbYnVmZl9pbl0gPSBieXRlOwogCQlidWZmX2luKys7CiAJCWJ1ZmZfaW4gJj0gVFhfQlVGRl9NQVNLOwpAQCAtNjA1LDEyICs2MDksMTQgQEAKIAkJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9vdXRwdXRfYnl0ZShzbmRfdWFydDE2NTUwX3QgKnVhcnQsIHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCitzdGF0aWMgaW50IHNuZF91YXJ0MTY1NTBfb3V0cHV0X2J5dGUoc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJICAgICB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKIHsKLQlpZiAodWFydC0+YnVmZl9pbl9jb3VudCA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBlbXB0eT8gKi8KKwlpZiAodWFydC0+YnVmZl9pbl9jb3VudCA9PSAwICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgZW1wdHk/ICovCiAJICAgICYmICgodWFydC0+YWRhcHRvciAhPSBTTkRSVl9TRVJJQUxfTVMxMjRXX1NBICYmCiAJICAgIHVhcnQtPmFkYXB0b3IgIT0gU05EUlZfU0VSSUFMX0dFTkVSSUMpIHx8Ci0JCSh1YXJ0LT5maWZvX2NvdW50ID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRklGTyBlbXB0eT8gKi8KKwkJKHVhcnQtPmZpZm9fY291bnQgPT0gMCAgICAgICAgICAgICAgICAgIC8qIEZJRk8gZW1wdHk/ICovCiAJCSAmJiAoaW5iKHVhcnQtPmJhc2UgKyBVQVJUX01TUikgJiBVQVJUX01TUl9DVFMpKSkpIHsgLyogQ1RTPyAqLwogCiAJICAgICAgICAvKiBUeCBCdWZmZXIgRW1wdHkgLSB0cnkgdG8gd3JpdGUgaW1tZWRpYXRlbHkgKi8KQEAgLTYyMywxMiArNjI5LDEzIEBACiAJCQkgICAgICAgIHVhcnQtPmZpZm9fY291bnQrKzsKIAkJCQlvdXRiKG1pZGlfYnl0ZSwgdWFydC0+YmFzZSArIFVBUlRfVFgpOwogCQkJfSBlbHNlIHsKLQkJCSAgICAgICAgLyogQ2Fubm90IHdyaXRlIChidWZmZXIgZW1wdHkpIC0gcHV0IGNoYXIgaW4gYnVmZmVyICovCisJCQkgICAgICAgIC8qIENhbm5vdCB3cml0ZSAoYnVmZmVyIGVtcHR5KSAtCisJCQkJICogcHV0IGNoYXIgaW4gYnVmZmVyICovCiAJCQkJc25kX3VhcnQxNjU1MF93cml0ZV9idWZmZXIodWFydCwgbWlkaV9ieXRlKTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCWlmKCAhc25kX3VhcnQxNjU1MF93cml0ZV9idWZmZXIodWFydCwgbWlkaV9ieXRlKSApIHsKKwkJaWYgKCFzbmRfdWFydDE2NTUwX3dyaXRlX2J1ZmZlcih1YXJ0LCBtaWRpX2J5dGUpKSB7CiAJCQlzbmRfcHJpbnRrKCIlczogQnVmZmVyIG92ZXJydW4gb24gZGV2aWNlIGF0IDB4JWx4XG4iLAogCQkJCSAgIHVhcnQtPnJtaWRpLT5uYW1lLCB1YXJ0LT5iYXNlKTsKIAkJCXJldHVybiAwOwpAQCAtNjQyLDkgKzY0OSw5IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSwgYWRkcl9ieXRlOwotCXNuZF91YXJ0MTY1NTBfdCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAljaGFyIGZpcnN0OwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3R0aW1lPTA7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdHRpbWUgPSAwOwogCQogCS8qIEludGVydXB0cyBhcmUgZGlzYWJsZWQgZHVyaW5nIHRoZSB1cGRhdGluZyBvZiB0aGUgdHhfYnVmZiwKIAkgKiBzaW5jZSBpdCBpcyAnYmFkJyB0byBoYXZlIHR3byBwcm9jZXNzZXMgdXBkYXRpbmcgdGhlIHNhbWUKQEAgLTY1Myw3ICs2NjAsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcnQtPm9wZW5fbG9jaywgZmxhZ3MpOwogCi0JaWYgKHVhcnQtPmlycSA8IDApCS8vcG9sbGluZworCWlmICh1YXJ0LT5pcnEgPCAwKQkvKiBwb2xsaW5nICovCiAJCXNuZF91YXJ0MTY1NTBfaW9fbG9vcCh1YXJ0KTsKIAogCWlmICh1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9NUzEyNFdfTUIpIHsKQEAgLTY3MSw3ICs2NzgsOCBAQAogCQkJLyogc2VsZWN0IGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm91ciBwb3J0cyAqLwogCQkJYWRkcl9ieXRlID0gKHN1YnN0cmVhbS0+bnVtYmVyIDw8IDQpIHwgMHgwODsKIAkJCS8qIC4uLmV4Y2VwdCBub25lICovCi0JCQlpZiAoYWRkcl9ieXRlID09IDB4MDgpIGFkZHJfYnl0ZSA9IDB4Zjg7CisJCQlpZiAoYWRkcl9ieXRlID09IDB4MDgpCisJCQkJYWRkcl9ieXRlID0gMHhmODsKICNlbmRpZgogCQkJc25kX3VhcnQxNjU1MF9vdXRwdXRfYnl0ZSh1YXJ0LCBzdWJzdHJlYW0sIGFkZHJfYnl0ZSk7CiAJCQkvKiBzZW5kIG1pZGkgYnl0ZSAqLwpAQCAtNjc5LDMxICs2ODcsNDIgQEAKIAkJfQogCX0gZWxzZSB7CiAJCWZpcnN0ID0gMDsKLQkJd2hpbGUoIDEgPT0gc25kX3Jhd21pZGlfdHJhbnNtaXRfcGVlayhzdWJzdHJlYW0sICZtaWRpX2J5dGUsIDEpICkgewotCQkJLyogQWxzbyBzZW5kIEY1IGFmdGVyIDMgc2Vjb25kcyB3aXRoIG5vIGRhdGEgdG8gaGFuZGxlIGRldmljZSBkaXNjb25uZWN0ICovCi0JCQlpZiAoZmlyc3QgPT0gMCAmJiAodWFydC0+YWRhcHRvciA9PSBTTkRSVl9TRVJJQUxfU09VTkRDQU5WQVMgfHwKLQkJCQl1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9HRU5FUklDKSAmJgotCQkJICAgKHVhcnQtPnByZXZfb3V0ICE9IHN1YnN0cmVhbS0+bnVtYmVyIHx8IGppZmZpZXMtbGFzdHRpbWUgPiAzKkhaKSkgeworCQl3aGlsZSAoc25kX3Jhd21pZGlfdHJhbnNtaXRfcGVlayhzdWJzdHJlYW0sICZtaWRpX2J5dGUsIDEpID09IDEpIHsKKwkJCS8qIEFsc28gc2VuZCBGNSBhZnRlciAzIHNlY29uZHMgd2l0aCBubyBkYXRhCisJCQkgKiB0byBoYW5kbGUgZGV2aWNlIGRpc2Nvbm5lY3QgKi8KKwkJCWlmIChmaXJzdCA9PSAwICYmCisJCQkgICAgKHVhcnQtPmFkYXB0b3IgPT0gU05EUlZfU0VSSUFMX1NPVU5EQ0FOVkFTIHx8CisJCQkgICAgIHVhcnQtPmFkYXB0b3IgPT0gU05EUlZfU0VSSUFMX0dFTkVSSUMpICYmCisJCQkgICAgKHVhcnQtPnByZXZfb3V0ICE9IHN1YnN0cmVhbS0+bnVtYmVyIHx8CisJCQkgICAgIGppZmZpZXMtbGFzdHRpbWUgPiAzKkhaKSkgewogCi0JCQkJaWYoIHNuZF91YXJ0MTY1NTBfYnVmZmVyX2Nhbl93cml0ZSggdWFydCwgMyApICkgeworCQkJCWlmIChzbmRfdWFydDE2NTUwX2J1ZmZlcl9jYW5fd3JpdGUodWFydCwgMykpIHsKIAkJCQkJLyogUm9sYW5kIFNvdW5kY2FudmFzIHBhcnQgc2VsZWN0aW9uICovCi0JCQkJCS8qIElmIHRoaXMgc3Vic3RyZWFtIG9mIHRoZSBkYXRhIGlzIGRpZmZlcmVudCBwcmV2aW91cwotCQkJCQkgICBzdWJzdHJlYW0gaW4gdGhpcyB1YXJ0LCBzZW5kIHRoZSBjaGFuZ2UgcGFydCBldmVudCAqLworCQkJCQkvKiBJZiB0aGlzIHN1YnN0cmVhbSBvZiB0aGUgZGF0YSBpcworCQkJCQkgKiBkaWZmZXJlbnQgcHJldmlvdXMgc3Vic3RyZWFtCisJCQkJCSAqIGluIHRoaXMgdWFydCwgc2VuZCB0aGUgY2hhbmdlIHBhcnQKKwkJCQkJICogZXZlbnQKKwkJCQkJICovCiAJCQkJCXVhcnQtPnByZXZfb3V0ID0gc3Vic3RyZWFtLT5udW1iZXI7CiAJCQkJCS8qIGNoYW5nZSBwYXJ0ICovCi0JCQkJCXNuZF91YXJ0MTY1NTBfb3V0cHV0X2J5dGUodWFydCwgc3Vic3RyZWFtLCAweGY1KTsKKwkJCQkJc25kX3VhcnQxNjU1MF9vdXRwdXRfYnl0ZSh1YXJ0LCBzdWJzdHJlYW0sCisJCQkJCQkJCSAgMHhmNSk7CiAJCQkJCS8qIGRhdGEgKi8KLQkJCQkJc25kX3VhcnQxNjU1MF9vdXRwdXRfYnl0ZSh1YXJ0LCBzdWJzdHJlYW0sIHVhcnQtPnByZXZfb3V0ICsgMSk7Ci0JCQkJCS8qIElmIG1pZGlfYnl0ZSBpcyBhIGRhdGEgYnl0ZSwgc2VuZCB0aGUgcHJldmlvdXMgc3RhdHVzIGJ5dGUgKi8KLQkJCQkJaWYgKChtaWRpX2J5dGUgPCAweDgwKSAmJiAodWFydC0+YWRhcHRvciA9PSBTTkRSVl9TRVJJQUxfU09VTkRDQU5WQVMpKQorCQkJCQlzbmRfdWFydDE2NTUwX291dHB1dF9ieXRlKHVhcnQsIHN1YnN0cmVhbSwKKwkJCQkJCQkJICB1YXJ0LT5wcmV2X291dCArIDEpOworCQkJCQkvKiBJZiBtaWRpX2J5dGUgaXMgYSBkYXRhIGJ5dGUsCisJCQkJCSAqIHNlbmQgdGhlIHByZXZpb3VzIHN0YXR1cyBieXRlICovCisJCQkJCWlmIChtaWRpX2J5dGUgPCAweDgwICYmCisJCQkJCSAgICB1YXJ0LT5hZGFwdG9yID09IFNORFJWX1NFUklBTF9TT1VORENBTlZBUykKIAkJCQkJCXNuZF91YXJ0MTY1NTBfb3V0cHV0X2J5dGUodWFydCwgc3Vic3RyZWFtLCB1YXJ0LT5wcmV2X3N0YXR1c1t1YXJ0LT5wcmV2X291dF0pOwotCQkJCX0gZWxzZSBpZiggIXVhcnQtPmRyb3Bfb25fZnVsbCApCisJCQkJfSBlbHNlIGlmICghdWFydC0+ZHJvcF9vbl9mdWxsKQogCQkJCQlicmVhazsKIAogCQkJfQogCiAJCQkvKiBzZW5kIG1pZGkgYnl0ZSAqLwotCQkJaWYoICFzbmRfdWFydDE2NTUwX291dHB1dF9ieXRlKHVhcnQsIHN1YnN0cmVhbSwgbWlkaV9ieXRlKSAmJiAhdWFydC0+ZHJvcF9vbl9mdWxsICkKKwkJCWlmICghc25kX3VhcnQxNjU1MF9vdXRwdXRfYnl0ZSh1YXJ0LCBzdWJzdHJlYW0sIG1pZGlfYnl0ZSkgJiYKKwkJCSAgICAhdWFydC0+ZHJvcF9vbl9mdWxsICkKIAkJCQlicmVhazsKIAogCQkJaWYgKG1pZGlfYnl0ZSA+PSAweDgwICYmIG1pZGlfYnl0ZSA8IDB4ZjApCkBAIC03MTcsMTcgKzczNiwxNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVhcnQtPm9wZW5fbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBzbmRfdWFydDE2NTUwX291dHB1dF90cmlnZ2VyKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IHVwKQorc3RhdGljIHZvaWQgc25kX3VhcnQxNjU1MF9vdXRwdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCSBpbnQgdXApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzbmRfdWFydDE2NTUwX3QgKnVhcnQgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdWFydC0+b3Blbl9sb2NrLCBmbGFncyk7Ci0JaWYgKHVwKSB7CisJaWYgKHVwKQogCQl1YXJ0LT5maWxlbW9kZSB8PSBTRVJJQUxfTU9ERV9PVVRQVVRfVFJJR0dFUkVEOwotCX0gZWxzZSB7CisJZWxzZQogCQl1YXJ0LT5maWxlbW9kZSAmPSB+U0VSSUFMX01PREVfT1VUUFVUX1RSSUdHRVJFRDsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWFydC0+b3Blbl9sb2NrLCBmbGFncyk7CiAJaWYgKHVwKQogCQlzbmRfdWFydDE2NTUwX291dHB1dF93cml0ZShzdWJzdHJlYW0pOwpAQCAtNzQ3LDEwICs3NjYsMTAgQEAKIAkudHJpZ2dlciA9CXNuZF91YXJ0MTY1NTBfaW5wdXRfdHJpZ2dlciwKIH07CiAKLXN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9mcmVlKHNuZF91YXJ0MTY1NTBfdCAqdWFydCkKK3N0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9mcmVlKHN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0KQogewogCWlmICh1YXJ0LT5pcnEgPj0gMCkKLQkJZnJlZV9pcnEodWFydC0+aXJxLCAodm9pZCAqKXVhcnQpOworCQlmcmVlX2lycSh1YXJ0LT5pcnEsIHVhcnQpOwogCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UodWFydC0+cmVzX2Jhc2UpOwogCWtmcmVlKHVhcnQpOwogCXJldHVybiAwOwpAQCAtNzU4LDcgKzc3Nyw3IEBACiAKIHN0YXRpYyBpbnQgc25kX3VhcnQxNjU1MF9kZXZfZnJlZShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQogewotCXNuZF91YXJ0MTY1NTBfdCAqdWFydCA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJc3RydWN0IHNuZF91YXJ0MTY1NTAgKnVhcnQgPSBkZXZpY2UtPmRldmljZV9kYXRhOwogCXJldHVybiBzbmRfdWFydDE2NTUwX2ZyZWUodWFydCk7CiB9CiAKQEAgLTc2OSwxMiArNzg4LDEyIEBACiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBiYXNlLAogCQkJCSAgICAgICBpbnQgYWRhcHRvciwKIAkJCQkgICAgICAgaW50IGRyb3BvbmZ1bGwsCi0JCQkJICAgICAgIHNuZF91YXJ0MTY1NTBfdCAqKnJ1YXJ0KQorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqKnJ1YXJ0KQogewogCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0gewogCQkuZGV2X2ZyZWUgPQlzbmRfdWFydDE2NTUwX2Rldl9mcmVlLAogCX07Ci0Jc25kX3VhcnQxNjU1MF90ICp1YXJ0OworCXN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0OwogCWludCBlcnI7CiAKIApAQCAtNzk1LDcgKzgxNCw3IEBACiAKIAlpZiAoaXJxID49IDAgJiYgaXJxICE9IFNORFJWX0FVVE9fSVJRKSB7CiAJCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF91YXJ0MTY1NTBfaW50ZXJydXB0LAotCQkJCUlSUUZfRElTQUJMRUQsICJTZXJpYWwgTUlESSIsICh2b2lkICopIHVhcnQpKSB7CisJCQkJSVJRRl9ESVNBQkxFRCwgIlNlcmlhbCBNSURJIiwgdWFydCkpIHsKIAkJCXNuZF9wcmludGsoImlycSAlZCBidXN5LiBVc2luZyBQb2xsaW5nLlxuIiwgaXJxKTsKIAkJfSBlbHNlIHsKIAkJCXVhcnQtPmlycSA9IGlycTsKQEAgLTg0MywyMyArODYyLDI4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbmRfdWFydDE2NTUwX3N1YnN0cmVhbXMoc3RydWN0IHNuZF9yYXdtaWRpX3N0ciAqc3RyZWFtKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwogCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmc3RyZWFtLT5zdWJzdHJlYW1zKSB7Ci0JCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzdHJlYW0sICZzdHJlYW0tPnN1YnN0cmVhbXMsIGxpc3QpIHsKIAkJc3ByaW50ZihzdWJzdHJlYW0tPm5hbWUsICJTZXJpYWwgTUlESSAlZCIsIHN1YnN0cmVhbS0+bnVtYmVyICsgMSk7CiAJfQogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfdWFydDE2NTUwX3JtaWRpKHNuZF91YXJ0MTY1NTBfdCAqdWFydCwgaW50IGRldmljZSwgaW50IG91dHMsIGludCBpbnMsIHN0cnVjdCBzbmRfcmF3bWlkaSAqKnJtaWRpKQorc3RhdGljIGludCBfX2luaXQgc25kX3VhcnQxNjU1MF9ybWlkaShzdHJ1Y3Qgc25kX3VhcnQxNjU1MCAqdWFydCwgaW50IGRldmljZSwKKwkJCQkgICAgICBpbnQgb3V0cywgaW50IGlucywKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3Jhd21pZGkgKipybWlkaSkKIHsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJyYXdtaWRpOwogCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IHNuZF9yYXdtaWRpX25ldyh1YXJ0LT5jYXJkLCAiVUFSVCBTZXJpYWwgTUlESSIsIGRldmljZSwgb3V0cywgaW5zLCAmcnJhd21pZGkpKSA8IDApCisJZXJyID0gc25kX3Jhd21pZGlfbmV3KHVhcnQtPmNhcmQsICJVQVJUIFNlcmlhbCBNSURJIiwgZGV2aWNlLAorCQkJICAgICAgb3V0cywgaW5zLCAmcnJhd21pZGkpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCXNuZF9yYXdtaWRpX3NldF9vcHMocnJhd21pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX0lOUFVULCAmc25kX3VhcnQxNjU1MF9pbnB1dCk7Ci0Jc25kX3Jhd21pZGlfc2V0X29wcyhycmF3bWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVULCAmc25kX3VhcnQxNjU1MF9vdXRwdXQpOworCXNuZF9yYXdtaWRpX3NldF9vcHMocnJhd21pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX0lOUFVULAorCQkJICAgICZzbmRfdWFydDE2NTUwX2lucHV0KTsKKwlzbmRfcmF3bWlkaV9zZXRfb3BzKHJyYXdtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9PVVRQVVQsCisJCQkgICAgJnNuZF91YXJ0MTY1NTBfb3V0cHV0KTsKIAlzdHJjcHkocnJhd21pZGktPm5hbWUsICJTZXJpYWwgTUlESSIpOwogCXNuZF91YXJ0MTY1NTBfc3Vic3RyZWFtcygmcnJhd21pZGktPnN0cmVhbXNbU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVUXSk7CiAJc25kX3VhcnQxNjU1MF9zdWJzdHJlYW1zKCZycmF3bWlkaS0+c3RyZWFtc1tTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVF0pOwpAQCAtODc1LDcgKzg5OSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBzbmRfc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jc25kX3VhcnQxNjU1MF90ICp1YXJ0OworCXN0cnVjdCBzbmRfdWFydDE2NTUwICp1YXJ0OwogCWludCBlcnI7CiAJaW50IGRldiA9IGRldnB0ci0+aWQ7CiAKQEAgLTkyOSw3ICs5NTMsOCBAQAogCQkJCQkmdWFydCkpIDwgMCkKIAkJZ290byBfZXJyOwogCi0JaWYgKChlcnIgPSBzbmRfdWFydDE2NTUwX3JtaWRpKHVhcnQsIDAsIG91dHNbZGV2XSwgaW5zW2Rldl0sICZ1YXJ0LT5ybWlkaSkpIDwgMCkKKwllcnIgPSBzbmRfdWFydDE2NTUwX3JtaWRpKHVhcnQsIDAsIG91dHNbZGV2XSwgaW5zW2Rldl0sICZ1YXJ0LT5ybWlkaSk7CisJaWYgKGVyciA8IDApCiAJCWdvdG8gX2VycjsKIAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVkIHNwZWVkICVkIGRpdiAlZCBvdXRzICVkIGlucyAlZCBhZGFwdG9yICVzIGRyb3BvbmZ1bGwgJWQiLApkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy92eC92eF9taXhlci5jIGIvc291bmQvZHJpdmVycy92eC92eF9taXhlci5jCmluZGV4IDE2MTNlZDguLmY2MzE1MmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvdngvdnhfbWl4ZXIuYworKysgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X21peGVyLmMKQEAgLTcxNiw3ICs3MTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYXVkaW9fZ2FpbiwgLTEwOTc1LCAyNSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYXVkaW9fZ2FpbiwgLTEwOTc1LCAyNSwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2eF9jb250cm9sX2F1ZGlvX2dhaW4gPSB7CiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvTWFrZWZpbGUgYi9zb3VuZC9pMmMvTWFrZWZpbGUKaW5kZXggODE2YTJlNy4uNDU5MDJkNCAxMDA2NDQKLS0tIGEvc291bmQvaTJjL01ha2VmaWxlCisrKyBiL3NvdW5kL2kyYy9NYWtlZmlsZQpAQCAtMTYsMyArMTYsNCBAQAogIyBUb3BsZXZlbCBNb2R1bGUgRGVwZW5kZW5jeQogb2JqLSQoQ09ORklHX1NORF9JTlRFUldBVkVfU1RCKSArPSBzbmQtdGVhNjMzMHQubyBzbmQtaTJjLm8KIG9iai0kKENPTkZJR19TTkRfSUNFMTcxMikgKz0gc25kLWNzODQyNy5vIHNuZC1pMmMubworb2JqLSQoQ09ORklHX1NORF9JQ0UxNzI0KSArPSBzbmQtaTJjLm8KZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9NYWtlZmlsZSBiL3NvdW5kL2kyYy9vdGhlci9NYWtlZmlsZQppbmRleCAyZmUwMjNlZi4uNzdhOGE3YyAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL01ha2VmaWxlCisrKyBiL3NvdW5kL2kyYy9vdGhlci9NYWtlZmlsZQpAQCAtNiwxMSArNiwxMSBAQAogc25kLWFrNDExNC1vYmpzIDo9IGFrNDExNC5vCiBzbmQtYWs0MTE3LW9ianMgOj0gYWs0MTE3Lm8KIHNuZC1hazR4eHgtYWRkYS1vYmpzIDo9IGFrNHh4eC1hZGRhLm8KK3NuZC1wdDIyNTgtb2JqcyA6PSBwdDIyNTgubwogc25kLXRlYTU3NXgtdHVuZXItb2JqcyA6PSB0ZWE1NzV4LXR1bmVyLm8KIAogIyBNb2R1bGUgRGVwZW5kZW5jeQogb2JqLSQoQ09ORklHX1NORF9QREFVRElPQ0YpICs9IHNuZC1hazQxMTcubwogb2JqLSQoQ09ORklHX1NORF9JQ0UxNzEyKSArPSBzbmQtYWs0eHh4LWFkZGEubwotb2JqLSQoQ09ORklHX1NORF9JQ0UxNzI0KSArPSBzbmQtYWs0eHh4LWFkZGEubwotb2JqLSQoQ09ORklHX1NORF9JQ0UxNzI0KSArPSBzbmQtYWs0MTE0Lm8KK29iai0kKENPTkZJR19TTkRfSUNFMTcyNCkgKz0gc25kLWFrNDExNC5vIHNuZC1hazR4eHgtYWRkYS5vIHNuZC1wdDIyNTgubwogb2JqLSQoQ09ORklHX1NORF9GTTgwMV9URUE1NzVYKSArPSBzbmQtdGVhNTc1eC10dW5lci5vCmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKaW5kZXggZDJmMmM1MC4uYWRiZmQ1OCAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL2FrNDExNC5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYwpAQCAtNDIsOCArNDIsOCBAQAogCWFrNDExNC0+d3JpdGUoYWs0MTE0LT5wcml2YXRlX2RhdGEsIHJlZywgdmFsKTsKIAlpZiAocmVnIDw9IEFLNDExNF9SRUdfSU5UMV9NQVNLKQogCQlhazQxMTQtPnJlZ21hcFtyZWddID0gdmFsOwotCWVsc2UgaWYgKHJlZyA+PSBBSzQxMTRfUkVHX1JYQ1NCMCAmJiByZWcgPD0gQUs0MTE0X1JFR19UWENTQjQpCi0JCWFrNDExNC0+dHhjc2JbcmVnLUFLNDExNF9SRUdfUlhDU0IwXSA9IHZhbDsKKwllbHNlIGlmIChyZWcgPj0gQUs0MTE0X1JFR19UWENTQjAgJiYgcmVnIDw9IEFLNDExNF9SRUdfVFhDU0I0KQorCQlhazQxMTQtPnR4Y3NiW3JlZy1BSzQxMTRfUkVHX1RYQ1NCMF0gPSB2YWw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWdfcmVhZChzdHJ1Y3QgYWs0MTE0ICphazQxMTQsIHVuc2lnbmVkIGNoYXIgcmVnKQpAQCAtNjYsMTAgKzY2LDggQEAKIHsKIAljaGlwLT5pbml0ID0gMTsJLyogZG9uJ3Qgc2NoZWR1bGUgbmV3IHdvcmsgKi8KIAltYigpOwotCWlmIChjaGlwLT53b3JrcXVldWUgIT0gTlVMTCkgewotCQlmbHVzaF93b3JrcXVldWUoY2hpcC0+d29ya3F1ZXVlKTsKLQkJZGVzdHJveV93b3JrcXVldWUoY2hpcC0+d29ya3F1ZXVlKTsKLQl9CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmY2hpcC0+d29yayk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAlrZnJlZShjaGlwKTsKIH0KIApAQCAtODIsNyArODAsNyBAQAogCiBpbnQgc25kX2FrNDExNF9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkgICAgICBhazQxMTRfcmVhZF90ICpyZWFkLCBhazQxMTRfd3JpdGVfdCAqd3JpdGUsCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgcGdtWzddLCB1bnNpZ25lZCBjaGFyIHR4Y3NiWzVdLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIHBnbVs3XSwgY29uc3QgdW5zaWduZWQgY2hhciB0eGNzYls1XSwKIAkJICAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgYWs0MTE0ICoqcl9hazQxMTQpCiB7CiAJc3RydWN0IGFrNDExNCAqY2hpcDsKQEAgLTEwMCwxOCArOTgsMTMgQEAKIAljaGlwLT5yZWFkID0gcmVhZDsKIAljaGlwLT53cml0ZSA9IHdyaXRlOwogCWNoaXAtPnByaXZhdGVfZGF0YSA9IHByaXZhdGVfZGF0YTsKKwlJTklUX0RFTEFZRURfV09SSygmY2hpcC0+d29yaywgYWs0MTE0X3N0YXRzKTsKIAogCWZvciAocmVnID0gMDsgcmVnIDwgNzsgcmVnKyspCiAJCWNoaXAtPnJlZ21hcFtyZWddID0gcGdtW3JlZ107CiAJZm9yIChyZWcgPSAwOyByZWcgPCA1OyByZWcrKykKIAkJY2hpcC0+dHhjc2JbcmVnXSA9IHR4Y3NiW3JlZ107CiAKLQljaGlwLT53b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJzbmQtYWs0MTE0Iik7Ci0JaWYgKGNoaXAtPndvcmtxdWV1ZSA9PSBOVUxMKSB7Ci0JCWtmcmVlKGNoaXApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAlzbmRfYWs0MTE0X3JlaW5pdChjaGlwKTsKIAogCWNoaXAtPnJjczAgPSByZWdfcmVhZChjaGlwLCBBSzQxMTRfUkVHX1JDUzApICYgfihBSzQxMTRfUUlOVCB8IEFLNDExNF9DSU5UKTsKQEAgLTEzNCw3ICsxMjcsOCBAQAogCWlmIChyZWcgPD0gQUs0MTE0X1JFR19JTlQxX01BU0spCiAJCXJlZ193cml0ZShjaGlwLCByZWcsIChjaGlwLT5yZWdtYXBbcmVnXSAmIH5tYXNrKSB8IHZhbCk7CiAJZWxzZSBpZiAocmVnID49IEFLNDExNF9SRUdfVFhDU0IwICYmIHJlZyA8PSBBSzQxMTRfUkVHX1RYQ1NCNCkKLQkJcmVnX3dyaXRlKGNoaXAsIHJlZywgKGNoaXAtPnR4Y3NiW3JlZ10gJiB+bWFzaykgfCB2YWwpOworCQlyZWdfd3JpdGUoY2hpcCwgcmVnLAorCQkJICAoY2hpcC0+dHhjc2JbcmVnLUFLNDExNF9SRUdfVFhDU0IwXSAmIH5tYXNrKSB8IHZhbCk7CiB9CiAKIHZvaWQgc25kX2FrNDExNF9yZWluaXQoc3RydWN0IGFrNDExNCAqY2hpcCkKQEAgLTE0Myw3ICsxMzcsNyBAQAogCiAJY2hpcC0+aW5pdCA9IDE7CiAJbWIoKTsKLQlmbHVzaF93b3JrcXVldWUoY2hpcC0+d29ya3F1ZXVlKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCS8qIGJyaW5nIHRoZSBjaGlwIHRvIHJlc2V0IHN0YXRlIGFuZCBwb3dlcmRvd24gc3RhdGUgKi8KIAlyZWdfd3JpdGUoY2hpcCwgQUs0MTE0X1JFR19QV1JETiwgb2xkICYgfihBSzQxMTRfUlNUfEFLNDExNF9QV04pKTsKIAl1ZGVsYXkoMjAwKTsKQEAgLTE1OCw4ICsxNTIsNyBAQAogCXJlZ193cml0ZShjaGlwLCBBSzQxMTRfUkVHX1BXUkROLCBvbGQgfCBBSzQxMTRfUlNUIHwgQUs0MTE0X1BXTik7CiAJLyogYnJpbmcgdXAgc3RhdGlzdGljcyAvIGV2ZW50IHF1ZWluZyAqLwogCWNoaXAtPmluaXQgPSAwOwotCUlOSVRfREVMQVlFRF9XT1JLKCZjaGlwLT53b3JrLCBhazQxMTRfc3RhdHMpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhjaGlwLT53b3JrcXVldWUsICZjaGlwLT53b3JrLCBIWiAvIDEwKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoaXAtPndvcmssIEhaIC8gMTApOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGV4dGVybmFsX3JhdGUodW5zaWduZWQgY2hhciByY3MxKQpAQCAtNTY4LDcgKzU2MSw3IEBACiAJaWYgKGNoaXAtPmluaXQpCiAJCXJldHVybjsKIAlzbmRfYWs0MTE0X2NoZWNrX3JhdGVfYW5kX2Vycm9ycyhjaGlwLCAwKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoY2hpcC0+d29ya3F1ZXVlLCAmY2hpcC0+d29yaywgSFogLyAxMCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT53b3JrLCBIWiAvIDEwKTsKIH0KIAogRVhQT1JUX1NZTUJPTChzbmRfYWs0MTE0X2NyZWF0ZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMKaW5kZXggNGU0NTk1Mi4uYzAyMmYyOSAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL2FrNDExNy5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYwpAQCAtNzQsNyArNzQsNyBAQAogfQogCiBpbnQgc25kX2FrNDExN19jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBhazQxMTdfcmVhZF90ICpyZWFkLCBhazQxMTdfd3JpdGVfdCAqd3JpdGUsCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgcGdtWzVdLCB2b2lkICpwcml2YXRlX2RhdGEsIHN0cnVjdCBhazQxMTcgKipyX2FrNDExNykKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBwZ21bNV0sIHZvaWQgKnByaXZhdGVfZGF0YSwgc3RydWN0IGFrNDExNyAqKnJfYWs0MTE3KQogewogCXN0cnVjdCBhazQxMTcgKmNoaXA7CiAJaW50IGVyciA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0eHh4LWFkZGEuYyBiL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCmluZGV4IDVkYTQ5ZTIuLjg4MDUxMTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCkBAIC0xNDAsNyArMTQwLDcgQEAKICAqIFVzZWQgZm9yIEFLNDUyNCBpbnB1dC9vdXB1dCBhdHRlbnVhdGlvbiwgQUs0NTI4LCBhbmQKICAqIEFLNTM2NSBpbnB1dCBhdHRlbnVhdGlvbgogICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciB2b2xfY3Z0X2RhdHRbMTI4XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHZvbF9jdnRfZGF0dFsxMjhdID0gewogCTB4MDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDQsCiAJMHgwNCwgMHgwNCwgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNiwgMHgwNiwKIAkweDA2LCAweDA3LCAweDA3LCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDBhLApAQCAtMTYyLDE3ICsxNjIsMTcgQEAKIC8qCiAgKiBkQiB0YWJsZXMKICAqLwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3ZvbF9kYXR0LCAtNjM1MCwgNTAsIDEpOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzhiaXQsIC0xMjc1MCwgNTAsIDEpOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzdiaXQsIC02MzUwLCA1MCwgMSk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfTElORUFSKGRiX3NjYWxlX2xpbmVhciwgVExWX0RCX0dBSU5fTVVURSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfdm9sX2RhdHQsIC02MzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfOGJpdCwgLTEyNzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfN2JpdCwgLTYzNTAsIDUwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoZGJfc2NhbGVfbGluZWFyLCBUTFZfREJfR0FJTl9NVVRFLCAwKTsKIAogLyoKICAqIGluaXRpYWxpemUgYWxsIHRoZSBhazR4eHggY2hpcHMKICAqLwogdm9pZCBzbmRfYWttNHh4eF9pbml0KHN0cnVjdCBzbmRfYWttNHh4eCAqYWspCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5pdHNfYWs0NTI0W10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdHNfYWs0NTI0W10gPSB7CiAJCTB4MDAsIDB4MDcsIC8qIDA6IGFsbCBwb3dlciB1cCAqLwogCQkweDAxLCAweDAwLCAvKiAxOiBBREMvREFDIHJlc2V0ICovCiAJCTB4MDIsIDB4NjAsIC8qIDI6IDI0Yml0IEkyUyAqLwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCTB4MDcsIDB4MDAsIC8qIDc6IERBQyByaWdodCBtdXRlZCAqLwogCQkweGZmLCAweGZmCiAJfTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBpbml0c19hazQ1MjhbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0c19hazQ1MjhbXSA9IHsKIAkJMHgwMCwgMHgwNywgLyogMDogYWxsIHBvd2VyIHVwICovCiAJCTB4MDEsIDB4MDAsIC8qIDE6IEFEQy9EQUMgcmVzZXQgKi8KIAkJMHgwMiwgMHg2MCwgLyogMjogMjRiaXQgSTJTICovCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJMHgwNSwgMHgwMCwgLyogNTogQURDIHJpZ2h0IG11dGVkICovCiAJCTB4ZmYsIDB4ZmYKIAl9OwotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGluaXRzX2FrNDUyOVtdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGluaXRzX2FrNDUyOVtdID0gewogCQkweDA5LCAweDAxLCAvKiA5OiBBVFM9MCwgUlNUTj0xICovCiAJCTB4MGEsIDB4M2YsIC8qIEE6IGFsbCBwb3dlciB1cCwgbm8gemVyby9vdmVyZmxvdyBkZXRlY3Rpb24gKi8KIAkJMHgwMCwgMHgwYywgLyogMDogVERNPTAsIDI0Yml0IEkyUywgU01VVEU9MCAqLwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJCTB4MDgsIDB4NTUsIC8qIDg6IGRlZW1waGFzaXMgYWxsIG9mZiAqLwogCQkweGZmLCAweGZmCiAJfTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBpbml0c19hazQzNTVbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbml0c19hazQzNTVbXSA9IHsKIAkJMHgwMSwgMHgwMiwgLyogMTogcmVzZXQgYW5kIHNvZnQtbXV0ZSAqLwogCQkweDAwLCAweDA2LCAvKiAwOiBtb2RlMyhpMnMpLCBkaXNhYmxlIGF1dG8tY2xvY2sgZGV0ZWN0LAogCQkJICAgICAqIGRpc2FibGUgRFpGLCBzaGFycCByb2xsLW9mZiwgUlNUTiM9MCAqLwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCTB4MDEsIDB4MDEsIC8qIDE6IHVuLXJlc2V0LCB1bm11dGUgKi8KIAkJMHhmZiwgMHhmZgogCX07Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5pdHNfYWs0MzU4W10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5pdHNfYWs0MzU4W10gPSB7CiAJCTB4MDEsIDB4MDIsIC8qIDE6IHJlc2V0IGFuZCBzb2Z0LW11dGUgKi8KIAkJMHgwMCwgMHgwNiwgLyogMDogbW9kZTMoaTJzKSwgZGlzYWJsZSBhdXRvLWNsb2NrIGRldGVjdCwKIAkJCSAgICAgKiBkaXNhYmxlIERaRiwgc2hhcnAgcm9sbC1vZmYsIFJTVE4jPTAgKi8KQEAgLTI0Niw3ICsyNDYsNyBAQAogCQkweDAxLCAweDAxLCAvKiAxOiB1bi1yZXNldCwgdW5tdXRlICovCiAJCTB4ZmYsIDB4ZmYKIAl9OwotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGluaXRzX2FrNDM4MVtdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGluaXRzX2FrNDM4MVtdID0gewogCQkweDAwLCAweDBjLCAvKiAwOiBtb2RlMyhpMnMpLCBkaXNhYmxlIGF1dG8tY2xvY2sgZGV0ZWN0ICovCiAJCTB4MDEsIDB4MDIsIC8qIDE6IGRlLWVtcGhhc2lzIG9mZiwgbm9ybWFsIHNwZWVkLAogCQkJICAgICAqIHNoYXJwIHJvbGwtb2ZmLCBEWkYgb2ZmICovCkBAIC0yNTksNyArMjU5LDggQEAKIAl9OwogCiAJaW50IGNoaXAsIG51bV9jaGlwczsKLQl1bnNpZ25lZCBjaGFyICpwdHIsIHJlZywgZGF0YSwgKmluaXRzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgKmluaXRzOworCXVuc2lnbmVkIGNoYXIgcmVnLCBkYXRhOwogCiAJbWVtc2V0KGFrLT5pbWFnZXMsIDAsIHNpemVvZihhay0+aW1hZ2VzKSk7CiAJbWVtc2V0KGFrLT52b2x1bWVzLCAwLCBzaXplb2YoYWstPnZvbHVtZXMpKTsKQEAgLTUxMyw2ICs1MTQsNjYgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCisjZGVmaW5lIEFLNTM2NV9OVU1fSU5QVVRTIDUKKworc3RhdGljIGludCBhazR4eHhfY2FwdHVyZV9zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBzbmRfYWttNHh4eCAqYWsgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IG1peGVyX2NoID0gQUtfR0VUX1NISUZUKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwljb25zdCBjaGFyICoqaW5wdXRfbmFtZXM7CisJaW50ICBudW1fbmFtZXMsIGlkeDsKKworCWlucHV0X25hbWVzID0gYWstPmFkY19pbmZvW21peGVyX2NoXS5pbnB1dF9uYW1lczsKKworCW51bV9uYW1lcyA9IDA7CisJd2hpbGUgKG51bV9uYW1lcyA8IEFLNTM2NV9OVU1fSU5QVVRTICYmIGlucHV0X25hbWVzW251bV9uYW1lc10pCisJCSsrbnVtX25hbWVzOworCQorCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBudW1fbmFtZXM7CisJaWR4ID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbTsKKwlpZiAoaWR4ID49IG51bV9uYW1lcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RybmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCBpbnB1dF9uYW1lc1tpZHhdLAorCQlzaXplb2YodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFrNHh4eF9jYXB0dXJlX3NvdXJjZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2FrbTR4eHggKmFrID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGlwID0gQUtfR0VUX0NISVAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCWludCBhZGRyID0gQUtfR0VUX0FERFIoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCWludCBtYXNrID0gQUtfR0VUX01BU0soa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJdmFsID0gc25kX2FrbTR4eHhfZ2V0KGFrLCBjaGlwLCBhZGRyKSAmIG1hc2s7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhazR4eHhfY2FwdHVyZV9zb3VyY2VfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9ha200eHh4ICphayA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hpcCA9IEFLX0dFVF9DSElQKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlpbnQgYWRkciA9IEFLX0dFVF9BRERSKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlpbnQgbWFzayA9IEFLX0dFVF9NQVNLKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwl1bnNpZ25lZCBjaGFyIG92YWwsIHZhbDsKKworCW92YWwgPSBzbmRfYWttNHh4eF9nZXQoYWssIGNoaXAsIGFkZHIpOworCXZhbCA9IG92YWwgJiB+bWFzazsKKwl2YWwgfD0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAmIG1hc2s7CisJaWYgKHZhbCAhPSBvdmFsKSB7CisJCXNuZF9ha200eHh4X3dyaXRlKGFrLCBjaGlwLCBhZGRyLCB2YWwpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBidWlsZCBBSzR4eHggY29udHJvbHMKICAqLwpAQCAtNjQ3LDkgKzcwOCwxMCBAQAogCiAJCWlmIChhay0+dHlwZSA9PSBTTkRfQUs1MzY1ICYmIChpZHggJSAyKSA9PSAwKSB7CiAJCQlpZiAoISBhay0+YWRjX2luZm8gfHwgCi0JCQkgICAgISBhay0+YWRjX2luZm9bbWl4ZXJfY2hdLnN3aXRjaF9uYW1lKQorCQkJICAgICEgYWstPmFkY19pbmZvW21peGVyX2NoXS5zd2l0Y2hfbmFtZSkgewogCQkJCWtuZXcubmFtZSA9ICJDYXB0dXJlIFN3aXRjaCI7Ci0JCQllbHNlCisJCQkJa25ldy5pbmRleCA9IG1peGVyX2NoICsgYWstPmlkeF9vZmZzZXQgKiAyOworCQkJfSBlbHNlCiAJCQkJa25ldy5uYW1lID0gYWstPmFkY19pbmZvW21peGVyX2NoXS5zd2l0Y2hfbmFtZTsKIAkJCWtuZXcuaW5mbyA9IGFrNHh4eF9zd2l0Y2hfaW5mbzsKIAkJCWtuZXcuZ2V0ID0gYWs0eHh4X3N3aXRjaF9nZXQ7CkBAIC02NjIsNiArNzI0LDI2IEBACiAJCQllcnIgPSBzbmRfY3RsX2FkZChhay0+Y2FyZCwgc25kX2N0bF9uZXcxKCZrbmV3LCBhaykpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKKworCQkJbWVtc2V0KCZrbmV3LCAwLCBzaXplb2Yoa25ldykpOworCQkJa25ldy5uYW1lID0gYWstPmFkY19pbmZvW21peGVyX2NoXS5zZWxlY3Rvcl9uYW1lOworCQkJaWYgKCFrbmV3Lm5hbWUpIHsKKwkJCQlrbmV3Lm5hbWUgPSAiQ2FwdHVyZSBDaGFubmVsIjsKKwkJCQlrbmV3LmluZGV4ID0gbWl4ZXJfY2ggKyBhay0+aWR4X29mZnNldCAqIDI7CisJCQl9CisKKwkJCWtuZXcuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwkJCWtuZXcuaW5mbyA9IGFrNHh4eF9jYXB0dXJlX3NvdXJjZV9pbmZvOworCQkJa25ldy5nZXQgPSBhazR4eHhfY2FwdHVyZV9zb3VyY2VfZ2V0OworCQkJa25ldy5wdXQgPSBhazR4eHhfY2FwdHVyZV9zb3VyY2VfcHV0OworCQkJa25ldy5hY2Nlc3MgPSAwOworCQkJLyogaW5wdXQgc2VsZWN0b3IgY29udHJvbDogcmVnLiAxLCBiaXRzIDAtMi4KKwkJCSAqIG1pcy11c2UgJ3NoaWZ0JyB0byBwYXNzIG1peGVyX2NoICovCisJCQlrbmV3LnByaXZhdGVfdmFsdWUKKwkJCQk9IEFLX0NPTVBPU0UoaWR4LzIsIDEsIG1peGVyX2NoLCAweDA3KTsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGFrLT5jYXJkLCBzbmRfY3RsX25ldzEoJmtuZXcsIGFrKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOwogCQl9CiAKIAkJaWR4ICs9IG51bV9zdGVyZW87CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvcHQyMjU4LmMgYi9zb3VuZC9pMmMvb3RoZXIvcHQyMjU4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxY2MzYgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2kyYy9vdGhlci9wdDIyNTguYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqICAgQUxTQSBEcml2ZXIgZm9yIHRoZSBQVDIyNTggdm9sdW1lIGNvbnRyb2xsZXIuCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDA2ICBKb2NoZW4gVm9zcyA8dm9zc0BzZWVodWhuLmRlPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8gICAgICAKKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8c291bmQvaTJjLmg+CisjaW5jbHVkZSA8c291bmQvcHQyMjU4Lmg+CisKK01PRFVMRV9BVVRIT1IoIkpvY2hlbiBWb3NzIDx2b3NzQHNlZWh1aG4uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBUMjI1OCB2b2x1bWUgY29udHJvbGxlciAoUHJpbmNldG9uIFRlY2hub2xvZ3kgQ29ycC4pIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgUFQyMjU4X0NNRF9SRVNFVCAweGMwCisjZGVmaW5lIFBUMjI1OF9DTURfVU5NVVRFIDB4ZjgKKyNkZWZpbmUgUFQyMjU4X0NNRF9NVVRFIDB4ZjkKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHQyMjU4X2NoYW5uZWxfY29kZVsxMl0gPSB7CisJMHg4MCwgMHg5MCwJCS8qIGNoYW5uZWwgMTogLTEwZEIsIC0xZEIgKi8KKwkweDQwLCAweDUwLAkJLyogY2hhbm5lbCAyOiAtMTBkQiwgLTFkQiAqLworCTB4MDAsIDB4MTAsCQkvKiBjaGFubmVsIDM6IC0xMGRCLCAtMWRCICovCisJMHgyMCwgMHgzMCwJCS8qIGNoYW5uZWwgNDogLTEwZEIsIC0xZEIgKi8KKwkweDYwLCAweDcwLAkJLyogY2hhbm5lbCA1OiAtMTBkQiwgLTFkQiAqLworCTB4YTAsIDB4YjAJCS8qIGNoYW5uZWwgNjogLTEwZEIsIC0xZEIgKi8KK307CisKK2ludCBzbmRfcHQyMjU4X3Jlc2V0KHN0cnVjdCBzbmRfcHQyMjU4ICpwdCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ5dGVzWzJdOworCWludCBpOworCisJLyogcmVzZXQgY2hpcCAqLworCWJ5dGVzWzBdID0gUFQyMjU4X0NNRF9SRVNFVDsKKwlzbmRfaTJjX2xvY2socHQtPmkyY19idXMpOworCWlmIChzbmRfaTJjX3NlbmRieXRlcyhwdC0+aTJjX2RldiwgYnl0ZXMsIDEpICE9IDEpCisJCWdvdG8gX19lcnJvcjsKKwlzbmRfaTJjX3VubG9jayhwdC0+aTJjX2J1cyk7CisKKwkvKiBtdXRlIGFsbCBjaGFubmVscyAqLworCXB0LT5tdXRlID0gMTsKKwlieXRlc1swXSA9IFBUMjI1OF9DTURfTVVURTsKKwlzbmRfaTJjX2xvY2socHQtPmkyY19idXMpOworCWlmIChzbmRfaTJjX3NlbmRieXRlcyhwdC0+aTJjX2RldiwgYnl0ZXMsIDEpICE9IDEpCisJCWdvdG8gX19lcnJvcjsKKwlzbmRfaTJjX3VubG9jayhwdC0+aTJjX2J1cyk7CisKKwkvKiBzZXQgYWxsIGNoYW5uZWxzIHRvIDBkQiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpCisJCXB0LT52b2x1bWVbaV0gPSAwOworCWJ5dGVzWzBdID0gMHhkMDsKKwlieXRlc1sxXSA9IDB4ZTA7CisJc25kX2kyY19sb2NrKHB0LT5pMmNfYnVzKTsKKwlpZiAoc25kX2kyY19zZW5kYnl0ZXMocHQtPmkyY19kZXYsIGJ5dGVzLCAyKSAhPSAyKQorCQlnb3RvIF9fZXJyb3I7CisJc25kX2kyY191bmxvY2socHQtPmkyY19idXMpOworCisJcmV0dXJuIDA7CisKKyAgICAgIF9fZXJyb3I6CisJc25kX2kyY191bmxvY2socHQtPmkyY19idXMpOworCXNuZF9wcmludGsoS0VSTl9FUlIgIlBUMjI1OCByZXNldCBmYWlsZWRcbiIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IHB0MjI1OF9zdGVyZW9fdm9sdW1lX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSA3OTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdDIyNThfc3RlcmVvX3ZvbHVtZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfcHQyMjU4ICpwdCA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisJaW50IGJhc2UgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCS8qIGNoaXAgZG9lcyBub3Qgc3VwcG9ydCByZWdpc3RlciByZWFkcyAqLworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gNzkgLSBwdC0+dm9sdW1lW2Jhc2VdOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gNzkgLSBwdC0+dm9sdW1lW2Jhc2UgKyAxXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdDIyNThfc3RlcmVvX3ZvbHVtZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfcHQyMjU4ICpwdCA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisJaW50IGJhc2UgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBjaGFyIGJ5dGVzWzJdOworCWludCB2YWwwLCB2YWwxOworCisJdmFsMCA9IDc5IC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJdmFsMSA9IDc5IC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJaWYgKHZhbDAgPT0gcHQtPnZvbHVtZVtiYXNlXSAmJiB2YWwxID09IHB0LT52b2x1bWVbYmFzZSArIDFdKQorCQlyZXR1cm4gMDsKKworCXB0LT52b2x1bWVbYmFzZV0gPSB2YWwwOworCWJ5dGVzWzBdID0gcHQyMjU4X2NoYW5uZWxfY29kZVsyICogYmFzZV0gfCAodmFsMCAvIDEwKTsKKwlieXRlc1sxXSA9IHB0MjI1OF9jaGFubmVsX2NvZGVbMiAqIGJhc2UgKyAxXSB8ICh2YWwwICUgMTApOworCXNuZF9pMmNfbG9jayhwdC0+aTJjX2J1cyk7CisJaWYgKHNuZF9pMmNfc2VuZGJ5dGVzKHB0LT5pMmNfZGV2LCBieXRlcywgMikgIT0gMikKKwkJZ290byBfX2Vycm9yOworCXNuZF9pMmNfdW5sb2NrKHB0LT5pMmNfYnVzKTsKKworCXB0LT52b2x1bWVbYmFzZSArIDFdID0gdmFsMTsKKwlieXRlc1swXSA9IHB0MjI1OF9jaGFubmVsX2NvZGVbMiAqIGJhc2UgKyAyXSB8ICh2YWwxIC8gMTApOworCWJ5dGVzWzFdID0gcHQyMjU4X2NoYW5uZWxfY29kZVsyICogYmFzZSArIDNdIHwgKHZhbDEgJSAxMCk7CisJc25kX2kyY19sb2NrKHB0LT5pMmNfYnVzKTsKKwlpZiAoc25kX2kyY19zZW5kYnl0ZXMocHQtPmkyY19kZXYsIGJ5dGVzLCAyKSAhPSAyKQorCQlnb3RvIF9fZXJyb3I7CisJc25kX2kyY191bmxvY2socHQtPmkyY19idXMpOworCisJcmV0dXJuIDE7CisKKyAgICAgIF9fZXJyb3I6CisJc25kX2kyY191bmxvY2socHQtPmkyY19idXMpOworCXNuZF9wcmludGsoS0VSTl9FUlIgIlBUMjI1OCBhY2Nlc3MgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBwdDIyNThfc3dpdGNoX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB0MjI1OF9zd2l0Y2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3B0MjI1OCAqcHQgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAhcHQtPm11dGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHQyMjU4X3N3aXRjaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfcHQyMjU4ICpwdCA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgY2hhciBieXRlc1syXTsKKwlpbnQgdmFsOworCisJdmFsID0gIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWlmIChwdC0+bXV0ZSA9PSB2YWwpCisJCXJldHVybiAwOworCisJcHQtPm11dGUgPSB2YWw7CisJYnl0ZXNbMF0gPSB2YWwgPyBQVDIyNThfQ01EX01VVEUgOiBQVDIyNThfQ01EX1VOTVVURTsKKwlzbmRfaTJjX2xvY2socHQtPmkyY19idXMpOworCWlmIChzbmRfaTJjX3NlbmRieXRlcyhwdC0+aTJjX2RldiwgYnl0ZXMsIDEpICE9IDEpCisJCWdvdG8gX19lcnJvcjsKKwlzbmRfaTJjX3VubG9jayhwdC0+aTJjX2J1cyk7CisKKwlyZXR1cm4gMTsKKworICAgICAgX19lcnJvcjoKKwlzbmRfaTJjX3VubG9jayhwdC0+aTJjX2J1cyk7CisJc25kX3ByaW50ayhLRVJOX0VSUiAiUFQyMjU4IGFjY2VzcyBmYWlsZWQgMlxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShwdDIyNThfZGJfc2NhbGUsIC03OTAwLCAxMDAsIDApOworCitpbnQgc25kX3B0MjI1OF9idWlsZF9jb250cm9scyhzdHJ1Y3Qgc25kX3B0MjI1OCAqcHQpCit7CisJc3RydWN0IHNuZF9rY29udHJvbF9uZXcga25ldzsKKwljaGFyICpuYW1lc1szXSA9IHsKKwkJIk1pYyBMb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLAorCQkiTGluZSBMb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLAorCQkiQ0QgTG9vcGJhY2sgUGxheWJhY2sgVm9sdW1lIgorCX07CisJaW50IGksIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKwkJbWVtc2V0KCZrbmV3LCAwLCBzaXplb2Yoa25ldykpOworCQlrbmV3Lm5hbWUgPSBuYW1lc1tpXTsKKwkJa25ldy5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSOworCQlrbmV3LmNvdW50ID0gMTsKKwkJa25ldy5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKKwkJICAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRDsKKwkJa25ldy5wcml2YXRlX3ZhbHVlID0gMiAqIGk7CisJCWtuZXcuaW5mbyA9IHB0MjI1OF9zdGVyZW9fdm9sdW1lX2luZm87CisJCWtuZXcuZ2V0ID0gcHQyMjU4X3N0ZXJlb192b2x1bWVfZ2V0OworCQlrbmV3LnB1dCA9IHB0MjI1OF9zdGVyZW9fdm9sdW1lX3B1dDsKKwkJa25ldy50bHYucCA9IHB0MjI1OF9kYl9zY2FsZTsKKworCQllcnIgPSBzbmRfY3RsX2FkZChwdC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZrbmV3LCBwdCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJbWVtc2V0KCZrbmV3LCAwLCBzaXplb2Yoa25ldykpOworCWtuZXcubmFtZSA9ICJMb29wYmFjayBTd2l0Y2giOworCWtuZXcuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjsKKwlrbmV3LmluZm8gPSBwdDIyNThfc3dpdGNoX2luZm87CisJa25ldy5nZXQgPSBwdDIyNThfc3dpdGNoX2dldDsKKwlrbmV3LnB1dCA9IHB0MjI1OF9zd2l0Y2hfcHV0OworCWtuZXcuYWNjZXNzID0gMDsKKwllcnIgPSBzbmRfY3RsX2FkZChwdC0+Y2FyZCwgc25kX2N0bF9uZXcxKCZrbmV3LCBwdCkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc25kX3B0MjI1OF9yZXNldCk7CitFWFBPUlRfU1lNQk9MKHNuZF9wdDIyNThfYnVpbGRfY29udHJvbHMpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL0tjb25maWcgYi9zb3VuZC9pc2EvS2NvbmZpZwppbmRleCA1NzM3MWYxLi40ZTNhOTcyIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvS2NvbmZpZworKysgYi9zb3VuZC9pc2EvS2NvbmZpZwpAQCAtMzU4LDYgKzM1OCw3IEBACiBjb25maWcgU05EX1NCMTZfQ1NQCiAJYm9vbCAiU291bmQgQmxhc3RlciAxNi9BV0UgQ1NQIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiAoU05EX1NCMTYgfHwgU05EX1NCQVdFKSAmJiAoQlJPS0VOIHx8ICFQUEMpCisJc2VsZWN0IEZXX0xPQURFUgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgQ1NQIGNvcmUuICBUaGlzIHNwZWNpYWwKIAkgIGNvcHJvY2Vzc29yIGNhbiBkbyB2YXJpYWJsZSB0YXNrcyBsaWtlIHZhcmlvdXMgY29tcHJlc3Npb24gYW5kCkBAIC0zOTAsNiArMzkxLDcgQEAKIGNvbmZpZyBTTkRfV0FWRUZST05UCiAJdHJpc3RhdGUgIlR1cnRsZSBCZWFjaCBNYXVpLFRyb3BleixUcm9wZXorIChXYXZlZnJvbnQpIgogCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfT1BMM19MSUIKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCiAJc2VsZWN0IFNORF9DUzQyMzFfTElCCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhX2xpYi5jIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YV9saWIuYwppbmRleCBiNTI0ZTBkLi5lYzkyMDljIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhX2xpYi5jCisrKyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmFfbGliLmMKQEAgLTkwNiwxMSArOTA2LDExIEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzRiaXQsIC00NTAwLCAzMDAsIDApOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXQsIC00NjUwLCAxNTAsIDApOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzZiaXQsIC05NDUwLCAxNTAsIDApOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXRfMTJkYl9tYXgsIC0zNDUwLCAxNTAsIDApOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3JlY19nYWluLCAwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzRiaXQsIC00NTAwLCAzMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXQsIC00NjUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzZiaXQsIC05NDUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXRfMTJkYl9tYXgsIC0zNDUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3JlY19nYWluLCAwLCAxNTAsIDApOwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FkMTgxNmFfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogQUQxODE2QV9ET1VCTEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCBBRDE4MTZBX01BU1RFUl9BVFQsIDE1LCA3LCAxLCAxKSwKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4X2xpYi5jIGIvc291bmQvaXNhL2FkMTg0OC9hZDE4NDhfbGliLmMKaW5kZXggNjY2YjNiYy4uODA5NDI4MiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDhfbGliLmMKKysrIGIvc291bmQvaXNhL2FkMTg0OC9hZDE4NDhfbGliLmMKQEAgLTEyMjMsOSArMTIyMyw5IEBACiAKIEVYUE9SVF9TWU1CT0woc25kX2FkMTg0OF9hZGRfY3RsX2VsZW0pOwogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNmJpdCwgLTk0NTAsIDE1MCwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNWJpdF8xMmRiX21heCwgLTM0NTAsIDE1MCwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfcmVjX2dhaW4sIDAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNmJpdCwgLTk0NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNWJpdF8xMmRiX21heCwgLTM0NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfcmVjX2dhaW4sIDAsIDE1MCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWQxODQ4X21peF9lbGVtIHNuZF9hZDE4NDhfY29udHJvbHNbXSA9IHsKIEFEMTg0OF9ET1VCTEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCAwLCBBRDE4NDhfTEVGVF9PVVRQVVQsIEFEMTg0OF9SSUdIVF9PVVRQVVQsIDcsIDcsIDEsIDEpLApkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9ndXNfbWFpbi5jIGIvc291bmQvaXNhL2d1cy9ndXNfbWFpbi5jCmluZGV4IGI2ODBmZGQuLjhjZWQ1ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvZ3VzX21haW4uYworKysgYi9zb3VuZC9pc2EvZ3VzL2d1c19tYWluLmMKQEAgLTI5NCwxMCArMjk0LDEwIEBACiAJCWd1cy0+bWl4X2NudHJsX3JlZyB8PSA0OwkvKiBlbmFibGUgTUlDICovCiAJfQogCWRtYTEgPSBndXMtPmdmMS5kbWExOwotCWRtYTEgPSBkbWExIDwgMCA/IC1kbWExIDogZG1hMTsKKwlkbWExID0gYWJzKGRtYTEpOwogCWRtYTEgPSBkbWFzW2RtYTEgJiA3XTsKIAlkbWEyID0gZ3VzLT5nZjEuZG1hMjsKLQlkbWEyID0gZG1hMiA8IDAgPyAtZG1hMiA6IGRtYTI7CisJZG1hMiA9IGFicyhkbWEyKTsKIAlkbWEyID0gZG1hc1tkbWEyICYgN107CiAJZG1hMSB8PSBndXMtPmVxdWFsX2RtYSA/IDB4NDAgOiAoZG1hMiA8PCAzKTsKIApAQCAtMzA2LDcgKzMwNiw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpcnEgPSBndXMtPmdmMS5pcnE7Ci0JaXJxID0gaXJxIDwgMCA/IC1pcnEgOiBpcnE7CisJaXJxID0gYWJzKGlycSk7CiAJaXJxID0gaXJxc1tpcnEgJiAweDBmXTsKIAlpZiAoaXJxID09IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiRXJyb3IhIElSUSBpc24ndCBkZWZpbmVkLlxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evb3BsM3NhMi5jIGIvc291bmQvaXNhL29wbDNzYTIuYwppbmRleCA0MTliNGViLi4xZTMwNzEzIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evb3BsM3NhMi5jCisrKyBiL3NvdW5kL2lzYS9vcGwzc2EyLmMKQEAgLTQ4Niw4ICs0ODYsOCBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9tYXN0ZXIsIC0zMDAwLCAyMDAsIDApOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXRfMTJkYl9tYXgsIC0zNDUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX21hc3RlciwgLTMwMDAsIDIwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNWJpdF8xMmRiX21heCwgLTM0NTAsIDE1MCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfb3BsM3NhMl9jb250cm9sc1tdID0gewogT1BMM1NBMl9ET1VCTEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAwLCAweDA3LCAweDA4LCA3LCA3LCAxLCAxKSwKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjE2X2NzcC5jIGIvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMKaW5kZXggZmNkNjM4MC4uM2Q5ZDdlMCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMKKysrIGIvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMKQEAgLTE2MSwxMCArMTYxLDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHNuZF9zYl9jc3BfZnJlZShzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCkKIHsKKwlpbnQgaTsKIAlzdHJ1Y3Qgc25kX3NiX2NzcCAqcCA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CiAJaWYgKHApIHsKIAkJaWYgKHAtPnJ1bm5pbmcgJiBTTkRSVl9TQl9DU1BfU1RfUlVOTklORykKIAkJCXNuZF9zYl9jc3Bfc3RvcChwKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocC0+Y3NwX3Byb2dyYW1zKTsgKytpKQorCQkJcmVsZWFzZV9maXJtd2FyZShwLT5jc3BfcHJvZ3JhbXNbaV0pOwogCQlrZnJlZShwKTsKIAl9CiB9CkBAIC02ODcsOCArNjkwLDUwIEBACiAJcmV0dXJuIGVycjsKIH0KIAorI2RlZmluZSBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCiAjaW5jbHVkZSAic2IxNl9jc3BfY29kZWNzLmgiCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgc25kX3NiX2NzcF9zdGF0aWNfcHJvZ3JhbXNbXSA9IHsKKwl7IC5kYXRhID0gbXVsYXdfbWFpbiwgLnNpemUgPSBzaXplb2YgbXVsYXdfbWFpbiB9LAorCXsgLmRhdGEgPSBhbGF3X21haW4sIC5zaXplID0gc2l6ZW9mIGFsYXdfbWFpbiB9LAorCXsgLmRhdGEgPSBpbWFfYWRwY21faW5pdCwgLnNpemUgPSBzaXplb2YgaW1hX2FkcGNtX2luaXQgfSwKKwl7IC5kYXRhID0gaW1hX2FkcGNtX3BsYXliYWNrLCAuc2l6ZSA9IHNpemVvZiBpbWFfYWRwY21fcGxheWJhY2sgfSwKKwl7IC5kYXRhID0gaW1hX2FkcGNtX2NhcHR1cmUsIC5zaXplID0gc2l6ZW9mIGltYV9hZHBjbV9jYXB0dXJlIH0sCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgc25kX3NiX2NzcF9maXJtd2FyZV9sb2FkKHN0cnVjdCBzbmRfc2JfY3NwICpwLCBpbnQgaW5kZXgsIGludCBmbGFncykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbXSA9IHsKKwkJInNiMTYvbXVsYXdfbWFpbi5jc3AiLAorCQkic2IxNi9hbGF3X21haW4uY3NwIiwKKwkJInNiMTYvaW1hX2FkcGNtX2luaXQuY3NwIiwKKwkJInNiMTYvaW1hX2FkcGNtX3BsYXliYWNrLmNzcCIsCisJCSJzYjE2L2ltYV9hZHBjbV9jYXB0dXJlLmNzcCIsCisJfTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnByb2dyYW07CisJaW50IGVycjsKKworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKG5hbWVzKSAhPSBDU1BfUFJPR1JBTV9DT1VOVCk7CisJcHJvZ3JhbSA9IHAtPmNzcF9wcm9ncmFtc1tpbmRleF07CisJaWYgKCFwcm9ncmFtKSB7CisJCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJnByb2dyYW0sIG5hbWVzW2luZGV4XSwKKwkJCQkgICAgICAgcC0+Y2hpcC0+Y2FyZC0+ZGV2KTsKKwkJaWYgKGVyciA+PSAwKQorCQkJcC0+Y3NwX3Byb2dyYW1zW2luZGV4XSA9IHByb2dyYW07CisJCWVsc2UgeworI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKwkJCXByb2dyYW0gPSAmc25kX3NiX2NzcF9zdGF0aWNfcHJvZ3JhbXNbaW5kZXhdOworI2Vsc2UKKwkJCXJldHVybiBlcnI7CisjZW5kaWYKKwkJfQorCX0KKwlyZXR1cm4gc25kX3NiX2NzcF9sb2FkKHAsIHByb2dyYW0tPmRhdGEsIHByb2dyYW0tPnNpemUsIGZsYWdzKTsKK30KKwogLyoKICAqIGF1dG9sb2FkIGhhcmR3YXJlIGNvZGVjIGlmIG5lY2Vzc2FyeQogICogcmV0dXJuIDAgaWYgQ1NQIGlzIGxvYWRlZCBhbmQgcmVhZHkgdG8gcnVuIChwLT5ydW5uaW5nICE9IDApCkBAIC03MDgsMjcgKzc1MywyNyBAQAogCX0gZWxzZSB7CiAJCXN3aXRjaCAocGNtX3NmbXQpIHsKIAkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX01VX0xBVzoKLQkJCWVyciA9IHNuZF9zYl9jc3BfbG9hZChwLCAmbXVsYXdfbWFpblswXSwgc2l6ZW9mKG11bGF3X21haW4pLCAwKTsKKwkJCWVyciA9IHNuZF9zYl9jc3BfZmlybXdhcmVfbG9hZChwLCBDU1BfUFJPR1JBTV9NVUxBVywgMCk7CiAJCQlwLT5hY2NfZm9ybWF0ID0gU05EUlZfUENNX0ZNVEJJVF9NVV9MQVc7CiAJCQlwLT5tb2RlID0gU05EUlZfU0JfQ1NQX01PREVfRFNQX1JFQUQgfCBTTkRSVl9TQl9DU1BfTU9ERV9EU1BfV1JJVEU7CiAJCQlicmVhazsKIAkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX0FfTEFXOgotCQkJZXJyID0gc25kX3NiX2NzcF9sb2FkKHAsICZhbGF3X21haW5bMF0sIHNpemVvZihhbGF3X21haW4pLCAwKTsKKwkJCWVyciA9IHNuZF9zYl9jc3BfZmlybXdhcmVfbG9hZChwLCBDU1BfUFJPR1JBTV9BTEFXLCAwKTsKIAkJCXAtPmFjY19mb3JtYXQgPSBTTkRSVl9QQ01fRk1UQklUX0FfTEFXOwogCQkJcC0+bW9kZSA9IFNORFJWX1NCX0NTUF9NT0RFX0RTUF9SRUFEIHwgU05EUlZfU0JfQ1NQX01PREVfRFNQX1dSSVRFOwogCQkJYnJlYWs7CiAJCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9JTUFfQURQQ006Ci0JCQllcnIgPSBzbmRfc2JfY3NwX2xvYWQocCwgJmltYV9hZHBjbV9pbml0WzBdLCBzaXplb2YoaW1hX2FkcGNtX2luaXQpLAotCQkJCQkgICAgICBTTkRSVl9TQl9DU1BfTE9BRF9JTklUQkxPQ0spOworCQkJZXJyID0gc25kX3NiX2NzcF9maXJtd2FyZV9sb2FkKHAsIENTUF9QUk9HUkFNX0FEUENNX0lOSVQsCisJCQkJCQkgICAgICAgU05EUlZfU0JfQ1NQX0xPQURfSU5JVEJMT0NLKTsKIAkJCWlmIChlcnIpCiAJCQkJYnJlYWs7CiAJCQlpZiAocGxheV9yZWNfbW9kZSA9PSBTTkRSVl9TQl9DU1BfTU9ERV9EU1BfV1JJVEUpIHsKLQkJCQllcnIgPSBzbmRfc2JfY3NwX2xvYWQocCwgJmltYV9hZHBjbV9wbGF5YmFja1swXSwKLQkJCQkJCSAgICAgIHNpemVvZihpbWFfYWRwY21fcGxheWJhY2spLCAwKTsKKwkJCQllcnIgPSBzbmRfc2JfY3NwX2Zpcm13YXJlX2xvYWQKKwkJCQkJKHAsIENTUF9QUk9HUkFNX0FEUENNX1BMQVlCQUNLLCAwKTsKIAkJCQlwLT5tb2RlID0gU05EUlZfU0JfQ1NQX01PREVfRFNQX1dSSVRFOwogCQkJfSBlbHNlIHsKLQkJCQllcnIgPSBzbmRfc2JfY3NwX2xvYWQocCwgJmltYV9hZHBjbV9jYXB0dXJlWzBdLAotCQkJCQkJICAgICAgc2l6ZW9mKGltYV9hZHBjbV9jYXB0dXJlKSwgMCk7CisJCQkJZXJyID0gc25kX3NiX2NzcF9maXJtd2FyZV9sb2FkCisJCQkJCShwLCBDU1BfUFJPR1JBTV9BRFBDTV9DQVBUVVJFLCAwKTsKIAkJCQlwLT5tb2RlID0gU05EUlZfU0JfQ1NQX01PREVfRFNQX1JFQUQ7CiAJCQl9CiAJCQlwLT5hY2NfZm9ybWF0ID0gU05EUlZfUENNX0ZNVEJJVF9JTUFfQURQQ007CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYwppbmRleCA4NWRiNTM1Li5lMmZkZDVmIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jCisrKyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMKQEAgLTQwMiw2ICs0MDIsNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFjYXJkLT53YXZlZnJvbnQuaW50ZXJydXB0X3NsZWVwZXIpOwogCXNwaW5fbG9ja19pbml0KCZhY2FyZC0+d2F2ZWZyb250Lm1pZGkub3Blbik7CiAJc3Bpbl9sb2NrX2luaXQoJmFjYXJkLT53YXZlZnJvbnQubWlkaS52aXJ0dWFsKTsKKwlhY2FyZC0+d2F2ZWZyb250LmNhcmQgPSBjYXJkOwogCWNhcmQtPnByaXZhdGVfZnJlZSA9IHNuZF93YXZlZnJvbnRfZnJlZTsKIAogCXJldHVybiBjYXJkOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfZnguYyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMKaW5kZXggNGYwODQ2Zi4uMTUzMzFlZCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfZnguYworKysgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9meC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvc25kX3dhdmVmcm9udC5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KQEAgLTMyLDMyNSArMzMsMTcgQEAKICNkZWZpbmUgRlhfTVNCX1RSQU5TRkVSIDB4MDIgICAgLyogdHJhbnNmZXIgYWZ0ZXIgRFNQIE1TQiBieXRlIHdyaXR0ZW4gKi8KICNkZWZpbmUgRlhfQVVUT19JTkNSICAgIDB4MDQgICAgLyogYXV0by1pbmNyZW1lbnQgRFNQIGFkZHJlc3MgYWZ0ZXIgdHJhbnNmZXIgKi8KIAotLyogd2VpcmQgc3R1ZmYsIGRlcml2ZWQgZnJvbSBwb3J0IEkvTyB0cmFjaW5nIHdpdGggZG9zZW11ICovCisjZGVmaW5lIFdBSVRfSURMRQkweGZmCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2VfemVyb1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDAxLCAweDdjLCAweDAwLCAweDFlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY1LCAweDAwLAotMHgxMSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgzMiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgxMywgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MTQsIDB4MDIsIDB4NzYsIDB4MDAsIDB4NjAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MTksCi0weDAxLCAweDFhLCAweDAxLCAweDIwLCAweDAxLCAweDQwLCAweDAxLCAweDE3LCAweDAwLCAweDAwLCAweDAxLAotMHg4MCwgMHgwMSwgMHgyMCwgMHgwMCwgMHgxMCwgMHgwMSwgMHhhMCwgMHgwMywgMHhkMSwgMHgwMCwgMHgwMCwKLTB4MDEsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjQsIDB4MDIsCi0weGUwLCAweDAwLCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDE3LAotMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDkyLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweGIzLCAweDAyLAotMHgwMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwKLTB4MDAsIDB4ODAsIDB4MDAsIDB4ZjUsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4YTAsIDB4MDIsCi0weDExLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLAotMHgwMiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgxNywgMHgwMCwgMHgxYiwgMHgwMCwKLTB4MWQsIDB4MDIsIDB4ZGYKLX07CisjZGVmaW5lIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZV9vbmVbXSBfX2RldmluaXRkYXRhID0gewotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgxOSwgMHgwMCwKLTB4MWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4ZDgsIDB4MDAsIDB4MDAsCi0weDAyLCAweDIwLCAweDAwLCAweDE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDAxLAotMHhjMCwgMHgwMSwgMHhmYSwgMHgwMCwgMHgxYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDQwLCAweDAyLCAweDYwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHhjMCwgMHgwMiwgMHg4MCwgMHgwMCwKLTB4MDAsIDB4MDIsIDB4ZmIsIDB4MDIsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWIsIDB4MDIsIDB4ZDcsCi0weDAwLCAweDAwLCAweDAyLCAweGY3LCAweDAzLCAweDIwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgxYywgMHgwMywgMHgzYywgMHgwMCwgMHgwMCwgMHgwMywgMHgzZiwgMHgwMCwgMHgwMCwgMHgwMywgMHhjMCwKLTB4MDAsIDB4MDAsIDB4MDMsIDB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NWQsIDB4MDAsCi0weDAwLCAweDAzLCAweGMwLCAweDAwLCAweDAwLCAweDAzLCAweDdkLCAweDAwLCAweDAwLCAweDAzLCAweGMwLAotMHgwMCwgMHgwMCwgMHgwMywgMHg5ZSwgMHgwMCwgMHgwMCwgMHgwMywgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMywKLTB4YmUsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDFiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLAotMHhkYiwgMHgwMCwgMHgwMCwgMHgwMiwgMHhkYiwgMHgwMCwgMHgwMCwgMHgwMiwgMHhlMCwgMHgwMCwgMHgwMCwKLTB4MDIsIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4YzAsIDB4MDIsIDB4NDAsIDB4MDIsIDB4ZmIsIDB4MDIsCi0weDYwLCAweDAwLCAweDFiCisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorI2luY2x1ZGUgInlzczIyNS5jIgorc3RhdGljIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSB5c3MyMjVfcmVnaXN0ZXJzX2Zpcm13YXJlID0geworCS5kYXRhID0gKHU4ICopeXNzMjI1X3JlZ2lzdGVycywKKwkuc2l6ZSA9IHNpemVvZiB5c3MyMjVfcmVnaXN0ZXJzCiB9OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlX3R3b1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weGM0LCAweDAwLCAweDQ0LCAweDA3LCAweDQ0LCAweDAwLCAweDQwLCAweDI1LCAweDAxLCAweDA2LCAweGM0LAotMHgwNywgMHg0MCwgMHgyNSwgMHgwMSwgMHgwMCwgMHg0NiwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDYsIDB4MDcsCi0weDA1LCAweDA1LCAweDA1LCAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA3LCAweDA1LCAweDQ0LCAweDQ2LAotMHg0NCwgMHg0NiwgMHg0NiwgMHgwNywgMHgwNSwgMHg0NCwgMHg0NiwgMHgwNSwgMHg0NiwgMHgwNSwgMHg0NiwKLTB4MDUsIDB4NDYsIDB4MDUsIDB4NDQsIDB4NDYsIDB4MDUsIDB4MDcsIDB4NDQsIDB4NDYsIDB4MDUsIDB4MDcsCi0weDQ0LCAweDQ2LCAweDA1LCAweDA3LCAweDQ0LCAweDQ2LCAweDA1LCAweDA3LCAweDQ0LCAweDA1LCAweDA1LAotMHgwNSwgMHg0NCwgMHgwNSwgMHgwNSwgMHgwNSwgMHg0NiwgMHgwNSwgMHg0NiwgMHgwNSwgMHg0NiwgMHgwNSwKLTB4NDYsIDB4MDUsIDB4NDYsIDB4MDcsIDB4NDYsIDB4MDcsIDB4NDQKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2VfdGhyZWVbXSBfX2RldmluaXRkYXRhID0gewotMHgwNywgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NywgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MCwgMHgwNiwKLTB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLAotMHhjMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MCwgMHgwMCwKLTB4NjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4NDIsIDB4MDAsIDB4NDAsCi0weDAwLCAweDAyLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLAotMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4NDIsIDB4MDAsIDB4NDAsIDB4MDAsIDB4NDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsCi0weDAyLCAweDAwLCAweDQyLCAweDAwLCAweGMwLCAweDAwLCAweDQwCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlX2ZvdXJbXSBfX2RldmluaXRkYXRhID0gewotMHg2MywgMHgwMywgMHgyNiwgMHgwMiwgMHgyYywgMHgwMCwgMHgyNCwgMHgwMCwgMHgyZSwgMHgwMiwgMHgwMiwKLTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotMHgyMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgyMCwKLTB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsCi0weDIwLCAweDAwLCAweDYwLCAweDAwLCAweDIwLCAweDAwLCAweDYwLCAweDAwLCAweDIwLCAweDAwLCAweDYwLAotMHgwMCwgMHgyMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwMCwKLTB4MjAsIDB4MDAsIDB4MjIsIDB4MDIsIDB4MjIsIDB4MDIsIDB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MjIsCi0weDAyLCAweDYyLCAweDAyLCAweDIwLCAweDAxLCAweDIxLCAweDAxCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlX3NpeFtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDA2LCAweDAwLAotMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwZSwKLTB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsCi0weDE2LCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDFhLCAweDAwLCAweDAwLCAweDFjLCAweDAwLAotMHgwMCwgMHgxZSwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgwMCwgMHgyNCwKLTB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MmEsIDB4MDAsIDB4MDAsCi0weDJjLCAweDAwLCAweDAwLCAweDJlLCAweDAwLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDMyLCAweDAwLAotMHgwMCwgMHgzNCwgMHgwMCwgMHgwMCwgMHgzNiwgMHgwMCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgzYSwKLTB4MDAsIDB4MDAsIDB4M2MsIDB4MDAsIDB4MDAsIDB4M2UsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsCi0weDQyLCAweDAzLCAweDAwLCAweDQ0LCAweDAxLCAweDAwLCAweDQ2LCAweDBhLCAweDIxLCAweDQ4LCAweDBkLAotMHgyMywgMHg0YSwgMHgyMywgMHgxYiwgMHg0YywgMHgzNywgMHg4ZiwgMHg0ZSwgMHg0NSwgMHg3NywgMHg1MCwKLTB4NTIsIDB4ZTIsIDB4NTIsIDB4MWMsIDB4OTIsIDB4NTQsIDB4MWMsIDB4NTIsIDB4NTYsIDB4MDcsIDB4MDAsCi0weDU4LCAweDJmLCAweGM2LCAweDVhLCAweDBiLCAweDAwLCAweDVjLCAweDMwLCAweDA2LCAweDVlLCAweDE3LAotMHgwMCwgMHg2MCwgMHgzZCwgMHhkYSwgMHg2MiwgMHgyOSwgMHgwMCwgMHg2NCwgMHgzZSwgMHg0MSwgMHg2NiwKLTB4MzksIDB4MDAsIDB4NjgsIDB4NGMsIDB4NDgsIDB4NmEsIDB4NDksIDB4MDAsIDB4NmMsIDB4NGMsIDB4NmMsCi0weDZlLCAweDExLCAweGQyLCAweDcwLCAweDE2LCAweDBjLCAweDcyLCAweDAwLCAweDAwLCAweDc0LCAweDAwLAotMHg4MCwgMHg3NiwgMHgwZiwgMHgwMCwgMHg3OCwgMHgwMCwgMHg4MCwgMHg3YSwgMHgxMywgMHgwMCwgMHg3YywKLTB4ODAsIDB4MDAsIDB4N2UsIDB4ODAsIDB4ODAKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2Vfc2V2ZW5bXSBfX2RldmluaXRkYXRhID0gewotMHgwZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsCi0weDA4LCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLAotMHhmZiwgMHgwZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZmYsIDB4MGYsIDB4ZmYsCi0weDBmLCAweGZmLCAweDBmLCAweGZmLCAweDAyLCAweGU5LCAweDA2LCAweDhjLCAweDA2LCAweDhjLCAweDBmLAotMHhmZiwgMHgxYSwgMHg3NSwgMHgwZCwgMHg4YiwgMHgwNCwgMHhlOSwgMHgwYiwgMHgxNiwgMHgxYSwgMHgzOCwKLTB4MGQsIDB4YzgsIDB4MDQsIDB4NmYsIDB4MGIsIDB4OTEsIDB4MGYsIDB4ZmYsIDB4MDYsIDB4NDAsIDB4MDYsCi0weDQwLCAweDAyLCAweDhmLCAweDBmLCAweGZmLCAweDA2LCAweDYyLCAweDA2LCAweDYyLCAweDAyLCAweDdiLAotMHgwZiwgMHhmZiwgMHgwNiwgMHg5NywgMHgwNiwgMHg5NywgMHgwMiwgMHg1MiwgMHgwZiwgMHhmZiwgMHgwNiwKLTB4ZjYsIDB4MDYsIDB4ZjYsIDB4MDIsIDB4MTksIDB4MDUsIDB4NTUsIDB4MDUsIDB4NTUsIDB4MDUsIDB4NTUsCi0weDA1LCAweDU1LCAweDA1LCAweDU1LCAweDA1LCAweDU1LCAweDA1LCAweDU1LCAweDA1LCAweDU1LCAweDE0LAotMHhkYSwgMHgwZCwgMHg5MywgMHgwNCwgMHhkYSwgMHgwNSwgMHg5MywgMHgxNCwgMHhkYSwgMHgwZCwgMHg5MywKLTB4MDQsIDB4ZGEsIDB4MDUsIDB4OTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAyLCAweDAwCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlX3plcm9fdjJbXSBfX2RldmluaXRkYXRhID0gewotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlX29uZV92MltdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDAxLCAweGMwLCAweDAxLCAweGZhLCAweDAwLCAweDFhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2VfdHdvX3YyW10gX19kZXZpbml0ZGF0YSA9IHsKLTB4NDYsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwCi19Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZV90aHJlZV92MltdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2VfZm91cl92MltdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZV9zZXZlbl92MltdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDBmLCAweGZmLCAweDBmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1vZF92MltdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAxLCAweDAyLCAweDAwLCAweDAxLCAweDAyLCAweDAyLAotMHgwMCwgMHgwMSwgMHgwMywgMHgwMiwgMHgwMCwgMHgwMSwgMHgwNCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwNSwKLTB4MDIsIDB4MDAsIDB4MDEsIDB4MDYsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDcsIDB4MDIsIDB4MDAsIDB4YjAsCi0weDIwLCAweGIxLCAweDIwLCAweGIyLCAweDIwLCAweGIzLCAweDIwLCAweGI0LCAweDIwLCAweGI1LCAweDIwLAotMHhiNiwgMHgyMCwgMHhiNywgMHgyMCwgMHhmMCwgMHgyMCwgMHhmMSwgMHgyMCwgMHhmMiwgMHgyMCwgMHhmMywKLTB4MjAsIDB4ZjQsIDB4MjAsIDB4ZjUsIDB4MjAsIDB4ZjYsIDB4MjAsIDB4ZjcsIDB4MjAsIDB4MTAsIDB4ZmYsCi0weDExLCAweGZmLCAweDEyLCAweGZmLCAweDEzLCAweGZmLCAweDE0LCAweGZmLCAweDE1LCAweGZmLCAweDE2LAotMHhmZiwgMHgxNywgMHhmZiwgMHgyMCwgMHhmZiwgMHgyMSwgMHhmZiwgMHgyMiwgMHhmZiwgMHgyMywgMHhmZiwKLTB4MjQsIDB4ZmYsIDB4MjUsIDB4ZmYsIDB4MjYsIDB4ZmYsIDB4MjcsIDB4ZmYsIDB4MzAsIDB4MDAsIDB4MzEsCi0weDAwLCAweDMyLCAweDAwLCAweDMzLCAweDAwLCAweDM0LCAweDAwLCAweDM1LCAweDAwLCAweDM2LCAweDAwLAotMHgzNywgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MSwgMHgwMCwgMHg0MiwgMHgwMCwgMHg0MywgMHgwMCwgMHg0NCwKLTB4MDAsIDB4NDUsIDB4MDAsIDB4NDYsIDB4MDAsIDB4NDcsIDB4MDAsIDB4NTAsIDB4MDAsIDB4NTEsIDB4MDAsCi0weDUyLCAweDAwLCAweDUzLCAweDAwLCAweDU0LCAweDAwLCAweDU1LCAweDAwLCAweDU2LCAweDAwLCAweDU3LAotMHgwMCwgMHg2MCwgMHgwMCwgMHg2MSwgMHgwMCwgMHg2MiwgMHgwMCwgMHg2MywgMHgwMCwgMHg2NCwgMHgwMCwKLTB4NjUsIDB4MDAsIDB4NjYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NzAsIDB4YzAsIDB4NzEsIDB4YzAsIDB4NzIsCi0weGMwLCAweDczLCAweGMwLCAweDc0LCAweGMwLCAweDc1LCAweGMwLCAweDc2LCAweGMwLCAweDc3LCAweGMwLAotMHg4MCwgMHgwMCwgMHg4MSwgMHgwMCwgMHg4MiwgMHgwMCwgMHg4MywgMHgwMCwgMHg4NCwgMHgwMCwgMHg4NSwKLTB4MDAsIDB4ODYsIDB4MDAsIDB4ODcsIDB4MDAsIDB4OTAsIDB4MDAsIDB4OTEsIDB4MDAsIDB4OTIsIDB4MDAsCi0weDkzLCAweDAwLCAweDk0LCAweDAwLCAweDk1LCAweDAwLCAweDk2LCAweDAwLCAweDk3LCAweDAwLCAweGEwLAotMHgwMCwgMHhhMSwgMHgwMCwgMHhhMiwgMHgwMCwgMHhhMywgMHgwMCwgMHhhNCwgMHgwMCwgMHhhNSwgMHgwMCwKLTB4YTYsIDB4MDAsIDB4YTcsIDB4MDAsIDB4YzAsIDB4MDAsIDB4YzEsIDB4MDAsIDB4YzIsIDB4MDAsIDB4YzMsCi0weDAwLCAweGM0LCAweDAwLCAweGM1LCAweDAwLCAweGM2LCAweDAwLCAweGM3LCAweDAwLCAweGQwLCAweDAwLAotMHhkMSwgMHgwMCwgMHhkMiwgMHgwMCwgMHhkMywgMHgwMCwgMHhkNCwgMHgwMCwgMHhkNSwgMHgwMCwgMHhkNiwKLTB4MDAsIDB4ZDcsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4ZTEsIDB4MDAsIDB4ZTIsIDB4MDAsIDB4ZTMsIDB4MDAsCi0weGU0LCAweDAwLCAweGU1LCAweDAwLCAweGU2LCAweDAwLCAweGU3LCAweDAwLCAweDAxLCAweDAwLCAweDAyLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMywKLTB4MDIsIDB4MDEsIDB4MDEsIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDUsIDB4MDIsIDB4MDEsIDB4MDEsCi0weDA2LCAweDAyLCAweDAxLCAweDAxLCAweDA3LCAweDAyLCAweDAxCi19Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgY29lZmZpY2llbnRzW10gX19kZXZpbml0ZGF0YSA9IHsKLTB4MDcsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4NGIsIDB4MDMsCi0weDExLCAweDAwLCAweDRkLCAweDAxLCAweDMyLCAweDA3LCAweDQ2LCAweDAwLCAweDAwLCAweDA3LCAweDQ5LAotMHgwMCwgMHgwMCwgMHgwNywgMHg0MCwgMHgwMCwgMHgwMCwgMHgwNywgMHg0MSwgMHgwMCwgMHgwMCwgMHgwMSwKLTB4NDAsIDB4MDIsIDB4NDAsIDB4MDEsIDB4NDEsIDB4MDIsIDB4NjAsIDB4MDcsIDB4NDAsIDB4MDAsIDB4MDAsCi0weDA3LCAweDQxLCAweDAwLCAweDAwLCAweDA3LCAweDQ3LCAweDAwLCAweDAwLCAweDA3LCAweDRhLCAweDAwLAotMHgwMCwgMHgwMCwgMHg0NywgMHgwMSwgMHgwMCwgMHgwMCwgMHg0YSwgMHgwMSwgMHgyMCwgMHgwNywgMHg0NywKLTB4MDAsIDB4MDAsIDB4MDcsIDB4NGEsIDB4MDAsIDB4MDAsIDB4MDcsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MDcsCi0weDdlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDFjLCAweDA3LCAweDdjLCAweDAwLCAweDAwLAotMHgwNywgMHg3ZSwgMHgwMCwgMHgwMCwgMHgwNywgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwMSwKLTB4MDAsIDB4MDcsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDMsCi0weDAwLCAweDAwLCAweDAwLCAweDQyLCAweDAxLCAweDFhLCAweDAwLCAweDQzLCAweDAxLCAweDIwLCAweDA3LAotMHg0MiwgMHgwMCwgMHgwMCwgMHgwNywgMHg0MywgMHgwMCwgMHgwMCwgMHgwNywgMHg0MCwgMHgwMCwgMHgwMCwKLTB4MDcsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDAsIDB4MDIsIDB4NDAsIDB4MDEsIDB4NDEsIDB4MDIsCi0weDYwLCAweDA3LCAweDQwLCAweDAwLCAweDAwLCAweDA3LCAweDQxLCAweDAwLCAweDAwLCAweDA3LCAweDQ0LAotMHgwZiwgMHhmZiwgMHgwNywgMHg0MiwgMHgwMCwgMHgwMCwgMHgwNywgMHg0MywgMHgwMCwgMHgwMCwgMHgwNywKLTB4NDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NTEsIDB4MDYsIDB4NDAsCi0weDA3LCAweDUwLCAweDA2LCAweDQwLCAweDA3LCAweDRmLCAweDAzLCAweDgxLCAweDA3LCAweDUzLCAweDFhLAotMHg3NiwgMHgwNywgMHg1NCwgMHgwZCwgMHg4YiwgMHgwNywgMHg1NSwgMHgwNCwgMHhlOSwgMHgwNywgMHg1NiwKLTB4MGIsIDB4MTcsIDB4MDcsIDB4NTcsIDB4MWEsIDB4MzgsIDB4MDcsIDB4NTgsIDB4MGQsIDB4YzksIDB4MDcsCi0weDU5LCAweDA0LCAweDZmLCAweDA3LCAweDVhLCAweDBiLCAweDkxLCAweDA3LCAweDczLCAweDE0LCAweGRhLAotMHgwNywgMHg3NCwgMHgwZCwgMHg5MywgMHgwNywgMHg3NSwgMHgwNCwgMHhkOSwgMHgwNywgMHg3NiwgMHgwNSwKLTB4OTMsIDB4MDcsIDB4NzcsIDB4MTQsIDB4ZGEsIDB4MDcsIDB4NzgsIDB4MGQsIDB4OTMsIDB4MDcsIDB4NzksCi0weDA0LCAweGQ5LCAweDA3LCAweDdhLCAweDA1LCAweDkzLCAweDA3LCAweDVlLCAweDAzLCAweDY4LCAweDA3LAotMHg1YywgMHgwNCwgMHgzMSwgMHgwNywgMHg1ZCwgMHgwNCwgMHgzMSwgMHgwNywgMHg2MiwgMHgwMywgMHg1MiwKLTB4MDcsIDB4NjAsIDB4MDQsIDB4NzYsIDB4MDcsIDB4NjEsIDB4MDQsIDB4NzYsIDB4MDcsIDB4NjYsIDB4MDMsCi0weDJlLCAweDA3LCAweDY0LCAweDA0LCAweGRhLCAweDA3LCAweDY1LCAweDA0LCAweGRhLCAweDA3LCAweDZhLAotMHgwMiwgMHhmNiwgMHgwNywgMHg2OCwgMHgwNSwgMHg2MiwgMHgwNywgMHg2OSwgMHgwNSwgMHg2MiwgMHgwNiwKLTB4NDYsIDB4MGEsIDB4MjIsIDB4MDYsIDB4NDgsIDB4MGQsIDB4MjQsIDB4MDYsIDB4NmUsIDB4MTEsIDB4ZDMsCi0weDA2LCAweDcwLCAweDE1LCAweGNiLCAweDA2LCAweDUyLCAweDIwLCAweDkzLCAweDA2LCAweDU0LCAweDIwLAotMHg1NCwgMHgwNiwgMHg0YSwgMHgyNywgMHgxZCwgMHgwNiwgMHg1OCwgMHgyZiwgMHhjOCwgMHgwNiwgMHg1YywKLTB4MzAsIDB4MDcsIDB4MDYsIDB4NGMsIDB4MzcsIDB4OTAsIDB4MDYsIDB4NjAsIDB4M2QsIDB4ZGIsIDB4MDYsCi0weDY0LCAweDNlLCAweDQyLCAweDA2LCAweDRlLCAweDQ1LCAweDc4LCAweDA2LCAweDY4LCAweDRjLCAweDQ4LAotMHgwNiwgMHg2YywgMHg0YywgMHg2YywgMHgwNiwgMHg1MCwgMHg1MiwgMHhlMiwgMHgwNiwgMHg0MiwgMHgwMiwKLTB4YmEKLX07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBjb2VmZmljaWVudHMyW10gX19kZXZpbml0ZGF0YSA9IHsKLTB4MDcsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDUsIDB4MGYsCi0weGZmLCAweDA3LCAweDQ4LCAweDBmLCAweGZmLCAweDA3LCAweDdiLCAweDA0LCAweGNjLCAweDA3LCAweDdkLAotMHgwNCwgMHhjYywgMHgwNywgMHg3YywgMHgwMCwgMHgwMCwgMHgwNywgMHg3ZSwgMHgwMCwgMHgwMCwgMHgwNywKLTB4NDYsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDcsIDB4MDAsIDB4MDAsCi0weDA3LCAweDRhLCAweDAwLCAweDAwLCAweDA3LCAweDRjLCAweDAwLCAweDAwLCAweDA3LCAweDRlLCAweDAwLCAweDAwCi19Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgY29lZmZpY2llbnRzM1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDI4LCAweDAwLCAweDUxLCAweDAwLAotMHg1MSwgMHgwMCwgMHg3YSwgMHgwMCwgMHg3YSwgMHgwMCwgMHhhMywgMHgwMCwgMHhhMywgMHgwMCwgMHhjYywKLTB4MDAsIDB4Y2MsIDB4MDAsIDB4ZjUsIDB4MDAsIDB4ZjUsIDB4MDEsIDB4MWUsIDB4MDEsIDB4MWUsIDB4MDEsCi0weDQ3LCAweDAxLCAweDQ3LCAweDAxLCAweDcwLCAweDAxLCAweDcwLCAweDAxLCAweDk5LCAweDAxLCAweDk5LAotMHgwMSwgMHhjMiwgMHgwMSwgMHhjMiwgMHgwMSwgMHhlYiwgMHgwMSwgMHhlYiwgMHgwMiwgMHgxNCwgMHgwMiwKLTB4MTQsIDB4MDIsIDB4M2QsIDB4MDIsIDB4M2QsIDB4MDIsIDB4NjYsIDB4MDIsIDB4NjYsIDB4MDIsIDB4OGYsCi0weDAyLCAweDhmLCAweDAyLCAweGI4LCAweDAyLCAweGI4LCAweDAyLCAweGUxLCAweDAyLCAweGUxLCAweDAzLAotMHgwYSwgMHgwMywgMHgwYSwgMHgwMywgMHgzMywgMHgwMywgMHgzMywgMHgwMywgMHg1YywgMHgwMywgMHg1YywKLTB4MDMsIDB4ODUsIDB4MDMsIDB4ODUsIDB4MDMsIDB4YWUsIDB4MDMsIDB4YWUsIDB4MDMsIDB4ZDcsIDB4MDMsCi0weGQ3LCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDI4LCAweDA0LCAweDI4LCAweDA0LCAweDUxLAotMHgwNCwgMHg1MSwgMHgwNCwgMHg3YSwgMHgwNCwgMHg3YSwgMHgwNCwgMHhhMywgMHgwNCwgMHhhMywgMHgwNCwKLTB4Y2MsIDB4MDQsIDB4Y2MsIDB4MDQsIDB4ZjUsIDB4MDQsIDB4ZjUsIDB4MDUsIDB4MWUsIDB4MDUsIDB4MWUsCi0weDA1LCAweDQ3LCAweDA1LCAweDQ3LCAweDA1LCAweDcwLCAweDA1LCAweDcwLCAweDA1LCAweDk5LCAweDA1LAotMHg5OSwgMHgwNSwgMHhjMiwgMHgwNSwgMHhjMiwgMHgwNSwgMHhlYiwgMHgwNSwgMHhlYiwgMHgwNiwgMHgxNCwKLTB4MDYsIDB4MTQsIDB4MDYsIDB4M2QsIDB4MDYsIDB4M2QsIDB4MDYsIDB4NjYsIDB4MDYsIDB4NjYsIDB4MDYsCi0weDhmLCAweDA2LCAweDhmLCAweDA2LCAweGI4LCAweDA2LCAweGI4LCAweDA2LCAweGUxLCAweDA2LCAweGUxLAotMHgwNywgMHgwYSwgMHgwNywgMHgwYSwgMHgwNywgMHgzMywgMHgwNywgMHgzMywgMHgwNywgMHg1YywgMHgwNywKLTB4NWMsIDB4MDcsIDB4ODUsIDB4MDcsIDB4ODUsIDB4MDcsIDB4YWUsIDB4MDcsIDB4YWUsIDB4MDcsIDB4ZDcsCi0weDA3LCAweGQ3LCAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDA4LCAweDI4LCAweDA4LCAweDI4LCAweDA4LAotMHg1MSwgMHgwOCwgMHg1MSwgMHgwOCwgMHg3YSwgMHgwOCwgMHg3YSwgMHgwOCwgMHhhMywgMHgwOCwgMHhhMywKLTB4MDgsIDB4Y2MsIDB4MDgsIDB4Y2MsIDB4MDgsIDB4ZjUsIDB4MDgsIDB4ZjUsIDB4MDksIDB4MWUsIDB4MDksCi0weDFlLCAweDA5LCAweDQ3LCAweDA5LCAweDQ3LCAweDA5LCAweDcwLCAweDA5LCAweDcwLCAweDA5LCAweDk5LAotMHgwOSwgMHg5OSwgMHgwOSwgMHhjMiwgMHgwOSwgMHhjMiwgMHgwOSwgMHhlYiwgMHgwOSwgMHhlYiwgMHgwYSwKLTB4MTQsIDB4MGEsIDB4MTQsIDB4MGEsIDB4M2QsIDB4MGEsIDB4M2QsIDB4MGEsIDB4NjYsIDB4MGEsIDB4NjYsCi0weDBhLCAweDhmLCAweDBhLCAweDhmLCAweDBhLCAweGI4LCAweDBhLCAweGI4LCAweDBhLCAweGUxLCAweDBhLAotMHhlMSwgMHgwYiwgMHgwYSwgMHgwYiwgMHgwYSwgMHgwYiwgMHgzMywgMHgwYiwgMHgzMywgMHgwYiwgMHg1YywKLTB4MGIsIDB4NWMsIDB4MGIsIDB4ODUsIDB4MGIsIDB4ODUsIDB4MGIsIDB4YWUsIDB4MGIsIDB4YWUsIDB4MGIsCi0weGQ3LCAweDBiLCAweGQ3LCAweDBjLCAweDAwLCAweDBjLCAweDAwLCAweDBjLCAweDI4LCAweDBjLCAweDI4LAotMHgwYywgMHg1MSwgMHgwYywgMHg1MSwgMHgwYywgMHg3YSwgMHgwYywgMHg3YSwgMHgwYywgMHhhMywgMHgwYywKLTB4YTMsIDB4MGMsIDB4Y2MsIDB4MGMsIDB4Y2MsIDB4MGMsIDB4ZjUsIDB4MGMsIDB4ZjUsIDB4MGQsIDB4MWUsCi0weDBkLCAweDFlLCAweDBkLCAweDQ3LCAweDBkLCAweDQ3LCAweDBkLCAweDcwLCAweDBkLCAweDcwLCAweDBkLAotMHg5OSwgMHgwZCwgMHg5OSwgMHgwZCwgMHhjMiwgMHgwZCwgMHhjMiwgMHgwZCwgMHhlYiwgMHgwZCwgMHhlYiwKLTB4MGUsIDB4MTQsIDB4MGUsIDB4MTQsIDB4MGUsIDB4M2QsIDB4MGUsIDB4M2QsIDB4MGUsIDB4NjYsIDB4MGUsCi0weDY2LCAweDBlLCAweDhmLCAweDBlLCAweDhmLCAweDBlLCAweGI4LCAweDBlLCAweGI4LCAweDBlLCAweGUxLAotMHgwZSwgMHhlMSwgMHgwZiwgMHgwYSwgMHgwZiwgMHgwYSwgMHgwZiwgMHgzMywgMHgwZiwgMHgzMywgMHgwZiwKLTB4NWMsIDB4MGYsIDB4NWMsIDB4MGYsIDB4ODUsIDB4MGYsIDB4ODUsIDB4MGYsIDB4YWUsIDB4MGYsIDB4YWUsCi0weDBmLCAweGQ3LCAweDBmLCAweGQ3LCAweDBmLCAweGZmLCAweDBmLCAweGZmCi19OworI2VuZGlmCiAKIHN0YXRpYyBpbnQKIHdhdmVmcm9udF9meF9pZGxlIChzbmRfd2F2ZWZyb250X3QgKmRldikKQEAgLTU1NSw0NjUgKzI0OCw1NiBAQAogICAgb2YgdGhlIHBvcnQgSS9PIGRvbmUsIHVzaW5nIHRoZSBZYW1haGEgZmF4YmFjayBkb2N1bWVudCBhcyBhIGd1aWRlCiAgICB0byBhZGQgbW9yZSBsb2dpYyB0byB0aGUgY29kZS4gSXRzIHJlYWxseSBwcmV0dHkgd2VpcmQuCiAKLSAgIFRoZXJlIHdhcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBvZiBqdXN0IGR1bXBpbmcgdGhlIHdob2xlIEkvTworICAgVGhpcyBpcyB0aGUgYXBwcm9hY2ggb2YganVzdCBkdW1waW5nIHRoZSB3aG9sZSBJL08KICAgIHNlcXVlbmNlIGFzIGEgc2VyaWVzIG9mIHBvcnQvdmFsdWUgcGFpcnMgYW5kIGEgc2ltcGxlIGxvb3AKLSAgIHRoYXQgb3V0cHV0IGl0LiBIb3dldmVyLCBJIGhvcGUgdGhhdCBldmVudHVhbGx5IEknbGwgZ2V0IG1vcmUKLSAgIGNvbnRyb2wgb3ZlciB3aGF0IHRoaXMgY29kZSBkb2VzLCBhbmQgc28gSSB0cmllZCB0byBzdGljayB3aXRoCi0gICBhIHNvbWV3aGF0ICJhbGdvcml0aG1pYyIgYXBwcm9hY2guCisgICB0aGF0IG91dHB1dHMgaXQuCiAqLwogCi0KIGludCBfX2RldmluaXQKIHNuZF93YXZlZnJvbnRfZnhfc3RhcnQgKHNuZF93YXZlZnJvbnRfdCAqZGV2KQotCiB7Ci0JdW5zaWduZWQgaW50IGksIGo7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOwogCi0JLyogU2V0IGFsbCBiaXRzIGZvciBhbGwgY2hhbm5lbHMgb24gdGhlIE1PRCB1bml0IHRvIHplcm8gKi8KLQkvKiBYWFggQnV0IHdoeSBkbyB0aGlzIHR3aWNlID8gKi8KKwlpZiAoZGV2LT5meF9pbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CiAKLQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7Ci0JCWZvciAoaSA9IDB4MTA7IGkgPD0gMHhmZjsgaSsrKSB7Ci0JICAgIAotCQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgewotCQkJCXJldHVybiAoLTEpOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCAieWFtYWhhL3lzczIyNV9yZWdpc3RlcnMuYmluIiwKKwkJCSAgICAgICBkZXYtPmNhcmQtPmRldik7CisJaWYgKGVyciA8IDApIHsKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisJCWZpcm13YXJlID0gJnlzczIyNV9yZWdpc3RlcnNfZmlybXdhcmU7CisjZWxzZQorCQllcnIgPSAtMTsKKwkJZ290byBvdXQ7CisjZW5kaWYKKwl9CisKKwlmb3IgKGkgPSAwOyBpICsgMSA8IGZpcm13YXJlLT5zaXplOyBpICs9IDIpIHsKKwkJaWYgKGZpcm13YXJlLT5kYXRhW2ldID49IDggJiYgZmlybXdhcmUtPmRhdGFbaV0gPCAxNikgeworCQkJb3V0YihmaXJtd2FyZS0+ZGF0YVtpICsgMV0sCisJCQkgICAgIGRldi0+YmFzZSArIGZpcm13YXJlLT5kYXRhW2ldKTsKKwkJfSBlbHNlIGlmIChmaXJtd2FyZS0+ZGF0YVtpXSA9PSBXQUlUX0lETEUpIHsKKwkJCWlmICghd2F2ZWZyb250X2Z4X2lkbGUoZGV2KSkgeworCQkJCWVyciA9IC0xOworCQkJCWdvdG8gb3V0OwogCQkJfQotCSAgICAKLQkJCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQkJb3V0YiAoMHgwLCBkZXYtPmZ4X21vZF9kYXRhKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImludmFsaWQgYWRkcmVzcyIKKwkJCQkgICAiIGluIHJlZ2lzdGVyIGRhdGFcbiIpOworCQkJZXJyID0gLTE7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIAotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDIsIGRldi0+Znhfb3ApOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11dGUgb24gKi8KKwlkZXYtPmZ4X2luaXRpYWxpemVkID0gMTsKKwllcnIgPSAwOwogCi0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHg0NCwgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9sc2IpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4NDIsIGRldi0+ZnhfZHNwX2FkZHIpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX21zYik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbHNiKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDQzLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHg3YywgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9sc2IpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4N2UsIGRldi0+ZnhfZHNwX2FkZHIpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX21zYik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbHNiKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDQ2LCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHg0OSwgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9sc2IpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4NDcsIGRldi0+ZnhfZHNwX2FkZHIpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX21zYik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbHNiKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDRhLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0KLQkvKiBlaXRoZXIgYmVjYXVzZSBvZiBzdHVwaWRpdHkgYnkgVEIncyBwcm9ncmFtbWVycywgb3IgYmVjYXVzZSBpdAotCSAgIGFjdHVhbGx5IGRvZXMgc29tZXRoaW5nLCByZXplcm8gdGhlIE1PRCBwYWdlLgotCSovCi0JZm9yIChpID0gMHgxMDsgaSA8PSAweGZmOyBpKyspIHsKLQkKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgewotCQkJcmV0dXJuICgtMSk7Ci0JCX0KLQkKLQkJb3V0YiAoaSwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKDB4MCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JfQotCS8qIGxvYWQgcGFnZSB6ZXJvICovCi0KLQlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYtPmZ4X2xjcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfYWRkcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX3plcm8pOyBpICs9IDIpIHsKLQkJb3V0YiAocGFnZV96ZXJvW2ldLCBkZXYtPmZ4X2RzcF9tc2IpOwotCQlvdXRiIChwYWdlX3plcm9baSsxXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0JLyogTm93IGxvYWQgcGFnZSBvbmUgKi8KLQotCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi0+ZnhfbGNyKTsKLQlvdXRiICgweDAxLCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2Vfb25lKTsgaSArPSAyKSB7Ci0JCW91dGIgKHBhZ2Vfb25lW2ldLCBkZXYtPmZ4X2RzcF9tc2IpOwotCQlvdXRiIChwYWdlX29uZVtpKzFdLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0gICAgCi0Jb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LT5meF9sY3IpOwotCW91dGIgKDB4MDIsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2FkZHIpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV90d28pOyBpKyspIHsKLQkJb3V0YiAocGFnZV90d29baV0sIGRldi0+ZnhfZHNwX2xzYik7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLSAgICAKLQlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYtPmZ4X2xjcik7Ci0Jb3V0YiAoMHgwMywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfYWRkcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX3RocmVlKTsgaSsrKSB7Ci0JCW91dGIgKHBhZ2VfdGhyZWVbaV0sIGRldi0+ZnhfZHNwX2xzYik7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLSAgICAKLQlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYtPmZ4X2xjcik7Ci0Jb3V0YiAoMHgwNCwgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfYWRkcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX2ZvdXIpOyBpKyspIHsKLQkJb3V0YiAocGFnZV9mb3VyW2ldLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQkvKiBMb2FkIG1lbW9yeSBhcmVhIChwYWdlIHNpeCkgKi8KLSAgICAKLQlvdXRiIChGWF9MU0JfVFJBTlNGRVIsIGRldi0+ZnhfbGNyKTsgCi0Jb3V0YiAoMHgwNiwgZGV2LT5meF9kc3BfcGFnZSk7IAotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV9zaXgpOyBpICs9IDMpIHsKLQkJb3V0YiAocGFnZV9zaXhbaV0sIGRldi0+ZnhfZHNwX2FkZHIpOwotCQlvdXRiIChwYWdlX3NpeFtpKzFdLCBkZXYtPmZ4X2RzcF9tc2IpOwotCQlvdXRiIChwYWdlX3NpeFtpKzJdLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0gICAgCi0Jb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LT5meF9sY3IpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2FkZHIpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV9zZXZlbik7IGkgKz0gMikgewotCQlvdXRiIChwYWdlX3NldmVuW2ldLCBkZXYtPmZ4X2RzcF9tc2IpOwotCQlvdXRiIChwYWdlX3NldmVuW2krMV0sIGRldi0+ZnhfZHNwX2xzYik7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCS8qIE5vdyBzZXR1cCB0aGUgTU9EIGFyZWEuIFdlIGRvIHRoaXMgYWxnb3JpdGhtaWNhbGx5IGluIG9yZGVyIHRvCi0JICAgc2F2ZSBhIGxpdHRsZSBkYXRhIHNwYWNlLiBJdCBjb3VsZCBiZSBkb25lIGluIHRoZSBzYW1lIGZhc2hpb24KLQkgICBhcyB0aGUgInBhZ2VzIi4KLQkqLwotCi0JZm9yIChpID0gMHgwMDsgaSA8PSAweDBmOyBpKyspIHsKLQkJb3V0YiAoMHgwMSwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQkJb3V0YiAoMHgwMiwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKDB4MDAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlmb3IgKGkgPSAweGIwOyBpIDw9IDB4YmY7IGkrKykgewotCQlvdXRiIChpLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQkJb3V0YiAoMHgyMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCWZvciAoaSA9IDB4ZjA7IGkgPD0gMHhmZjsgaSsrKSB7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweDIwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0JZm9yIChpID0gMHgxMDsgaSA8PSAweDFkOyBpKyspIHsKLQkJb3V0YiAoaSwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKDB4ZmYsIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlvdXRiICgweDFlLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDQwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQotCWZvciAoaSA9IDB4MWY7IGkgPD0gMHgyZDsgaSsrKSB7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweGZmLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0Jb3V0YiAoMHgyZSwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0KLQlmb3IgKGkgPSAweDJmOyBpIDw9IDB4M2U7IGkrKykgewotCQlvdXRiIChpLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQkJb3V0YiAoMHgwMCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCW91dGIgKDB4M2YsIGRldi0+ZnhfbW9kX2FkZHIpOwotCW91dGIgKDB4MjAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCi0JZm9yIChpID0gMHg0MDsgaSA8PSAweDRkOyBpKyspIHsKLQkJb3V0YiAoaSwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKDB4MDAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlvdXRiICgweDRlLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDBlLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDRmLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDBlLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQotCi0JZm9yIChpID0gMHg1MDsgaSA8PSAweDZiOyBpKyspIHsKLQkJb3V0YiAoaSwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKDB4MDAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlvdXRiICgweDZjLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDQwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQotCW91dGIgKDB4NmQsIGRldi0+ZnhfbW9kX2FkZHIpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCi0Jb3V0YiAoMHg2ZSwgZGV2LT5meF9tb2RfYWRkcik7Ci0Jb3V0YiAoMHg0MCwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0KLQlvdXRiICgweDZmLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDQwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQotCWZvciAoaSA9IDB4NzA7IGkgPD0gMHg3ZjsgaSsrKSB7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweGMwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotICAgIAotCWZvciAoaSA9IDB4ODA7IGkgPD0gMHhhZjsgaSsrKSB7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweDAwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0JZm9yIChpID0gMHhjMDsgaSA8PSAweGRkOyBpKyspIHsKLQkJb3V0YiAoaSwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKDB4MDAsIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlvdXRiICgweGRlLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDEwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweGRmLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDEwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQotCWZvciAoaSA9IDB4ZTA7IGkgPD0gMHhlZjsgaSsrKSB7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiICgweDAwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0JZm9yIChpID0gMHgwMDsgaSA8PSAweDBmOyBpKyspIHsKLQkJb3V0YiAoMHgwMSwgZGV2LT5meF9tb2RfYWRkcik7Ci0JCW91dGIgKGksIGRldi0+ZnhfbW9kX2RhdGEpOwotCQlvdXRiICgweDAyLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQkJb3V0YiAoMHgwMSwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCW91dGIgKDB4MDIsIGRldi0+Znhfb3ApOyAvKiBtdXRlIG9uICovCi0KLQkvKiBOb3cgc2V0IHRoZSBjb2VmZmljaWVudHMgYW5kIHNvIGZvcnRoIGZvciB0aGUgcHJvZ3JhbXMgYWJvdmUgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvZWZmaWNpZW50cyk7IGkgKz0gNCkgewotCQlvdXRiIChjb2VmZmljaWVudHNbaV0sIGRldi0+ZnhfZHNwX3BhZ2UpOwotCQlvdXRiIChjb2VmZmljaWVudHNbaSsxXSwgZGV2LT5meF9kc3BfYWRkcik7Ci0JCW91dGIgKGNvZWZmaWNpZW50c1tpKzJdLCBkZXYtPmZ4X2RzcF9tc2IpOwotCQlvdXRiIChjb2VmZmljaWVudHNbaSszXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotCi0JLyogU29tZSBzZXR0aW5ncyAoPykgdGhhdCBhcmUgdG9vIHNtYWxsIHRvIGJ1bmRsZSBpbnRvIGxvb3BzICovCi0KLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDFlLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDE0LCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweGRlLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDIwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweGRmLCBkZXYtPmZ4X21vZF9hZGRyKTsKLQlvdXRiICgweDIwLCBkZXYtPmZ4X21vZF9kYXRhKTsKLSAgICAKLQkvKiBzb21lIG1vcmUgY29lZmZpY2llbnRzICovCi0KLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA2LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDc4LCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4NDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHgwMywgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwZiwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweGZmLCBkZXYtPmZ4X2RzcF9sc2IpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MGIsIGRldi0+ZnhfZHNwX2FkZHIpOwotCW91dGIgKDB4MGYsIGRldi0+ZnhfZHNwX21zYik7Ci0Jb3V0YiAoMHhmZiwgZGV2LT5meF9kc3BfbHNiKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDAyLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0JaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0Jb3V0YiAoMHgwNywgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHgwYSwgZGV2LT5meF9kc3BfYWRkcik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbXNiKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9sc2IpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4NDYsIGRldi0+ZnhfZHNwX2FkZHIpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX21zYik7Ci0Jb3V0YiAoMHgwMCwgZGV2LT5meF9kc3BfbHNiKTsKLQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDQ5LCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9tc2IpOwotCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0gICAgCi0JLyogTm93LCBmb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgbGV0cyByZWxvYWQgZXZlcnkgcGFnZQotCSAgIGFuZCBhbGwgdGhlIGNvZWZmaWNpZW50cyBvdmVyIGFnYWluLiBJIGhhdmUgKk5PKiBpZGVhCi0JICAgd2h5IHRoaXMgaXMgZG9uZS4gSSBkbyBrbm93IHRoYXQgbm8gc291bmQgaXMgcHJvZHVjZWQKLQkgICBpcyB0aGlzIHBoYXNlIGlzIG9taXR0ZWQuCi0JKi8KLQotCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi0+ZnhfbGNyKTsKLQlvdXRiICgweDAwLCBkZXYtPmZ4X2RzcF9wYWdlKTsgIAotCW91dGIgKDB4MTAsIGRldi0+ZnhfZHNwX2FkZHIpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV96ZXJvX3YyKTsgaSArPSAyKSB7Ci0JCW91dGIgKHBhZ2VfemVyb192MltpXSwgZGV2LT5meF9kc3BfbXNiKTsKLQkJb3V0YiAocGFnZV96ZXJvX3YyW2krMV0sIGRldi0+ZnhfZHNwX2xzYik7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLSAgICAKLQlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYtPmZ4X2xjcik7Ci0Jb3V0YiAoMHgwMSwgZGV2LT5meF9kc3BfcGFnZSk7Ci0Jb3V0YiAoMHgxMCwgZGV2LT5meF9kc3BfYWRkcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX29uZV92Mik7IGkgKz0gMikgewotCQlvdXRiIChwYWdlX29uZV92MltpXSwgZGV2LT5meF9kc3BfbXNiKTsKLQkJb3V0YiAocGFnZV9vbmVfdjJbaSsxXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotICAgIAotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotICAgIAotCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi0+ZnhfbGNyKTsKLQlvdXRiICgweDAyLCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDEwLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfdHdvX3YyKTsgaSsrKSB7Ci0JCW91dGIgKHBhZ2VfdHdvX3YyW2ldLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0Jb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LT5meF9sY3IpOwotCW91dGIgKDB4MDMsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MTAsIGRldi0+ZnhfZHNwX2FkZHIpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV90aHJlZV92Mik7IGkrKykgewotCQlvdXRiIChwYWdlX3RocmVlX3YyW2ldLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0gICAgCi0Jb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LT5meF9sY3IpOwotCW91dGIgKDB4MDQsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCW91dGIgKDB4MTAsIGRldi0+ZnhfZHNwX2FkZHIpOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV9mb3VyX3YyKTsgaSsrKSB7Ci0JCW91dGIgKHBhZ2VfZm91cl92MltpXSwgZGV2LT5meF9kc3BfbHNiKTsKLQkJaWYgKCF3YXZlZnJvbnRfZnhfaWRsZSAoZGV2KSkgcmV0dXJuICgtMSk7Ci0JfQotICAgIAotCW91dGIgKEZYX0xTQl9UUkFOU0ZFUiwgZGV2LT5meF9sY3IpOwotCW91dGIgKDB4MDYsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCi0JLyogUGFnZSBzaXggdi4yIGlzIGFsZ29yaXRobWljICovCi0gICAgCi0JZm9yIChpID0gMHgxMDsgaSA8PSAweDNlOyBpICs9IDIpIHsKLQkJb3V0YiAoaSwgZGV2LT5meF9kc3BfYWRkcik7Ci0JCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX21zYik7Ci0JCW91dGIgKDB4MDAsIGRldi0+ZnhfZHNwX2xzYik7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi0+ZnhfbGNyKTsKLQlvdXRiICgweDA3LCBkZXYtPmZ4X2RzcF9wYWdlKTsKLQlvdXRiICgweDEwLCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2Vfc2V2ZW5fdjIpOyBpICs9IDIpIHsKLQkJb3V0YiAocGFnZV9zZXZlbl92MltpXSwgZGV2LT5meF9kc3BfbXNiKTsKLQkJb3V0YiAocGFnZV9zZXZlbl92MltpKzFdLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlmb3IgKGkgPSAweDAwOyBpIDwgc2l6ZW9mKG1vZF92Mik7IGkgKz0gMikgewotCQlvdXRiIChtb2RfdjJbaV0sIGRldi0+ZnhfbW9kX2FkZHIpOwotCQlvdXRiIChtb2RfdjJbaSsxXSwgZGV2LT5meF9tb2RfZGF0YSk7Ci0JCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvZWZmaWNpZW50czIpOyBpICs9IDQpIHsKLQkJb3V0YiAoY29lZmZpY2llbnRzMltpXSwgZGV2LT5meF9kc3BfcGFnZSk7Ci0JCW91dGIgKGNvZWZmaWNpZW50czJbaSsxXSwgZGV2LT5meF9kc3BfYWRkcik7Ci0JCW91dGIgKGNvZWZmaWNpZW50czJbaSsyXSwgZGV2LT5meF9kc3BfbXNiKTsKLQkJb3V0YiAoY29lZmZpY2llbnRzMltpKzNdLCBkZXYtPmZ4X2RzcF9sc2IpOwotCQlpZiAoIXdhdmVmcm9udF9meF9pZGxlIChkZXYpKSByZXR1cm4gKC0xKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChjb2VmZmljaWVudHMzKTsgaSArPSAyKSB7Ci0JCWludCB4OwotCi0JCW91dGIgKDB4MDcsIGRldi0+ZnhfZHNwX3BhZ2UpOwotCQl4ID0gKGkgJSA0KSA/IDB4NGUgOiAweDRjOwotCQlvdXRiICh4LCBkZXYtPmZ4X2RzcF9hZGRyKTsKLQkJb3V0YiAoY29lZmZpY2llbnRzM1tpXSwgZGV2LT5meF9kc3BfbXNiKTsKLQkJb3V0YiAoY29lZmZpY2llbnRzM1tpKzFdLCBkZXYtPmZ4X2RzcF9sc2IpOwotCX0KLQotCW91dGIgKDB4MDAsIGRldi0+Znhfb3ApOyAvKiBtdXRlIG9mZiAqLwotCWlmICghd2F2ZWZyb250X2Z4X2lkbGUgKGRldikpIHJldHVybiAoLTEpOwotCi0JcmV0dXJuICgwKTsKK291dDoKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisJaWYgKGZpcm13YXJlICE9ICZ5c3MyMjVfcmVnaXN0ZXJzX2Zpcm13YXJlKQorI2VuZGlmCisJCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd2F2ZWZyb250L3lzczIyNS5jIGIvc291bmQvaXNhL3dhdmVmcm9udC95c3MyMjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjZiZTNmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC95c3MyMjUuYwpAQCAtMCwwICsxLDI3MzkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgYnkgUGF1bCBEYXZpcyA8cGJkQG9wLm5ldD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIHdlaXJkIHN0dWZmLCBkZXJpdmVkIGZyb20gcG9ydCBJL08gdHJhY2luZyB3aXRoIGRvc2VtdSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIGFkZHI7CisJdW5zaWduZWQgY2hhciBkYXRhOworfSB5c3MyMjVfcmVnaXN0ZXJzW10gX19kZXZpbml0ZGF0YSA9IHsKKy8qIFNldCBhbGwgYml0cyBmb3IgYWxsIGNoYW5uZWxzIG9uIHRoZSBNT0QgdW5pdCB0byB6ZXJvICovCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDEyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDIxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDMwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDMzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2IgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2UgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDUxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDYwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDYzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDcyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2EgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2QgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDgxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDkwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDkzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDljIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDlmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGEyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGIxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGMwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGMzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2IgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2UgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGUxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGYwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGYzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZmIH0sIHsgMHhmLCAweDAwIH0sCisKKy8qIFhYWCBCdXQgd2h5IGRvIHRoaXMgdHdpY2U/ICovCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDEyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDIxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDMwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDMzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2IgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2UgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDUxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDYwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDYzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDcyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2EgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2QgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDgxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDkwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDkzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDljIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDlmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGEyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGIxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGMwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGMzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2IgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2UgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGUxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGYwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGYzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZmIH0sIHsgMHhmLCAweDAwIH0sCisKKy8qIG11dGUgb24gKi8KK3sgV0FJVF9JRExFIH0sIHsgMHg4LCAweDAyIH0sCisKK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ0IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0MiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDMgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDdjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3ZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDYgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ5IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0NyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGEgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKKworLyogZWl0aGVyIGJlY2F1c2Ugb2Ygc3R1cGlkaXR5IGJ5IFRCJ3MgcHJvZ3JhbW1lcnMsIG9yIGJlY2F1c2UgaXQKKyAgIGFjdHVhbGx5IGRvZXMgc29tZXRoaW5nLCByZXplcm8gdGhlIE1PRCBwYWdlLiAqLworeyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDExIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDE3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgxZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDIwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDIzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MjggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDI5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgyZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MmUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDJmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDMyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4MzcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDM4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2EgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4M2QgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDNlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHgzZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDQ3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NDkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDRkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg0ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NGYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDUwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDUzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NTggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDU5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg1ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NWUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDVmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDYyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NjcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDY4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NmQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDZlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg2ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDcxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3MiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3NSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDc3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3OCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4NzkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3YiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2MgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDdkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg3ZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4N2YgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDgwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4MSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDgzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4NCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4NyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ODggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDg5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4YSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg4ZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OGUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDhmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5MCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDkyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5MyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5NiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OTcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDk4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5OSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDliIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5YyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4OWQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDllIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHg5ZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGExIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGE3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YTkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGFkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhhZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YWYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGIwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGIzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YjggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGI5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhiZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YmUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGJmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGMyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4YzcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGM4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2EgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4Y2QgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGNlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhjZiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDAgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQxIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkMiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ0IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkNSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGQ3IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkOCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZDkgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRhIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkYiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGMgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGRkIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkZSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGYgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGUwIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlMSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGUzIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlNCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU2IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlNyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZTggfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGU5IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlYSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWIgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVjIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhlZCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZWUgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGVmIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmMCB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGYyIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmMyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY1IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmNiB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZjcgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGY4IH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmOSB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmEgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZiIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmYyB9LCB7IDB4ZiwgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZmQgfSwgeyAweGYsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweGZlIH0sIHsgMHhmLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhmZiB9LCB7IDB4ZiwgMHgwMCB9LAorCisvKiBsb2FkIHBhZ2UgemVybyAqLworeyAweDksIDB4MDUgfSwgeyAweGIsIDB4MDAgfSwgeyAweGEsIDB4MDAgfSwKKworeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4N2MgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDFlIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweGY1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDMyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxNCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4NzYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg4MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDE4IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxOSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MWEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAxIH0sIHsgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MTcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHg4MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDEwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHhhMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDMgfSwgeyAweGMsIDB4ZDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHhmMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDEzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4ZjQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweGUwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDE2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDUwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg3MSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4OTIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg4MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweGIzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4YTAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHhkNCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg4MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4ZjUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg3MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4YTAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDExIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDE3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxYiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MWQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweGRmIH0sIHsgV0FJVF9JRExFIH0sCisKKy8qIE5vdyBsb2FkIHBhZ2Ugb25lICovCit7IDB4OSwgMHgwNSB9LCB7IDB4YiwgMHgwMSB9LCB7IDB4YSwgMHgwMCB9LAorCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MTkgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDFmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHhkOCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxOSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxOCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDEgfSwgeyAweGMsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAxIH0sIHsgMHhjLCAweGZhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxYSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ODAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhmYiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4YTAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxYiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ZDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhmNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDMgfSwgeyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MWMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweDNjIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDMgfSwgeyAweGMsIDB4M2YgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweGRmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweDVkIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDMgfSwgeyAweGMsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHg3ZCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDMgfSwgeyAweGMsIDB4OWUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAzIH0sIHsgMHhjLCAweGJlIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDMgfSwgeyAweGMsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgxYiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ZGIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhkYiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweGUwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ZmIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweGZiIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHg2MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MWIgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweDksIDB4MDUgfSwgeyAweGIsIDB4MDIgfSwgeyAweGEsIDB4MDAgfSwKKworeyAweGMsIDB4YzQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDI1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweGM0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDI1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0NiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ0IH0sIHsgV0FJVF9JRExFIH0sCisKK3sgMHg5LCAweDA1IH0sIHsgMHhiLCAweDAzIH0sIHsgMHhhLCAweDAwIH0sCisKK3sgMHhjLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg4MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4ODAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg3MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4OSwgMHgwNSB9LCB7IDB4YiwgMHgwNCB9LCB7IDB4YSwgMHgwMCB9LAorCit7IDB4YywgMHg2MyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDI2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MmMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyNCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDJlIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg2MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDYwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHg2MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4NjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDYyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgyMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKKworLyogTG9hZCBtZW1vcnkgYXJlYSAocGFnZSBzaXgpICovCit7IDB4OSwgMHgwMSB9LCB7IDB4YiwgMHgwNiB9LAorCit7IDB4YSwgMHgwMCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MDIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDA0IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgwNiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MDggfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDBhIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgwYyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MGUgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDEwIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgxMiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MTQgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDE2IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgxOCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MWEgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDFjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgxZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MjAgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDIyIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyNCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MjYgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDI4IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyYSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MmMgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDJlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgzMCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MzIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDM0IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgzNiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MzggfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDNhIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgzYyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4M2UgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDQwIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg0MiB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NDQgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDQ2IH0sIHsgMHhkLCAweDBhIH0sIHsgMHhjLCAweDIxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg0OCB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHgyMyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NGEgfSwgeyAweGQsIDB4MjMgfSwgeyAweGMsIDB4MWIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDRjIH0sIHsgMHhkLCAweDM3IH0sIHsgMHhjLCAweDhmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHg0NSB9LCB7IDB4YywgMHg3NyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NTAgfSwgeyAweGQsIDB4NTIgfSwgeyAweGMsIDB4ZTIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDUyIH0sIHsgMHhkLCAweDFjIH0sIHsgMHhjLCAweDkyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg1NCB9LCB7IDB4ZCwgMHgxYyB9LCB7IDB4YywgMHg1MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NTYgfSwgeyAweGQsIDB4MDcgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDU4IH0sIHsgMHhkLCAweDJmIH0sIHsgMHhjLCAweGM2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg1YSB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NWMgfSwgeyAweGQsIDB4MzAgfSwgeyAweGMsIDB4MDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDVlIH0sIHsgMHhkLCAweDE3IH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg2MCB9LCB7IDB4ZCwgMHgzZCB9LCB7IDB4YywgMHhkYSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NjIgfSwgeyAweGQsIDB4MjkgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDY0IH0sIHsgMHhkLCAweDNlIH0sIHsgMHhjLCAweDQxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg2NiB9LCB7IDB4ZCwgMHgzOSB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NjggfSwgeyAweGQsIDB4NGMgfSwgeyAweGMsIDB4NDggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDZhIH0sIHsgMHhkLCAweDQ5IH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg2YyB9LCB7IDB4ZCwgMHg0YyB9LCB7IDB4YywgMHg2YyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NmUgfSwgeyAweGQsIDB4MTEgfSwgeyAweGMsIDB4ZDIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDcwIH0sIHsgMHhkLCAweDE2IH0sIHsgMHhjLCAweDBjIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg3MiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4NzQgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4ODAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDc2IH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg3OCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg4MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4N2EgfSwgeyAweGQsIDB4MTMgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDdjIH0sIHsgMHhkLCAweDgwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHg3ZSB9LCB7IDB4ZCwgMHg4MCB9LCB7IDB4YywgMHg4MCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4OSwgMHgwNSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHgwMCB9LAorCit7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA4IH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDggfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA4IH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ZTkgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA2IH0sIHsgMHhjLCAweDhjIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg4YyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDFhIH0sIHsgMHhjLCAweDc1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHg4YiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDQgfSwgeyAweGMsIDB4ZTkgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBiIH0sIHsgMHhjLCAweDE2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgxYSB9LCB7IDB4YywgMHgzOCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGQgfSwgeyAweGMsIDB4YzggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA0IH0sIHsgMHhjLCAweDZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHg5MSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA2IH0sIHsgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4OGYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg2MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDYgfSwgeyAweGMsIDB4NjIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDdiIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDYgfSwgeyAweGMsIDB4OTcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA2IH0sIHsgMHhjLCAweDk3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHg1MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA2IH0sIHsgMHhjLCAweGY2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHhmNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4MTkgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA1IH0sIHsgMHhjLCAweDU1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg1NSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDUgfSwgeyAweGMsIDB4NTUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA1IH0sIHsgMHhjLCAweDU1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg1NSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDUgfSwgeyAweGMsIDB4NTUgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA1IH0sIHsgMHhjLCAweDU1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg1NSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MTQgfSwgeyAweGMsIDB4ZGEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDBkIH0sIHsgMHhjLCAweDkzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHhkYSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDUgfSwgeyAweGMsIDB4OTMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDE0IH0sIHsgMHhjLCAweGRhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHg5MyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDQgfSwgeyAweGMsIDB4ZGEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDA1IH0sIHsgMHhjLCAweDkzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDIgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKKworLyogTm93IHNldHVwIHRoZSBNT0QgYXJlYS4gKi8KK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwOCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA5IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MGEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwYiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDBjIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MGQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwZSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDBmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4ZSwgMHhiMCB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjEgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGIyIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiMyB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjQgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGI1IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiNiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjcgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGI4IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiOSB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YmEgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGJiIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiYyB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YmQgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGJlIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiZiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4ZSwgMHhmMCB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjEgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGYyIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmMyB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjQgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGY1IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmNiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjcgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGY4IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmOSB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZmEgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGZiIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmYyB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZmQgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGZlIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmZiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4ZSwgMHgxMCB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTEgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDEyIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxMyB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTQgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDE1IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxNiB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTcgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDE4IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxOSB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MWEgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDFiIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxYyB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MWQgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDFlIH0sIHsgMHhmLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxZiB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjAgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDIxIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyMiB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjMgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDI0IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyNSB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjYgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDI3IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyOCB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjkgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDJhIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyYiB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MmMgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDJkIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyZSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MmYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDMwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzMSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDMzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzNCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDM2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzNyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzggfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDM5IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzYSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4M2IgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDNjIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzZCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4M2UgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDNmIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0MCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0MyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQ1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0NiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQ4IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0OSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NGEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDRiIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0YyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NGQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDRlIH0sIHsgMHhmLCAweDBlIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0ZiB9LCB7IDB4ZiwgMHgwZSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDUxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1MiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDU0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1NSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDU3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1OCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTkgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDVhIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1YiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NWMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDVkIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1ZSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NWYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDYwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2MSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDYzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2NCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDY2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2NyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjggfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDY5IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2YSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NmIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDZjIH0sIHsgMHhmLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2ZCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NmUgfSwgeyAweGYsIDB4NDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDZmIH0sIHsgMHhmLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3MCB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzEgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDcyIH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3MyB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzQgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDc1IH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3NiB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzcgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDc4IH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3OSB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4N2EgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDdiIH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3YyB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4N2QgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDdlIH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3ZiB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDgxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4MiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDg0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4NSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDg3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4OCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODkgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDhhIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4YiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OGMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDhkIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4ZSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OGYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDkwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5MSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDkzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5NCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDk2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5NyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTggfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDk5IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5YSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OWIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDljIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5ZCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OWUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDlmIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhMCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGEyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhMyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGE1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhNiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGE4IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhOSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YWEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGFiIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhYyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YWQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGFlIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhZiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4ZSwgMHhjMCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGMyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjMyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGM1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjNiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGM4IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjOSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4Y2EgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGNiIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjYyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4Y2QgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGNlIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjZiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQ0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkNSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQ3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkOCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDkgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGRhIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkYiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZGMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGRkIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkZSB9LCB7IDB4ZiwgMHgxMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZGYgfSwgeyAweGYsIDB4MTAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGUwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlMSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGUzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlNCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGU2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlNyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTggfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGU5IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlYSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZWIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGVjIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlZCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZWUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGVmIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCisKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAwIH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMSB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDIgfSwgeyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAzIH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwNCB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDUgfSwgeyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA2IH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwNyB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDggfSwgeyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA5IH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwYSB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MGIgfSwgeyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDBjIH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwZCB9LCB7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MGUgfSwgeyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDBmIH0sIHsgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCisKKy8qIG11dGUgb24gKi8KK3sgMHg4LCAweDAyIH0sCisKKy8qIE5vdyBzZXQgdGhlIGNvZWZmaWNpZW50cyBhbmQgc28gZm9ydGggZm9yIHRoZSBwcm9ncmFtcyBhYm92ZSAqLworeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDYgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ5IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwMCB9LCB7IDB4YSwgMHg0YiB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHgxMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDAgfSwgeyAweGEsIDB4NGQgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MzIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ2IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0OSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDAgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQxIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwMSB9LCB7IDB4YSwgMHg0MCB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDEgfSwgeyAweGEsIDB4NDEgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4NjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQwIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0MSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDcgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRhIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwMCB9LCB7IDB4YSwgMHg0NyB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDAgfSwgeyAweGEsIDB4NGEgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ3IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4N2MgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDdlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwMCB9LCB7IDB4YSwgMHgwMCB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHgxYyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4N2MgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDdlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0NCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDAgfSwgeyAweGEsIDB4NDQgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ0IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0MiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDMgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDAwIH0sIHsgMHhhLCAweDQyIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweDFhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwMCB9LCB7IDB4YSwgMHg0MyB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQzIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0MCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDEgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDAxIH0sIHsgMHhhLCAweDQwIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwMSB9LCB7IDB4YSwgMHg0MSB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHg2MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDAgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQxIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0NCB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQzIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0MCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDEgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDUxIH0sIHsgMHhkLCAweDA2IH0sIHsgMHhjLCAweDQwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg1MCB9LCB7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg0MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGYgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4ODEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDUzIH0sIHsgMHhkLCAweDFhIH0sIHsgMHhjLCAweDc2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg1NCB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHg4YiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NTUgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4ZTkgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDU2IH0sIHsgMHhkLCAweDBiIH0sIHsgMHhjLCAweDE3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg1NyB9LCB7IDB4ZCwgMHgxYSB9LCB7IDB4YywgMHgzOCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NTggfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4YzkgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDU5IH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweDZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg1YSB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHg5MSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NzMgfSwgeyAweGQsIDB4MTQgfSwgeyAweGMsIDB4ZGEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDc0IH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweDkzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3NSB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHhkOSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NzYgfSwgeyAweGQsIDB4MDUgfSwgeyAweGMsIDB4OTMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDc3IH0sIHsgMHhkLCAweDE0IH0sIHsgMHhjLCAweGRhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3OCB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHg5MyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NzkgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4ZDkgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDdhIH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweDkzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg1ZSB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHg2OCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NWMgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4MzEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDVkIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweDMxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg2MiB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHg1MiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NjAgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4NzYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDYxIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweDc2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg2NiB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHgyZSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NjQgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4ZGEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDY1IH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweGRhIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg2YSB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhmNiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NjggfSwgeyAweGQsIDB4MDUgfSwgeyAweGMsIDB4NjIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDY5IH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweDYyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg0NiB9LCB7IDB4ZCwgMHgwYSB9LCB7IDB4YywgMHgyMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NDggfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4MjQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDZlIH0sIHsgMHhkLCAweDExIH0sIHsgMHhjLCAweGQzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg3MCB9LCB7IDB4ZCwgMHgxNSB9LCB7IDB4YywgMHhjYiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NTIgfSwgeyAweGQsIDB4MjAgfSwgeyAweGMsIDB4OTMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDU0IH0sIHsgMHhkLCAweDIwIH0sIHsgMHhjLCAweDU0IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg0YSB9LCB7IDB4ZCwgMHgyNyB9LCB7IDB4YywgMHgxZCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NTggfSwgeyAweGQsIDB4MmYgfSwgeyAweGMsIDB4YzggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDVjIH0sIHsgMHhkLCAweDMwIH0sIHsgMHhjLCAweDA3IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgzNyB9LCB7IDB4YywgMHg5MCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NjAgfSwgeyAweGQsIDB4M2QgfSwgeyAweGMsIDB4ZGIgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDY0IH0sIHsgMHhkLCAweDNlIH0sIHsgMHhjLCAweDQyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHg0NSB9LCB7IDB4YywgMHg3OCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NjggfSwgeyAweGQsIDB4NGMgfSwgeyAweGMsIDB4NDggfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA2IH0sIHsgMHhhLCAweDZjIH0sIHsgMHhkLCAweDRjIH0sIHsgMHhjLCAweDZjIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNiB9LCB7IDB4YSwgMHg1MCB9LCB7IDB4ZCwgMHg1MiB9LCB7IDB4YywgMHhlMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NDIgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4YmEgfSwgeyBXQUlUX0lETEUgfSwKKworLyogU29tZSBzZXR0aW5ncyAoPykgKi8KK3sgV0FJVF9JRExFIH0sIHsgMHhlLCAweDFlIH0sIHsgMHhmLCAweDE0IH0sCit7IFdBSVRfSURMRSB9LCB7IDB4ZSwgMHhkZSB9LCB7IDB4ZiwgMHgyMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGUsIDB4ZGYgfSwgeyAweGYsIDB4MjAgfSwKKworLyogc29tZSBtb3JlIGNvZWZmaWNpZW50cyAqLworeyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDYgfSwgeyAweGEsIDB4NzggfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4NDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDAzIH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHgwYiB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LAoreyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4MDIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKK3sgV0FJVF9JRExFIH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDBhIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sCit7IFdBSVRfSURMRSB9LCB7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0NiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LAoreyBXQUlUX0lETEUgfSwgeyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDkgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKKworLyogTm93LCBmb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgbGV0cyByZWxvYWQgZXZlcnkgcGFnZQorICAgYW5kIGFsbCB0aGUgY29lZmZpY2llbnRzIG92ZXIgYWdhaW4uIEkgaGF2ZSAqTk8qIGlkZWEKKyAgIHdoeSB0aGlzIGlzIGRvbmUuIEkgZG8ga25vdyB0aGF0IG5vIHNvdW5kIGlzIHByb2R1Y2VkCisgICBpcyB0aGlzIHBoYXNlIGlzIG9taXR0ZWQuICovCit7IDB4OSwgMHgwNSB9LCB7IDB4YiwgMHgwMCB9LCB7IDB4YSwgMHgxMCB9LAorCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAyIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCisKK3sgMHg5LCAweDA1IH0sIHsgMHhiLCAweDAxIH0sIHsgMHhhLCAweDEwIH0sCisKK3sgMHhkLCAweDAxIH0sIHsgMHhjLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHhmYSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MWEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKKworeyBXQUlUX0lETEUgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweDksIDB4MDUgfSwgeyAweGIsIDB4MDIgfSwgeyAweGEsIDB4MTAgfSwKKworeyAweGMsIDB4NDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDQ2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4OSwgMHgwNSB9LCB7IDB4YiwgMHgwMyB9LCB7IDB4YSwgMHgxMCB9LAorCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCisKK3sgMHg5LCAweDA1IH0sIHsgMHhiLCAweDA0IH0sIHsgMHhhLCAweDEwIH0sCisKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKKworLyogUGFnZSBzaXggdi4yICovCit7IDB4OSwgMHgwMSB9LCB7IDB4YiwgMHgwNiB9LAorCit7IDB4YSwgMHgxMCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MTIgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDE0IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgxNiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MTggfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDFhIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgxYyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MWUgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDIwIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyMiB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MjQgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDI2IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyOCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MmEgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDJjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgyZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MzAgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDMyIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgzNCB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4MzYgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDM4IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YSwgMHgzYSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGEsIDB4M2MgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhhLCAweDNlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCisKK3sgMHg5LCAweDA1IH0sIHsgMHhiLCAweDA3IH0sIHsgMHhhLCAweDEwIH0sCisKK3sgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKKworeyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAyIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDMgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwNCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA1IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwNyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGIwIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiMSB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjIgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGIzIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiNCB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YjUgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGI2IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhiNyB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjAgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGYxIH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmMiB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjMgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGY0IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhmNSB9LCB7IDB4ZiwgMHgyMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZjYgfSwgeyAweGYsIDB4MjAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGY3IH0sIHsgMHhmLCAweDIwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxMCB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTEgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDEyIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxMyB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTQgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDE1IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgxNiB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MTcgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDIwIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyMSB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjIgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDIzIH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyNCB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MjUgfSwgeyAweGYsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDI2IH0sIHsgMHhmLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgyNyB9LCB7IDB4ZiwgMHhmZiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDMxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDM0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgzNSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MzYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDM3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0MCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0MyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDQ1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg0NiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NDcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDUwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1MSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDUzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1NCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NTUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDU2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg1NyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDYxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2MiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDY0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg2NSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NjYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDY3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3MCB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzEgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDcyIH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3MyB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzQgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDc1IH0sIHsgMHhmLCAweGMwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg3NiB9LCB7IDB4ZiwgMHhjMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4NzcgfSwgeyAweGYsIDB4YzAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDgwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4MSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDgzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4NCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ODUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDg2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg4NyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDkxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5MiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDk0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHg5NSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4OTYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDk3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhMCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGEyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhMyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGE1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhhNiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YTcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGMwIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjMSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzIgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGMzIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjNCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4YzUgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGM2IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhjNyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDAgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkMiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDMgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQ0IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhkNSB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZDYgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGQ3IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlMCB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTEgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGUyIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlMyB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTQgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweGU1IH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHhlNiB9LCB7IDB4ZiwgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4ZTcgfSwgeyAweGYsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwMiB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDAzIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDQgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMSB9LCB7IDB4ZiwgMHgwNSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDIgfSwgeyAweGYsIDB4MDEgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAxIH0sIHsgMHhmLCAweDA2IH0sIHsgV0FJVF9JRExFIH0sCit7IDB4ZSwgMHgwMiB9LCB7IDB4ZiwgMHgwMSB9LCB7IFdBSVRfSURMRSB9LAoreyAweGUsIDB4MDEgfSwgeyAweGYsIDB4MDcgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhlLCAweDAyIH0sIHsgMHhmLCAweDAxIH0sIHsgV0FJVF9JRExFIH0sCisKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ2IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0OSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDUgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZmYgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ4IH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3YiB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHhjYyB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4N2QgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4Y2MgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDdjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg3ZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NDYgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDQ5IH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0NyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGEgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwgeyBXQUlUX0lETEUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDAwIH0sIHsgV0FJVF9JRExFIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LCB7IFdBSVRfSURMRSB9LAorCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgwMCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4MDAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHgyOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4NTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweDUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHg3YSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4N2EgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweGEzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHhhMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4Y2MgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAwIH0sIHsgMHhjLCAweGNjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMCB9LCB7IDB4YywgMHhmNSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDAgfSwgeyAweGMsIDB4ZjUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweDFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHgxZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4NDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweDQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHg3MCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4NzAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweDk5IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHg5OSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4YzIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAxIH0sIHsgMHhjLCAweGMyIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMSB9LCB7IDB4YywgMHhlYiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDEgfSwgeyAweGMsIDB4ZWIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweDE0IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHgxNCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4M2QgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweDNkIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHg2NiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4NjYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweDhmIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHg4ZiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4YjggfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAyIH0sIHsgMHhjLCAweGI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMiB9LCB7IDB4YywgMHhlMSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDIgfSwgeyAweGMsIDB4ZTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAzIH0sIHsgMHhjLCAweDBhIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHgwYSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4MzMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAzIH0sIHsgMHhjLCAweDMzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHg1YyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4NWMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDAzIH0sIHsgMHhjLCAweDg1IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHg4NSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4YWUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDAzIH0sIHsgMHhjLCAweGFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwMyB9LCB7IDB4YywgMHhkNyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDMgfSwgeyAweGMsIDB4ZDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweDAwIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHgwMCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4MjggfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweDI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHg1MSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4NTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweDdhIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHg3YSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4YTMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweGEzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHhjYyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDQgfSwgeyAweGMsIDB4Y2MgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA0IH0sIHsgMHhjLCAweGY1IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNCB9LCB7IDB4YywgMHhmNSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDUgfSwgeyAweGMsIDB4MWUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweDFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg0NyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDUgfSwgeyAweGMsIDB4NDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweDcwIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHg3MCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDUgfSwgeyAweGMsIDB4OTkgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweDk5IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHhjMiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDUgfSwgeyAweGMsIDB4YzIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA1IH0sIHsgMHhjLCAweGViIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNSB9LCB7IDB4YywgMHhlYiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDYgfSwgeyAweGMsIDB4MTQgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA2IH0sIHsgMHhjLCAweDE0IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHgzZCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDYgfSwgeyAweGMsIDB4M2QgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA2IH0sIHsgMHhjLCAweDY2IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHg2NiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDYgfSwgeyAweGMsIDB4OGYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA2IH0sIHsgMHhjLCAweDhmIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHhiOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDYgfSwgeyAweGMsIDB4YjggfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA2IH0sIHsgMHhjLCAweGUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNiB9LCB7IDB4YywgMHhlMSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDcgfSwgeyAweGMsIDB4MGEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA3IH0sIHsgMHhjLCAweDBhIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNyB9LCB7IDB4YywgMHgzMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDcgfSwgeyAweGMsIDB4MzMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA3IH0sIHsgMHhjLCAweDVjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNyB9LCB7IDB4YywgMHg1YyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDcgfSwgeyAweGMsIDB4ODUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA3IH0sIHsgMHhjLCAweDg1IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwNyB9LCB7IDB4YywgMHhhZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDcgfSwgeyAweGMsIDB4YWUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA3IH0sIHsgMHhjLCAweGQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwNyB9LCB7IDB4YywgMHhkNyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDggfSwgeyAweGMsIDB4MDAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA4IH0sIHsgMHhjLCAweDAwIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHgyOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDggfSwgeyAweGMsIDB4MjggfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA4IH0sIHsgMHhjLCAweDUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHg1MSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDggfSwgeyAweGMsIDB4N2EgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA4IH0sIHsgMHhjLCAweDdhIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHhhMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDggfSwgeyAweGMsIDB4YTMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA4IH0sIHsgMHhjLCAweGNjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwOCB9LCB7IDB4YywgMHhjYyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDggfSwgeyAweGMsIDB4ZjUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA4IH0sIHsgMHhjLCAweGY1IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwOSB9LCB7IDB4YywgMHgxZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDkgfSwgeyAweGMsIDB4MWUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA5IH0sIHsgMHhjLCAweDQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwOSB9LCB7IDB4YywgMHg0NyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDkgfSwgeyAweGMsIDB4NzAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA5IH0sIHsgMHhjLCAweDcwIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwOSB9LCB7IDB4YywgMHg5OSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MDkgfSwgeyAweGMsIDB4OTkgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDA5IH0sIHsgMHhjLCAweGMyIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwOSB9LCB7IDB4YywgMHhjMiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MDkgfSwgeyAweGMsIDB4ZWIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDA5IH0sIHsgMHhjLCAweGViIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYSB9LCB7IDB4YywgMHgxNCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGEgfSwgeyAweGMsIDB4MTQgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBhIH0sIHsgMHhjLCAweDNkIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYSB9LCB7IDB4YywgMHgzZCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGEgfSwgeyAweGMsIDB4NjYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBhIH0sIHsgMHhjLCAweDY2IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYSB9LCB7IDB4YywgMHg4ZiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGEgfSwgeyAweGMsIDB4OGYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBhIH0sIHsgMHhjLCAweGI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYSB9LCB7IDB4YywgMHhiOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGEgfSwgeyAweGMsIDB4ZTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBhIH0sIHsgMHhjLCAweGUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHgwYSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGIgfSwgeyAweGMsIDB4MGEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBiIH0sIHsgMHhjLCAweDMzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHgzMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGIgfSwgeyAweGMsIDB4NWMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBiIH0sIHsgMHhjLCAweDVjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHg4NSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGIgfSwgeyAweGMsIDB4ODUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBiIH0sIHsgMHhjLCAweGFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYiB9LCB7IDB4YywgMHhhZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGIgfSwgeyAweGMsIDB4ZDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBiIH0sIHsgMHhjLCAweGQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYyB9LCB7IDB4YywgMHgwMCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGMgfSwgeyAweGMsIDB4MDAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBjIH0sIHsgMHhjLCAweDI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYyB9LCB7IDB4YywgMHgyOCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGMgfSwgeyAweGMsIDB4NTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBjIH0sIHsgMHhjLCAweDUxIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYyB9LCB7IDB4YywgMHg3YSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGMgfSwgeyAweGMsIDB4N2EgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBjIH0sIHsgMHhjLCAweGEzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwYyB9LCB7IDB4YywgMHhhMyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGMgfSwgeyAweGMsIDB4Y2MgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBjIH0sIHsgMHhjLCAweGNjIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwYyB9LCB7IDB4YywgMHhmNSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGMgfSwgeyAweGMsIDB4ZjUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweDFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHgxZSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4NDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweDQ3IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHg3MCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4NzAgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweDk5IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHg5OSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4YzIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBkIH0sIHsgMHhjLCAweGMyIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZCB9LCB7IDB4YywgMHhlYiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGQgfSwgeyAweGMsIDB4ZWIgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBlIH0sIHsgMHhjLCAweDE0IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZSB9LCB7IDB4YywgMHgxNCB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGUgfSwgeyAweGMsIDB4M2QgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBlIH0sIHsgMHhjLCAweDNkIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZSB9LCB7IDB4YywgMHg2NiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGUgfSwgeyAweGMsIDB4NjYgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBlIH0sIHsgMHhjLCAweDhmIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZSB9LCB7IDB4YywgMHg4ZiB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGUgfSwgeyAweGMsIDB4YjggfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBlIH0sIHsgMHhjLCAweGI4IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZSB9LCB7IDB4YywgMHhlMSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGUgfSwgeyAweGMsIDB4ZTEgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweDBhIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHgwYSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4MzMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweDMzIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHg1YyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4NWMgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweDg1IH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHg4NSB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGMgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4YWUgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRlIH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweGFlIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0YyB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhkNyB9LAoreyAweGIsIDB4MDcgfSwgeyAweGEsIDB4NGUgfSwgeyAweGQsIDB4MGYgfSwgeyAweGMsIDB4ZDcgfSwKK3sgMHhiLCAweDA3IH0sIHsgMHhhLCAweDRjIH0sIHsgMHhkLCAweDBmIH0sIHsgMHhjLCAweGZmIH0sCit7IDB4YiwgMHgwNyB9LCB7IDB4YSwgMHg0ZSB9LCB7IDB4ZCwgMHgwZiB9LCB7IDB4YywgMHhmZiB9LAorCisvKiBtdXRlIG9mZiAqLworeyAweDgsIDB4MDAgfSwgeyBXQUlUX0lETEUgfQorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9LY29uZmlnIGIvc291bmQvcGNpL0tjb25maWcKaW5kZXggOGE2YjE4MC4uMWJjZmIzYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL0tjb25maWcKKysrIGIvc291bmQvcGNpL0tjb25maWcKQEAgLTIzNiw3ICsyMzYsNyBAQAogY29uZmlnIFNORF9EQVJMQTIwCiAJdHJpc3RhdGUgIihFY2hvYXVkaW8pIERhcmxhMjAiCiAJZGVwZW5kcyBvbiBTTkQKLQlkZXBlbmRzIG9uIEZXX0xPQURFUgorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX1BDTQogCWhlbHAKIAkgIFNheSAnWScgb3IgJ00nIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgRWNob2F1ZGlvIERhcmxhLgpAQCAtMjQ3LDcgKzI0Nyw3IEBACiBjb25maWcgU05EX0dJTkEyMAogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSBHaW5hMjAiCiAJZGVwZW5kcyBvbiBTTkQKLQlkZXBlbmRzIG9uIEZXX0xPQURFUgorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX1BDTQogCWhlbHAKIAkgIFNheSAnWScgb3IgJ00nIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgRWNob2F1ZGlvIEdpbmEuCkBAIC0yNTgsNyArMjU4LDcgQEAKIGNvbmZpZyBTTkRfTEFZTEEyMAogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSBMYXlsYTIwIgogCWRlcGVuZHMgb24gU05ECi0JZGVwZW5kcyBvbiBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9SQVdNSURJCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCkBAIC0yNzAsNyArMjcwLDcgQEAKIGNvbmZpZyBTTkRfREFSTEEyNAogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSBEYXJsYTI0IgogCWRlcGVuZHMgb24gU05ECi0JZGVwZW5kcyBvbiBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCiAJICBTYXkgJ1knIG9yICdNJyB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEVjaG9hdWRpbyBEYXJsYTI0LgpAQCAtMjgxLDcgKzI4MSw3IEBACiBjb25maWcgU05EX0dJTkEyNAogCXRyaXN0YXRlICIoRWNob2F1ZGlvKSBHaW5hMjQiCiAJZGVwZW5kcyBvbiBTTkQKLQlkZXBlbmRzIG9uIEZXX0xPQURFUgorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX1BDTQogCWhlbHAKIAkgIFNheSAnWScgb3IgJ00nIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgRWNob2F1ZGlvIEdpbmEyNC4KQEAgLTI5Miw3ICsyOTIsNyBAQAogY29uZmlnIFNORF9MQVlMQTI0CiAJdHJpc3RhdGUgIihFY2hvYXVkaW8pIExheWxhMjQiCiAJZGVwZW5kcyBvbiBTTkQKLQlkZXBlbmRzIG9uIEZXX0xPQURFUgorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX1JBV01JREkKIAlzZWxlY3QgU05EX1BDTQogCWhlbHAKQEAgLTMwNCw3ICszMDQsNyBAQAogY29uZmlnIFNORF9NT05BCiAJdHJpc3RhdGUgIihFY2hvYXVkaW8pIE1vbmEiCiAJZGVwZW5kcyBvbiBTTkQKLQlkZXBlbmRzIG9uIEZXX0xPQURFUgorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX1JBV01JREkKIAlzZWxlY3QgU05EX1BDTQogCWhlbHAKQEAgLTMxNiw3ICszMTYsNyBAQAogY29uZmlnIFNORF9NSUEKIAl0cmlzdGF0ZSAiKEVjaG9hdWRpbykgTWlhIgogCWRlcGVuZHMgb24gU05ECi0JZGVwZW5kcyBvbiBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9SQVdNSURJCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCkBAIC0zMjgsNyArMzI4LDcgQEAKIGNvbmZpZyBTTkRfRUNITzNHCiAJdHJpc3RhdGUgIihFY2hvYXVkaW8pIDNHIGNhcmRzIgogCWRlcGVuZHMgb24gU05ECi0JZGVwZW5kcyBvbiBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9SQVdNSURJCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCkBAIC0zNDAsNyArMzQwLDcgQEAKIGNvbmZpZyBTTkRfSU5ESUdPCiAJdHJpc3RhdGUgIihFY2hvYXVkaW8pIEluZGlnbyIKIAlkZXBlbmRzIG9uIFNORAotCWRlcGVuZHMgb24gRldfTE9BREVSCisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfUENNCiAJaGVscAogCSAgU2F5ICdZJyBvciAnTScgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBFY2hvYXVkaW8gSW5kaWdvLgpAQCAtMzUxLDcgKzM1MSw3IEBACiBjb25maWcgU05EX0lORElHT0lPCiAJdHJpc3RhdGUgIihFY2hvYXVkaW8pIEluZGlnbyBJTyIKIAlkZXBlbmRzIG9uIFNORAotCWRlcGVuZHMgb24gRldfTE9BREVSCisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfUENNCiAJaGVscAogCSAgU2F5ICdZJyBvciAnTScgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBFY2hvYXVkaW8gSW5kaWdvIElPLgpAQCAtMzYyLDcgKzM2Miw3IEBACiBjb25maWcgU05EX0lORElHT0RKCiAJdHJpc3RhdGUgIihFY2hvYXVkaW8pIEluZGlnbyBESiIKIAlkZXBlbmRzIG9uIFNORAotCWRlcGVuZHMgb24gRldfTE9BREVSCisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfUENNCiAJaGVscAogCSAgU2F5ICdZJyBvciAnTScgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBFY2hvYXVkaW8gSW5kaWdvIERKLgpAQCAtMzczLDYgKzM3Myw3IEBACiBjb25maWcgU05EX0VNVTEwSzEKIAl0cmlzdGF0ZSAiRW11MTBrMSAoU0IgTGl2ZSEsIEF1ZGlneSwgRS1tdSBBUFMpIgogCWRlcGVuZHMgb24gU05ECisJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBTTkRfSFdERVAKIAlzZWxlY3QgU05EX1JBV01JREkKIAlzZWxlY3QgU05EX0FDOTdfQ09ERUMKQEAgLTU3NSw2ICs1NzYsNyBAQAogY29uZmlnIFNORF9LT1JHMTIxMgogCXRyaXN0YXRlICJLb3JnIDEyMTIgSU8iCiAJZGVwZW5kcyBvbiBTTkQKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgS29yZyAxMjEySU8gc291bmRjYXJkcy4KQEAgLTU4NSw2ICs1ODcsNyBAQAogY29uZmlnIFNORF9NQUVTVFJPMwogCXRyaXN0YXRlICJFU1MgQWxsZWdyby9NYWVzdHJvMyIKIAlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX0FDOTdfQ09ERUMKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc291bmRjYXJkcyBiYXNlZCBvbiBFU1MgTWFlc3RybyAzCkBAIC02MjksNyArNjMyLDcgQEAKIGNvbmZpZyBTTkRfUklQVElERQogCXRyaXN0YXRlICJDb25leGFudCBSaXB0aWRlIgogCWRlcGVuZHMgb24gU05ECi0JZGVwZW5kcyBvbiBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFNORF9PUEwzX0xJQgogCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKIAlzZWxlY3QgU05EX0FDOTdfQ09ERUMKQEAgLTczNCw2ICs3MzcsNyBAQAogY29uZmlnIFNORF9ZTUZQQ0kKIAl0cmlzdGF0ZSAiWWFtYWhhIFlNRjcyNC83NDAvNzQ0Lzc1NCIKIAlkZXBlbmRzIG9uIFNORAorCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAogCXNlbGVjdCBTTkRfQUM5N19DT0RFQwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCmluZGV4IGQyOTk0Y2IuLjc0ZWQ4MTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYworKysgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogeyAweDQxNDQ1MzcyLCAweGZmZmZmZmZmLCAiQUQxOTgxQSIsCQlwYXRjaF9hZDE5ODFhLAlOVUxMIH0sCiB7IDB4NDE0NDUzNzQsIDB4ZmZmZmZmZmYsICJBRDE5ODFCIiwJCXBhdGNoX2FkMTk4MWIsCU5VTEwgfSwKIHsgMHg0MTQ0NTM3NSwgMHhmZmZmZmZmZiwgIkFEMTk4NSIsCQlwYXRjaF9hZDE5ODUsCU5VTEwgfSwKLXsgMHg0MTQ0NTM3OCwgMHhmZmZmZmZmZiwgIkFEMTk4NiIsCQlwYXRjaF9hZDE5ODUsCU5VTEwgfSwKK3sgMHg0MTQ0NTM3OCwgMHhmZmZmZmZmZiwgIkFEMTk4NiIsCQlwYXRjaF9hZDE5ODYsCU5VTEwgfSwKIHsgMHg0MTRjNDMwMCwgMHhmZmZmZmYwMCwgIkFMQzEwMCwxMDBQIiwgCU5VTEwsCQlOVUxMIH0sCiB7IDB4NDE0YzQ3MTAsIDB4ZmZmZmZmZjAsICJBTEMyMDAsMjAwUCIsCU5VTEwsCQlOVUxMIH0sCiB7IDB4NDE0YzQ3MjEsIDB4ZmZmZmZmZmYsICJBTEM2NTBEIiwJCU5VTEwsCU5VTEwgfSwgLyogYWxyZWFkeSBwYXRjaGVkICovCkBAIC0xOTQsNiArMTk0LDEzIEBACiAKIAogc3RhdGljIHZvaWQgdXBkYXRlX3Bvd2VyX3JlZ3Moc3RydWN0IHNuZF9hYzk3ICphYzk3KTsKKyNpZmRlZiBDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRQorI2RlZmluZSBhYzk3X2lzX3Bvd2VyX3NhdmVfbW9kZShhYzk3KSBcCisJKChhYzk3LT5zY2FwcyAmIEFDOTdfU0NBUF9QT1dFUl9TQVZFKSAmJiBwb3dlcl9zYXZlKQorI2Vsc2UKKyNkZWZpbmUgYWM5N19pc19wb3dlcl9zYXZlX21vZGUoYWM5NykgMAorI2VuZGlmCisKIAogLyoKICAqICBJL08gcm91dGluZXMKQEAgLTk4Miw4ICs5ODksOCBAQAogewogCWlmIChhYzk3KSB7CiAjaWZkZWYgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUKLQkJaWYgKGFjOTctPnBvd2VyX3dvcmtxKQotCQkJZGVzdHJveV93b3JrcXVldWUoYWM5Ny0+cG93ZXJfd29ya3EpOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZhYzk3LT5wb3dlcl93b3JrKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKICNlbmRpZgogCQlzbmRfYWM5N19wcm9jX2RvbmUoYWM5Nyk7CiAJCWlmIChhYzk3LT5idXMpCkBAIC0xMTg0LDEzICsxMTkxLDEzIEBACiAvKgogICogc2V0IGRCIGluZm9ybWF0aW9uCiAgKi8KLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV80Yml0LCAtNDUwMCwgMzAwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV81Yml0LCAtNDY1MCwgMTUwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV82Yml0LCAtOTQ1MCwgMTUwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV81Yml0XzEyZGJfbWF4LCAtMzQ1MCwgMTUwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9yZWNfZ2FpbiwgMCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV80Yml0LCAtNDUwMCwgMzAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV81Yml0LCAtNDY1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV82Yml0LCAtOTQ1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV81Yml0XzEyZGJfbWF4LCAtMzQ1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9yZWNfZ2FpbiwgMCwgMTUwLCAwKTsKIAotc3RhdGljIHVuc2lnbmVkIGludCAqZmluZF9kYl9zY2FsZSh1bnNpZ25lZCBpbnQgbWF4dmFsKQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCAqZmluZF9kYl9zY2FsZSh1bnNpZ25lZCBpbnQgbWF4dmFsKQogewogCXN3aXRjaCAobWF4dmFsKSB7CiAJY2FzZSAweDBmOiByZXR1cm4gZGJfc2NhbGVfNGJpdDsKQEAgLTEyMDAsOCArMTIwNyw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF90bHZfZGJfc2NhbGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwgdW5zaWduZWQgaW50ICp0bHYpCi17CQorc3RhdGljIHZvaWQgc2V0X3Rsdl9kYl9zY2FsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLCBjb25zdCB1bnNpZ25lZCBpbnQgKnRsdikKK3sKIAlrY3RsLT50bHYucCA9IHRsdjsKIAlpZiAodGx2KQogCQlrY3RsLT52ZFswXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEOwpAQCAtMTk4OSw3ICsxOTk2LDYgQEAKIAltdXRleF9pbml0KCZhYzk3LT5yZWdfbXV0ZXgpOwogCW11dGV4X2luaXQoJmFjOTctPnBhZ2VfbXV0ZXgpOwogI2lmZGVmIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFCi0JYWM5Ny0+cG93ZXJfd29ya3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJhYzk3Iik7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmFjOTctPnBvd2VyX3dvcmssIGRvX3VwZGF0ZV9wb3dlcik7CiAjZW5kaWYKIApAQCAtMjI3NSwxNSArMjI4MSwxMyBAQAogCXVkZWxheSgxMDApOwogCXBvd2VyIHw9IEFDOTdfUERfUFIyIHwgQUM5N19QRF9QUjM7CS8qIEFuYWxvZyBNaXhlciBwb3dlcmRvd24gKi8KIAlzbmRfYWM5N193cml0ZShhYzk3LCBBQzk3X1BPV0VSRE9XTiwgcG93ZXIpOwotI2lmZGVmIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFCi0JaWYgKHBvd2VyX3NhdmUpIHsKKwlpZiAoYWM5N19pc19wb3dlcl9zYXZlX21vZGUoYWM5NykpIHsKIAkJdWRlbGF5KDEwMCk7CiAJCS8qIEFDLWxpbmsgcG93ZXJkb3duLCBpbnRlcm5hbCBDbGsgZGlzYWJsZSAqLwogCQkvKiBGSVhNRTogdGhpcyBtYXkgY2F1c2UgY2xpY2sgbm9pc2VzIG9uIHNvbWUgYm9hcmRzICovCiAJCXBvd2VyIHw9IEFDOTdfUERfUFI0IHwgQUM5N19QRF9QUjU7CiAJCXNuZF9hYzk3X3dyaXRlKGFjOTcsIEFDOTdfUE9XRVJET1dOLCBwb3dlcik7CiAJfQotI2VuZGlmCiB9CiAKIApAQCAtMjMzNywxNCArMjM0MSwxNiBAQAogCQl9CiAJfQogCi0JaWYgKHBvd2VyX3NhdmUgJiYgIXBvd2VydXAgJiYgYWM5Ny0+cG93ZXJfd29ya3EpCisJaWYgKGFjOTdfaXNfcG93ZXJfc2F2ZV9tb2RlKGFjOTcpICYmICFwb3dlcnVwKQogCQkvKiBhZGp1c3QgcG93ZXItZG93biBiaXRzIGFmdGVyIHR3byBzZWNvbmRzIGRlbGF5CiAJCSAqIChmb3IgYXZvaWRpbmcgbG91ZCBjbGljayBub2lzZXMgZm9yIG1hbnkgKE9TUykgYXBwcwogCQkgKiAgdGhhdCBvcGVuL2Nsb3NlIGZyZXF1ZW50bHkpCiAJCSAqLwotCQlxdWV1ZV9kZWxheWVkX3dvcmsoYWM5Ny0+cG93ZXJfd29ya3EsICZhYzk3LT5wb3dlcl93b3JrLCBIWioyKTsKLQllbHNlCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWM5Ny0+cG93ZXJfd29yaywgSFoqMik7CisJZWxzZSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFjOTctPnBvd2VyX3dvcmspOwogCQl1cGRhdGVfcG93ZXJfcmVncyhhYzk3KTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzNTcsMTkgKzIzNjMsMTUgQEAKIAl1bnNpZ25lZCBpbnQgcG93ZXJfdXAsIGJpdHM7CiAJaW50IGk7CiAKKwlwb3dlcl91cCA9ICgxIDw8IFBXSURYX0ZST05UKSB8ICgxIDw8IFBXSURYX0FEQyk7CisJcG93ZXJfdXAgfD0gKDEgPDwgUFdJRFhfTUlDKTsKKwlpZiAoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBfU1VSUk9VTkRfREFDKQorCQlwb3dlcl91cCB8PSAoMSA8PCBQV0lEWF9TVVJSKTsKKwlpZiAoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBfQ0VOVEVSX0xGRV9EQUMpCisJCXBvd2VyX3VwIHw9ICgxIDw8IFBXSURYX0NMRkUpOwogI2lmZGVmIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFCi0JaWYgKHBvd2VyX3NhdmUpCisJaWYgKGFjOTdfaXNfcG93ZXJfc2F2ZV9tb2RlKGFjOTcpKQogCQlwb3dlcl91cCA9IGFjOTctPnBvd2VyX3VwOwotCWVsc2UgewotI2VuZGlmCi0JCXBvd2VyX3VwID0gKDEgPDwgUFdJRFhfRlJPTlQpIHwgKDEgPDwgUFdJRFhfQURDKTsKLQkJcG93ZXJfdXAgfD0gKDEgPDwgUFdJRFhfTUlDKTsKLQkJaWYgKGFjOTctPnNjYXBzICYgQUM5N19TQ0FQX1NVUlJPVU5EX0RBQykKLQkJCXBvd2VyX3VwIHw9ICgxIDw8IFBXSURYX1NVUlIpOwotCQlpZiAoYWM5Ny0+c2NhcHMgJiBBQzk3X1NDQVBfQ0VOVEVSX0xGRV9EQUMpCi0JCQlwb3dlcl91cCB8PSAoMSA8PCBQV0lEWF9DTEZFKTsKLSNpZmRlZiBDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRQotCX0KICNlbmRpZgogCWlmIChwb3dlcl91cCkgewogCQlpZiAoYWM5Ny0+cmVnc1tBQzk3X1BPV0VSRE9XTl0gJiBBQzk3X1BEX1BSMikgewpAQCAtMjQxNCw2ICsyNDE2LDEwIEBACiAJCXJldHVybjsKIAlpZiAoYWM5Ny0+YnVpbGRfb3BzLT5zdXNwZW5kKQogCQlhYzk3LT5idWlsZF9vcHMtPnN1c3BlbmQoYWM5Nyk7CisjaWZkZWYgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUKKwljYW5jZWxfZGVsYXllZF93b3JrKCZhYzk3LT5wb3dlcl93b3JrKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworI2VuZGlmCiAJc25kX2FjOTdfcG93ZXJkb3duKGFjOTcpOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKaW5kZXggZTgxMzk2OC4uNjQxZDBjOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYwpAQCAtNTQsNyArNTQsNyBAQAogCiAvKiByZXBsYWNlIHdpdGggYSBuZXcgVExWICovCiBzdGF0aWMgdm9pZCByZXNldF90bHYoc3RydWN0IHNuZF9hYzk3ICphYzk3LCBjb25zdCBjaGFyICpuYW1lLAotCQkgICAgICB1bnNpZ25lZCBpbnQgKnRsdikKKwkJICAgICAgY29uc3QgdW5zaWduZWQgaW50ICp0bHYpCiB7CiAJc3RydWN0IHNuZF9jdGxfZWxlbV9pZCBzaWQ7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKQEAgLTE5MCwxNCArMTkwLDI4IEBACiAJcmV0dXJuIGFjOTctPmNoYW5uZWxfbW9kZSA+PSAyOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpc19zaGFyZWRfbGluZWluKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKKy8qIHN5c3RlbSBoYXMgc2hhcmVkIGphY2tzIHdpdGggc3Vycm91bmQgb3V0IGVuYWJsZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NoYXJlZF9zdXJyb3V0KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKLQlyZXR1cm4gISBhYzk3LT5pbmRlcF9zdXJyb3VuZCAmJiBpc19zdXJyb3VuZF9vbihhYzk3KTsKKwlyZXR1cm4gIWFjOTctPmluZGVwX3N1cnJvdW5kICYmIGlzX3N1cnJvdW5kX29uKGFjOTcpOwogfQogCisvKiBzeXN0ZW0gaGFzIHNoYXJlZCBqYWNrcyB3aXRoIGNlbnRlci9sZmUgb3V0IGVuYWJsZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NoYXJlZF9jbGZlb3V0KHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3sKKwlyZXR1cm4gIWFjOTctPmluZGVwX3N1cnJvdW5kICYmIGlzX2NsZmVfb24oYWM5Nyk7Cit9CisKKy8qIHN5c3RlbSBoYXMgc2hhcmVkIGphY2tzIHdpdGggbGluZSBpbiBlbmFibGVkICovCitzdGF0aWMgaW5saW5lIGludCBpc19zaGFyZWRfbGluZWluKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3sKKwlyZXR1cm4gIWFjOTctPmluZGVwX3N1cnJvdW5kICYmICFpc19zdXJyb3VuZF9vbihhYzk3KTsKK30KKworLyogc3lzdGVtIGhhcyBzaGFyZWQgamFja3Mgd2l0aCBtaWMgaW4gZW5hYmxlZCAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfc2hhcmVkX21pY2luKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKLQlyZXR1cm4gISBhYzk3LT5pbmRlcF9zdXJyb3VuZCAmJiBpc19jbGZlX29uKGFjOTcpOworCXJldHVybiAhYWM5Ny0+aW5kZXBfc3Vycm91bmQgJiYgIWlzX2NsZmVfb24oYWM5Nyk7CiB9CiAKIApAQCAtOTQxLDYgKzk1NSw5IEBACiB7CiAJaW50IGVycjsKIAorCS8qIHRoZSByZWdpc3RlciBiaXQgaXMgd3JpdGFibGUsIGJ1dCB0aGUgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkOiAqLworCXNuZF9hYzk3X3JlbW92ZV9jdGwoYWM5NywgIlBDTSBPdXQgUGF0aCAmIE11dGUiLCBOVUxMKTsKKwogCXNuZF9hYzk3X3JlbmFtZV92b2xfY3RsKGFjOTcsICJIZWFkcGhvbmUgUGxheWJhY2siLCAiU2lnbWF0ZWwgU3Vycm91bmQgUGxheWJhY2siKTsKIAlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsICZzbmRfYWM5N19zdGFjOTcwOF9iaWFzX2NvbnRyb2wsIDEpKSA8IDApCiAJCXJldHVybiBlcnI7CkBAIC0xNTUyLDcgKzE1NjksNyBAQAogCUFDOTdfU0lOR0xFKCJMaW5lIEphY2sgU2Vuc2UiLCBBQzk3X0FEX0pBQ0tfU1BESUYsIDgsIDEsIDEpLCAvKiBpbnZlcnRlZCAqLwogfTsKIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzZiaXRfNmRiX21heCwgLTg4NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNmJpdF82ZGJfbWF4LCAtODg1MCwgMTUwLCAwKTsKIAogc3RhdGljIGludCBwYXRjaF9hZDE4ODVfc3BlY2lmaWMoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKQEAgLTE2MDksMTkgKzE2MjYsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogTUlTQyBiaXRzICovCisvKiBNSVNDIGJpdHMgKEFEMTg4OC9BRDE5ODAvQUQxOTg1IHJlZ2lzdGVyIDB4NzYpICovCiAjZGVmaW5lIEFDOTdfQUQxOThYX01CQwkJMHgwMDAzCS8qIG1pYyBib29zdCAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF9NQkNfMjAJMHgwMDAwCS8qICsyMGRCICovCiAjZGVmaW5lIEFDOTdfQUQxOThYX01CQ18xMAkweDAwMDEJLyogKzEwZEIgKi8KICNkZWZpbmUgQUM5N19BRDE5OFhfTUJDXzMwCTB4MDAwMgkvKiArMzBkQiAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF9WUkVGRAkweDAwMDQJLyogVlJFRiBoaWdoLVogKi8KLSNkZWZpbmUgQUM5N19BRDE5OFhfVlJFRkgJMHgwMDA4CS8qIDIuMjVWLCAzLjdWICovCi0jZGVmaW5lIEFDOTdfQUQxOThYX1ZSRUZfMAkweDAwMGMJLyogMFYgKi8KKyNkZWZpbmUgQUM5N19BRDE5OFhfVlJFRkgJMHgwMDA4CS8qIDA9Mi4yNVYsIDE9My43ViAqLworI2RlZmluZSBBQzk3X0FEMTk4WF9WUkVGXzAJMHgwMDBjCS8qIDBWIChBRDE5ODUgb25seSkgKi8KKyNkZWZpbmUgQUM5N19BRDE5OFhfVlJFRl9NQVNLCShBQzk3X0FEMTk4WF9WUkVGSCB8IEFDOTdfQUQxOThYX1ZSRUZEKQorI2RlZmluZSBBQzk3X0FEMTk4WF9WUkVGX1NISUZUCTIKICNkZWZpbmUgQUM5N19BRDE5OFhfU1JVCQkweDAwMTAJLyogc2FtcGxlIHJhdGUgdW5sb2NrICovCiAjZGVmaW5lIEFDOTdfQUQxOThYX0xPU0VMCTB4MDAyMAkvKiBMSU5FX09VVCBhbXBsaWZpZXJzIGlucHV0IHNlbGVjdCAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF8yTUlDCTB4MDA0MAkvKiAyLWNoYW5uZWwgbWljIHNlbGVjdCAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF9TUFJECTB4MDA4MAkvKiBTUFJFQUQgZW5hYmxlICovCi0jZGVmaW5lIEFDOTdfQUQxOThYX0RNSVgwCTB4MDEwMAkvKiBkb3dubWl4IG1vZGU6IDAgPSA2LXRvLTQsIDEgPSA2LXRvLTIgZG93bm1peCAqLworI2RlZmluZSBBQzk3X0FEMTk4WF9ETUlYMAkweDAxMDAJLyogZG93bm1peCBtb2RlOiAqLworCQkJCQkvKiAgMCA9IDYtdG8tNCwgMSA9IDYtdG8tMiBkb3dubWl4ICovCiAjZGVmaW5lIEFDOTdfQUQxOThYX0RNSVgxCTB4MDIwMAkvKiBkb3dubWl4IG1vZGU6IDEgPSBlbmFibGVkICovCiAjZGVmaW5lIEFDOTdfQUQxOThYX0hQU0VMCTB4MDQwMAkvKiBoZWFkcGhvbmUgYW1wbGlmaWVyIGlucHV0IHNlbGVjdCAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF9DTERJUwkweDA4MDAJLyogY2VudGVyL2xmZSBkaXNhYmxlICovCkBAIC0xNjMwLDYgKzE2NTAsODMgQEAKICNkZWZpbmUgQUM5N19BRDE5OFhfQUM5N05DCTB4NDAwMAkvKiBBQzk3IG5vIGNvbXBhdGlibGUgbW9kZSAqLwogI2RlZmluZSBBQzk3X0FEMTk4WF9EQUNaCTB4ODAwMAkvKiBEQUMgemVyby1maWxsIG1vZGUgKi8KIAorLyogTUlTQyAxIGJpdHMgKEFEMTk4NiByZWdpc3RlciAweDc2KSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9NQkMJCTB4MDAwMwkvKiBtaWMgYm9vc3QgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTUJDXzIwCTB4MDAwMAkvKiArMjBkQiAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9NQkNfMTAJMHgwMDAxCS8qICsxMGRCICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X01CQ18zMAkweDAwMDIJLyogKzMwZEIgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTElTRUwwCTB4MDAwNAkvKiBMSU5FX0lOIHNlbGVjdCBiaXQgMCAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9MSVNFTDEJMHgwMDA4CS8qIExJTkVfSU4gc2VsZWN0IGJpdCAxICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0xJU0VMX01BU0sJKEFDOTdfQUQxOTg2X0xJU0VMMSB8IEFDOTdfQUQxOTg2X0xJU0VMMCkKKyNkZWZpbmUgQUM5N19BRDE5ODZfTElTRUxfTEkJMHgwMDAwICAvKiBMSU5FX0lOIHBpbnMgYXMgTElORV9JTiBzb3VyY2UgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTElTRUxfU1VSUgkweDAwMDQgIC8qIFNVUlJPVU5EIHBpbnMgYXMgTElORV9JTiBzb3VyY2UgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTElTRUxfTUlDCTB4MDAwOCAgLyogTUlDXzEvMiBwaW5zIGFzIExJTkVfSU4gc291cmNlICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X1NSVQkJMHgwMDEwCS8qIHNhbXBsZSByYXRlIHVubG9jayAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9TT1NFTAkweDAwMjAJLyogU1VSUk9VTkRfT1VUIGFtcGxpZmllcnMgaW5wdXQgc2VsICovCisjZGVmaW5lIEFDOTdfQUQxOTg2XzJNSUMJMHgwMDQwCS8qIDItY2hhbm5lbCBtaWMgc2VsZWN0ICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X1NQUkQJMHgwMDgwCS8qIFNQUkVBRCBlbmFibGUgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfRE1JWDAJMHgwMTAwCS8qIGRvd25taXggbW9kZTogKi8KKwkJCQkJLyogIDAgPSA2LXRvLTQsIDEgPSA2LXRvLTIgZG93bm1peCAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9ETUlYMQkweDAyMDAJLyogZG93bm1peCBtb2RlOiAxID0gZW5hYmxlZCAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9DTERJUwkweDA4MDAJLyogY2VudGVyL2xmZSBkaXNhYmxlICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X1NPRElTCTB4MTAwMAkvKiBTVVJST1VORF9PVVQgZGlzYWJsZSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9NU1BMVAkweDIwMDAJLyogbXV0ZSBzcGxpdCAocmVhZCBvbmx5IDEpICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0FDOTdOQwkweDQwMDAJLyogQUM5NyBubyBjb21wYXRpYmxlIG1vZGUgKHIvbyAxKSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9EQUNaCTB4ODAwMAkvKiBEQUMgemVyby1maWxsIG1vZGUgKi8KKworLyogTUlTQyAyIGJpdHMgKEFEMTk4NiByZWdpc3RlciAweDcwKSAqLworI2RlZmluZSBBQzk3X0FEX01JU0MyCQkweDcwCS8qIE1pc2MgQ29udHJvbCBCaXRzIDIgKEFEMTk4NikgKi8KKworI2RlZmluZSBBQzk3X0FEMTk4Nl9DVlJFRjAJMHgwMDA0CS8qIEMvTEZFIFZSRUZfT1VUIDIuMjVWICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0NWUkVGMQkweDAwMDgJLyogQy9MRkUgVlJFRl9PVVQgMFYgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfQ1ZSRUYyCTB4MDAxMAkvKiBDL0xGRSBWUkVGX09VVCAzLjdWICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0NWUkVGX01BU0sgXAorCShBQzk3X0FEMTk4Nl9DVlJFRjIgfCBBQzk3X0FEMTk4Nl9DVlJFRjEgfCBBQzk3X0FEMTk4Nl9DVlJFRjApCisjZGVmaW5lIEFDOTdfQUQxOTg2X0pTTUFQCTB4MDAyMAkvKiBKYWNrIFNlbnNlIE1hcHBpbmcgMSA9IGFsdGVybmF0ZSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9NTURJUwkweDAwODAJLyogTW9ubyBNdXRlIERpc2FibGUgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTVZSRUYwCTB4MDQwMAkvKiBNSUMgVlJFRl9PVVQgMi4yNVYgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTVZSRUYxCTB4MDgwMAkvKiBNSUMgVlJFRl9PVVQgMFYgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTVZSRUYyCTB4MTAwMAkvKiBNSUMgVlJFRl9PVVQgMy43ViAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9NVlJFRl9NQVNLIFwKKwkoQUM5N19BRDE5ODZfTVZSRUYyIHwgQUM5N19BRDE5ODZfTVZSRUYxIHwgQUM5N19BRDE5ODZfTVZSRUYwKQorCisvKiBNSVNDIDMgYml0cyAoQUQxOTg2IHJlZ2lzdGVyIDB4N2EpICovCisjZGVmaW5lIEFDOTdfQURfTUlTQzMJCTB4N2EJLyogTWlzYyBDb250cm9sIEJpdHMgMyAoQUQxOTg2KSAqLworCisjZGVmaW5lIEFDOTdfQUQxOTg2X01NSVgJMHgwMDA0CS8qIE1pYyBNaXgsIGxlZnQvcmlnaHQgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfR1BPCQkweDAwMDgJLyogR2VuZXJhbCBQdXJwb3NlIE91dCAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9MT0hQRU4JMHgwMDEwCS8qIExJTkVfT1VUIGhlYWRwaG9uZSBkcml2ZSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9MVlJFRjAJMHgwMTAwCS8qIExJTkVfT1VUIFZSRUZfT1VUIDIuMjVWICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0xWUkVGMQkweDAyMDAJLyogTElORV9PVVQgVlJFRl9PVVQgMFYgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfTFZSRUYyCTB4MDQwMAkvKiBMSU5FX09VVCBWUkVGX09VVCAzLjdWICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0xWUkVGX01BU0sgXAorCShBQzk3X0FEMTk4Nl9MVlJFRjIgfCBBQzk3X0FEMTk4Nl9MVlJFRjEgfCBBQzk3X0FEMTk4Nl9MVlJFRjApCisjZGVmaW5lIEFDOTdfQUQxOTg2X0pTSU5WQQkweDA4MDAJLyogSmFjayBTZW5zZSBJbnZlcnQgU0VOU0VfQSAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9MT1NFTAkweDEwMDAJLyogTElORV9PVVQgYW1wbGlmaWVycyBpbnB1dCBzZWxlY3QgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfSFBTRUwwCTB4MjAwMAkvKiBIZWFkcGhvbmUgYW1wbGlmaWVycyAqLworCQkJCQkvKiAgIGlucHV0IHNlbGVjdCBTdXJyb3VuZCBEQUNzICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X0hQU0VMMQkweDQwMDAJLyogSGVhZHBob25lIGFtcGxpZmllcnMgaW5wdXQgKi8KKwkJCQkJLyogICBzZWxlY3QgQy9MRkUgREFDcyAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9KU0lOVkIJMHg4MDAwCS8qIEphY2sgU2Vuc2UgSW52ZXJ0IFNFTlNFX0IgKi8KKworLyogU2VyaWFsIENvbmZpZyBiaXRzIChBRDE5ODYgcmVnaXN0ZXIgMHg3NCkgKGluY29tcGxldGUpICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X09NUzAJMHgwMTAwCS8qIE9wdGlvbmFsIE1pYyBTZWxlY3RvciBiaXQgMCAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9PTVMxCTB4MDIwMAkvKiBPcHRpb25hbCBNaWMgU2VsZWN0b3IgYml0IDEgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfT01TMgkweDA0MDAJLyogT3B0aW9uYWwgTWljIFNlbGVjdG9yIGJpdCAyICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X09NU19NQVNLIFwKKwkoQUM5N19BRDE5ODZfT01TMiB8IEFDOTdfQUQxOTg2X09NUzEgfCBBQzk3X0FEMTk4Nl9PTVMwKQorI2RlZmluZSBBQzk3X0FEMTk4Nl9PTVNfTQkweDAwMDAgIC8qIE1JQ18xLzIgcGlucyBhcmUgTUlDIHNvdXJjZXMgKi8KKyNkZWZpbmUgQUM5N19BRDE5ODZfT01TX0wJMHgwMTAwICAvKiBMSU5FX0lOIHBpbnMgYXJlIE1JQyBzb3VyY2VzICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X09NU19DCTB4MDIwMCAgLyogQ2VudGVyL0xGRSBwaW5zIGFyZSBNQ0kgc291cmNlcyAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9PTVNfTUMJMHgwNDAwICAvKiBNaXggb2YgTUlDIGFuZCBDL0xGRSBwaW5zICovCisJCQkJCS8qICAgYXJlIE1JQyBzb3VyY2VzICovCisjZGVmaW5lIEFDOTdfQUQxOTg2X09NU19NTAkweDA1MDAgIC8qIE1JWCBvZiBNSUMgYW5kIExJTkVfSU4gcGlucyAqLworCQkJCQkvKiAgIGFyZSBNSUMgc291cmNlcyAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9PTVNfTEMJMHgwNjAwICAvKiBNSVggb2YgTElORV9JTiBhbmQgQy9MRkUgcGlucyAqLworCQkJCQkvKiAgIGFyZSBNSUMgc291cmNlcyAqLworI2RlZmluZSBBQzk3X0FEMTk4Nl9PTVNfTUxDCTB4MDcwMCAgLyogTUlYIG9mIE1JQywgTElORV9JTiwgQy9MRkUgcGlucyAqLworCQkJCQkvKiAgIGFyZSBNSUMgc291cmNlcyAqLworCiAKIHN0YXRpYyBpbnQgc25kX2FjOTdfYWQxOTh4X3NwZGlmX3NvdXJjZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewpAQCAtMTk1Miw4ICsyMDQ5LDgwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOTg1X3ZyZWZvdXRfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbNF0gPSB7IkhpZ2gtWiIsICIzLjcgViIsICIyLjI1IFYiLCAiMCBWIn07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gNDsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAzOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCSAgICAgICB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOTg1X3ZyZWZvdXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IHJlZzJjdHJsWzRdID0gezIsIDAsIDEsIDN9OworCXN0cnVjdCBzbmRfYWM5NyAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJdmFsID0gKGFjOTctPnJlZ3NbQUM5N19BRF9NSVNDXSAmIEFDOTdfQUQxOThYX1ZSRUZfTUFTSykKKwkgICAgICA+PiBBQzk3X0FEMTk4WF9WUkVGX1NISUZUOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSByZWcyY3RybFt2YWxdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTk4NV92cmVmb3V0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0YXRpYyBjb25zdCBpbnQgY3RybDJyZWdbNF0gPSB7MSwgMiwgMCwgM307CisJc3RydWN0IHNuZF9hYzk3ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gMworCSAgICB8fCB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdmFsID0gY3RybDJyZWdbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXV0KKwkgICAgICA8PCBBQzk3X0FEMTk4WF9WUkVGX1NISUZUOworCXJldHVybiBzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX01JU0MsCisJCQkJICAgIEFDOTdfQUQxOThYX1ZSRUZfTUFTSywgdmFsKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hYzk3X2FkMTk4NV9jb250cm9sc1tdID0gewotCUFDOTdfU0lOR0xFKCJFeGNoYW5nZSBDZW50ZXIvTEZFIiwgQUM5N19BRF9TRVJJQUxfQ0ZHLCAzLCAxLCAwKQorCUFDOTdfU0lOR0xFKCJFeGNoYW5nZSBDZW50ZXIvTEZFIiwgQUM5N19BRF9TRVJJQUxfQ0ZHLCAzLCAxLCAwKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJFeGNoYW5nZSBGcm9udC9TdXJyb3VuZCIsCisJCS5pbmZvID0gc25kX2FjOTdfYWQxODg4X2xvaHBzZWxfaW5mbywKKwkJLmdldCA9IHNuZF9hYzk3X2FkMTg4OF9sb2hwc2VsX2dldCwKKwkJLnB1dCA9IHNuZF9hYzk3X2FkMTg4OF9sb2hwc2VsX3B1dAorCX0sCisJQUM5N19TSU5HTEUoIkhpZ2ggUGFzcyBGaWx0ZXIgRW5hYmxlIiwgQUM5N19BRF9URVNUMiwgMTIsIDEsIDEpLAorCUFDOTdfU0lOR0xFKCJTcHJlYWQgRnJvbnQgdG8gU3Vycm91bmQgYW5kIENlbnRlci9MRkUiLAorCQkgICAgQUM5N19BRF9NSVNDLCA3LCAxLCAwKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJEb3dubWl4IiwKKwkJLmluZm8gPSBzbmRfYWM5N19hZDE4ODhfZG93bm1peF9pbmZvLAorCQkuZ2V0ID0gc25kX2FjOTdfYWQxODg4X2Rvd25taXhfZ2V0LAorCQkucHV0ID0gc25kX2FjOTdfYWQxODg4X2Rvd25taXhfcHV0CisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJWX1JFRk9VVCIsCisJCS5pbmZvID0gc25kX2FjOTdfYWQxOTg1X3ZyZWZvdXRfaW5mbywKKwkJLmdldCA9IHNuZF9hYzk3X2FkMTk4NV92cmVmb3V0X2dldCwKKwkJLnB1dCA9IHNuZF9hYzk3X2FkMTk4NV92cmVmb3V0X3B1dAorCX0sCisJQUM5N19TVVJST1VORF9KQUNLX01PREVfQ1RMLAorCUFDOTdfQ0hBTk5FTF9NT0RFX0NUTCwKKworCUFDOTdfU0lOR0xFKCJIZWFkcGhvbmUgSmFjayBTZW5zZSIsIEFDOTdfQURfSkFDS19TUERJRiwgMTAsIDEsIDApLAorCUFDOTdfU0lOR0xFKCJMaW5lIEphY2sgU2Vuc2UiLCBBQzk3X0FEX0pBQ0tfU1BESUYsIDEyLCAxLCAwKSwKIH07CiAKIHN0YXRpYyB2b2lkIGFkMTk4NV91cGRhdGVfamFja3Moc3RydWN0IHNuZF9hYzk3ICphYzk3KQpAQCAtMTk2Nyw5ICsyMTM2LDE2IEBACiB7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gcGF0Y2hfYWQxOTgwX3NwZWNpZmljKGFjOTcpKSA8IDApCisJLyogcmVuYW1lIDB4MDQgYXMgIk1hc3RlciIgYW5kIDB4MDIgYXMgIk1hc3RlciBTdXJyb3VuZCIgKi8KKwlzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChhYzk3LCAiTWFzdGVyIFBsYXliYWNrIiwKKwkJCQkiTWFzdGVyIFN1cnJvdW5kIFBsYXliYWNrIik7CisJc25kX2FjOTdfcmVuYW1lX3ZvbF9jdGwoYWM5NywgIkhlYWRwaG9uZSBQbGF5YmFjayIsICJNYXN0ZXIgUGxheWJhY2siKTsKKworCWlmICgoZXJyID0gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5NywgJnNuZF9hYzk3X2FkMTk4eF8yY21pYywgMSkpIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlyZXR1cm4gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5Nywgc25kX2FjOTdfYWQxOTg1X2NvbnRyb2xzLCBBUlJBWV9TSVpFKHNuZF9hYzk3X2FkMTk4NV9jb250cm9scykpOworCisJcmV0dXJuIHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsIHNuZF9hYzk3X2FkMTk4NV9jb250cm9scywKKwkJCQkgICAgQVJSQVlfU0laRShzbmRfYWM5N19hZDE5ODVfY29udHJvbHMpKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfYWQxOTg1X2J1aWxkX29wcyA9IHsKQEAgLTE5ODksMjQgKzIxNjUsMzExIEBACiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2FkMTk4NV9idWlsZF9vcHM7CiAJbWlzYyA9IHNuZF9hYzk3X3JlYWQoYWM5NywgQUM5N19BRF9NSVNDKTsKIAkvKiBzd2l0Y2ggZnJvbnQvc3Vycm91bmQgbGluZS1vdXQvaHAtb3V0ICovCi0JLyogY2VudGVyL0xGRSwgbWljIGluIDMuNzVWIG1vZGUgKi8KIAkvKiBBRC1jb21wYXRpYmxlIG1vZGUgKi8KIAkvKiBTdGVyZW8gbXV0ZXMgZW5hYmxlZCAqLwotCS8qIGluIGFjY29yZGFuY2Ugd2l0aCBBREkgZHJpdmVyOiBtaXNjIHwgMHg1YzI4ICovCiAJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgQUM5N19BRF9NSVNDLCBtaXNjIHwKLQkJCSAgICAgQUM5N19BRDE5OFhfVlJFRkggfAogCQkJICAgICBBQzk3X0FEMTk4WF9MT1NFTCB8CiAJCQkgICAgIEFDOTdfQUQxOThYX0hQU0VMIHwKLQkJCSAgICAgQUM5N19BRDE5OFhfQ0xESVMgfAotCQkJICAgICBBQzk3X0FEMTk4WF9MT0RJUyB8CiAJCQkgICAgIEFDOTdfQUQxOThYX01TUExUIHwKIAkJCSAgICAgQUM5N19BRDE5OFhfQUM5N05DKTsKIAlhYzk3LT5mbGFncyB8PSBBQzk3X1NURVJFT19NVVRFUzsKKworCS8qIHVwZGF0ZSBjdXJyZW50IGphY2sgY29uZmlndXJhdGlvbiAqLworCWFkMTk4NV91cGRhdGVfamFja3MoYWM5Nyk7CisKIAkvKiBvbiBBRDE5ODUgcmV2LiAzLCBBQyc5NyByZXZpc2lvbiBiaXRzIGFyZSB6ZXJvICovCiAJYWM5Ny0+ZXh0X2lkID0gKGFjOTctPmV4dF9pZCAmIH5BQzk3X0VJX1JFVl9NQVNLKSB8IEFDOTdfRUlfUkVWXzIzOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTk4Nl9ib29sX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTk4Nl9sb3Nvc2VsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9hYzk3ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCXZhbCA9IGFjOTctPnJlZ3NbQUM5N19BRF9NSVNDM107CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAodmFsICYgQUM5N19BRDE5ODZfTE9TRUwpICE9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOTg2X2xvc29zZWxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHJldDA7CisJaW50IHJldDE7CisJaW50IHNwcmQgPSAoYWM5Ny0+cmVnc1tBQzk3X0FEX01JU0NdICYgQUM5N19BRDE5ODZfU1BSRCkgIT0gMDsKKworCXJldDAgPSBzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX01JU0MzLCBBQzk3X0FEMTk4Nl9MT1NFTCwKKwkJCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gIT0gMAorCQkJCSAgICA/IEFDOTdfQUQxOTg2X0xPU0VMIDogMCk7CisJaWYgKHJldDAgPCAwKQorCQlyZXR1cm4gcmV0MDsKKworCS8qIFNPU0VMIGlzIHNldCB0byB2YWx1ZXMgb2YgIlNwcmVhZCIgb3IgIkV4Y2hhbmdlIEYvUyIgY29udHJvbHMgKi8KKwlyZXQxID0gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDLCBBQzk3X0FEMTk4Nl9TT1NFTCwKKwkJCQkgICAgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICE9IDAKKwkJCQkgICAgIHx8IHNwcmQpCisJCQkJICAgID8gQUM5N19BRDE5ODZfU09TRUwgOiAwKTsKKwlpZiAocmV0MSA8IDApCisJCXJldHVybiByZXQxOworCisJcmV0dXJuIChyZXQwID4gMCB8fCByZXQxID4gMCkgPyAxIDogMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19hZDE5ODZfc3ByZWFkX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCisJdmFsID0gYWM5Ny0+cmVnc1tBQzk3X0FEX01JU0NdOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHZhbCAmIEFDOTdfQUQxOTg2X1NQUkQpICE9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfYWQxOTg2X3NwcmVhZF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9hYzk3ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZXQwOworCWludCByZXQxOworCWludCBzcHJkID0gKGFjOTctPnJlZ3NbQUM5N19BRF9NSVNDM10gJiBBQzk3X0FEMTk4Nl9MT1NFTCkgIT0gMDsKKworCXJldDAgPSBzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX01JU0MsIEFDOTdfQUQxOTg2X1NQUkQsCisJCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICE9IDAKKwkJCQkgICAgPyBBQzk3X0FEMTk4Nl9TUFJEIDogMCk7CisJaWYgKHJldDAgPCAwKQorCQlyZXR1cm4gcmV0MDsKKworCS8qIFNPU0VMIGlzIHNldCB0byB2YWx1ZXMgb2YgIlNwcmVhZCIgb3IgIkV4Y2hhbmdlIEYvUyIgY29udHJvbHMgKi8KKwlyZXQxID0gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDLCBBQzk3X0FEMTk4Nl9TT1NFTCwKKwkJCQkgICAgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICE9IDAKKwkJCQkgICAgIHx8IHNwcmQpCisJCQkJICAgID8gQUM5N19BRDE5ODZfU09TRUwgOiAwKTsKKwlpZiAocmV0MSA8IDApCisJCXJldHVybiByZXQxOworCisJcmV0dXJuIChyZXQwID4gMCB8fCByZXQxID4gMCkgPyAxIDogMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19hZDE5ODZfbWljbGlzZWxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGFjOTctPnNwZWMuYWQxOHh4LnN3YXBfbWljX2xpbmVpbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19hZDE5ODZfbWljbGlzZWxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciBzd2FwID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gIT0gMDsKKworCWlmIChzd2FwICE9IGFjOTctPnNwZWMuYWQxOHh4LnN3YXBfbWljX2xpbmVpbikgeworCQlhYzk3LT5zcGVjLmFkMTh4eC5zd2FwX21pY19saW5laW4gPSBzd2FwOworCQlpZiAoYWM5Ny0+YnVpbGRfb3BzLT51cGRhdGVfamFja3MpCisJCQlhYzk3LT5idWlsZF9vcHMtPnVwZGF0ZV9qYWNrcyhhYzk3KTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hYzk3X2FkMTk4Nl92cmVmb3V0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJLyogVXNlIE1JQ18xLzIgVl9SRUZPVVQgYXMgdGhlICJnZXQiIHZhbHVlICovCisJc3RydWN0IHNuZF9hYzk3ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKwl1bnNpZ25lZCBzaG9ydCByZWcgPSBhYzk3LT5yZWdzW0FDOTdfQURfTUlTQzJdOworCWlmICgocmVnICYgQUM5N19BRDE5ODZfTVZSRUYwKSAhPSAwKQorCQl2YWwgPSAyOworCWVsc2UgaWYgKChyZWcgJiBBQzk3X0FEMTk4Nl9NVlJFRjEpICE9IDApCisJCXZhbCA9IDM7CisJZWxzZSBpZiAoKHJlZyAmIEFDOTdfQUQxOTg2X01WUkVGMikgIT0gMCkKKwkJdmFsID0gMTsKKwllbHNlCisJCXZhbCA9IDA7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYWM5N19hZDE5ODZfdnJlZm91dF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfYWM5NyAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBzaG9ydCBjdmFsOworCXVuc2lnbmVkIHNob3J0IGx2YWw7CisJdW5zaWduZWQgc2hvcnQgbXZhbDsKKwlpbnQgY3JldDsKKwlpbnQgbHJldDsKKwlpbnQgbXJldDsKKworCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkKKwl7CisJY2FzZSAwOiAvKiBIaWdoLVogKi8KKwkJY3ZhbCA9IDA7CisJCWx2YWwgPSAwOworCQltdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxOiAvKiAzLjcgViAqLworCQljdmFsID0gQUM5N19BRDE5ODZfQ1ZSRUYyOworCQlsdmFsID0gQUM5N19BRDE5ODZfTFZSRUYyOworCQltdmFsID0gQUM5N19BRDE5ODZfTVZSRUYyOworCQlicmVhazsKKwljYXNlIDI6IC8qIDIuMjUgViAqLworCQljdmFsID0gQUM5N19BRDE5ODZfQ1ZSRUYwOworCQlsdmFsID0gQUM5N19BRDE5ODZfTFZSRUYwOworCQltdmFsID0gQUM5N19BRDE5ODZfTVZSRUYwOworCQlicmVhazsKKwljYXNlIDM6IC8qIDAgViAqLworCQljdmFsID0gQUM5N19BRDE5ODZfQ1ZSRUYxOworCQlsdmFsID0gQUM5N19BRDE5ODZfTFZSRUYxOworCQltdmFsID0gQUM5N19BRDE5ODZfTVZSRUYxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljcmV0ID0gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDMiwKKwkJCQkgICAgQUM5N19BRDE5ODZfQ1ZSRUZfTUFTSywgY3ZhbCk7CisJaWYgKGNyZXQgPCAwKQorCQlyZXR1cm4gY3JldDsKKwlscmV0ID0gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDMywKKwkJCQkgICAgQUM5N19BRDE5ODZfTFZSRUZfTUFTSywgbHZhbCk7CisJaWYgKGxyZXQgPCAwKQorCQlyZXR1cm4gbHJldDsKKwltcmV0ID0gc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDMiwKKwkJCQkgICAgQUM5N19BRDE5ODZfTVZSRUZfTUFTSywgbXZhbCk7CisJaWYgKG1yZXQgPCAwKQorCQlyZXR1cm4gbXJldDsKKworCXJldHVybiAoY3JldCA+IDAgfHwgbHJldCA+IDAgfHwgbXJldCA+IDApID8gMSA6IDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfYWM5N19hZDE5ODZfY29udHJvbHNbXSA9IHsKKwlBQzk3X1NJTkdMRSgiRXhjaGFuZ2UgQ2VudGVyL0xGRSIsIEFDOTdfQURfU0VSSUFMX0NGRywgMywgMSwgMCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiRXhjaGFuZ2UgRnJvbnQvU3Vycm91bmQiLAorCQkuaW5mbyA9IHNuZF9hYzk3X2FkMTk4Nl9ib29sX2luZm8sCisJCS5nZXQgPSBzbmRfYWM5N19hZDE5ODZfbG9zb3NlbF9nZXQsCisJCS5wdXQgPSBzbmRfYWM5N19hZDE5ODZfbG9zb3NlbF9wdXQKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkV4Y2hhbmdlIE1pYy9MaW5lIEluIiwKKwkJLmluZm8gPSBzbmRfYWM5N19hZDE5ODZfYm9vbF9pbmZvLAorCQkuZ2V0ID0gc25kX2FjOTdfYWQxOTg2X21pY2xpc2VsX2dldCwKKwkJLnB1dCA9IHNuZF9hYzk3X2FkMTk4Nl9taWNsaXNlbF9wdXQKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIlNwcmVhZCBGcm9udCB0byBTdXJyb3VuZCBhbmQgQ2VudGVyL0xGRSIsCisJCS5pbmZvID0gc25kX2FjOTdfYWQxOTg2X2Jvb2xfaW5mbywKKwkJLmdldCA9IHNuZF9hYzk3X2FkMTk4Nl9zcHJlYWRfZ2V0LAorCQkucHV0ID0gc25kX2FjOTdfYWQxOTg2X3NwcmVhZF9wdXQKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkRvd25taXgiLAorCQkuaW5mbyA9IHNuZF9hYzk3X2FkMTg4OF9kb3dubWl4X2luZm8sCisJCS5nZXQgPSBzbmRfYWM5N19hZDE4ODhfZG93bm1peF9nZXQsCisJCS5wdXQgPSBzbmRfYWM5N19hZDE4ODhfZG93bm1peF9wdXQKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIlZfUkVGT1VUIiwKKwkJLmluZm8gPSBzbmRfYWM5N19hZDE5ODVfdnJlZm91dF9pbmZvLAorCQkuZ2V0ID0gc25kX2FjOTdfYWQxOTg2X3ZyZWZvdXRfZ2V0LAorCQkucHV0ID0gc25kX2FjOTdfYWQxOTg2X3ZyZWZvdXRfcHV0CisJfSwKKwlBQzk3X1NVUlJPVU5EX0pBQ0tfTU9ERV9DVEwsCisJQUM5N19DSEFOTkVMX01PREVfQ1RMLAorCisJQUM5N19TSU5HTEUoIkhlYWRwaG9uZSBKYWNrIFNlbnNlIiwgQUM5N19BRF9KQUNLX1NQRElGLCAxMCwgMSwgMCksCisJQUM5N19TSU5HTEUoIkxpbmUgSmFjayBTZW5zZSIsIEFDOTdfQURfSkFDS19TUERJRiwgMTIsIDEsIDApCit9OworCitzdGF0aWMgdm9pZCBhZDE5ODZfdXBkYXRlX2phY2tzKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3sKKwl1bnNpZ25lZCBzaG9ydCBtaXNjX3ZhbCA9IDA7CisJdW5zaWduZWQgc2hvcnQgc2VyX3ZhbDsKKworCS8qIGRpc2FibGUgU1VSUk9VTkQgYW5kIENFTlRFUi9MRkUgaWYgbm90IHN1cnJvdW5kIG1vZGUgKi8KKwlpZiAoISBpc19zdXJyb3VuZF9vbihhYzk3KSkKKwkJbWlzY192YWwgfD0gQUM5N19BRDE5ODZfU09ESVM7CisJaWYgKCEgaXNfY2xmZV9vbihhYzk3KSkKKwkJbWlzY192YWwgfD0gQUM5N19BRDE5ODZfQ0xESVM7CisKKwkvKiBzZWxlY3QgbGluZSBpbnB1dCAoZGVmYXVsdD1MSU5FX0lOLCBTVVJST1VORCBvciBNSUNfMS8yKSAqLworCWlmIChpc19zaGFyZWRfbGluZWluKGFjOTcpKQorCQltaXNjX3ZhbCB8PSBBQzk3X0FEMTk4Nl9MSVNFTF9TVVJSOworCWVsc2UgaWYgKGFjOTctPnNwZWMuYWQxOHh4LnN3YXBfbWljX2xpbmVpbiAhPSAwKQorCQltaXNjX3ZhbCB8PSBBQzk3X0FEMTk4Nl9MSVNFTF9NSUM7CisJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19BRF9NSVNDLAorCQkJICAgICBBQzk3X0FEMTk4Nl9TT0RJUyB8IEFDOTdfQUQxOTg2X0NMRElTIHwKKwkJCSAgICAgQUM5N19BRDE5ODZfTElTRUxfTUFTSywKKwkJCSAgICAgbWlzY192YWwpOworCisJLyogc2VsZWN0IG1pY3JvcGhvbmUgaW5wdXQgKE1JQ18xLzIsIENlbnRlci9MRkUgb3IgTElORV9JTikgKi8KKwlpZiAoaXNfc2hhcmVkX21pY2luKGFjOTcpKQorCQlzZXJfdmFsID0gQUM5N19BRDE5ODZfT01TX0M7CisJZWxzZSBpZiAoYWM5Ny0+c3BlYy5hZDE4eHguc3dhcF9taWNfbGluZWluICE9IDApCisJCXNlcl92YWwgPSBBQzk3X0FEMTk4Nl9PTVNfTDsKKwllbHNlCisJCXNlcl92YWwgPSBBQzk3X0FEMTk4Nl9PTVNfTTsKKwlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FEX1NFUklBTF9DRkcsCisJCQkgICAgIEFDOTdfQUQxOTg2X09NU19NQVNLLAorCQkJICAgICBzZXJfdmFsKTsKK30KKworc3RhdGljIGludCBwYXRjaF9hZDE5ODZfc3BlY2lmaWMoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBhdGNoX2J1aWxkX2NvbnRyb2xzKGFjOTcsICZzbmRfYWM5N19hZDE5OHhfMmNtaWMsIDEpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5Nywgc25kX2FjOTdfYWQxOTg2X2NvbnRyb2xzLAorCQkJCSAgICBBUlJBWV9TSVpFKHNuZF9hYzk3X2FkMTk4NV9jb250cm9scykpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1aWxkX29wcyBwYXRjaF9hZDE5ODZfYnVpbGRfb3BzID0geworCS5idWlsZF9wb3N0X3NwZGlmID0gcGF0Y2hfYWQxOTh4X3Bvc3Rfc3BkaWYsCisJLmJ1aWxkX3NwZWNpZmljID0gcGF0Y2hfYWQxOTg2X3NwZWNpZmljLAorI2lmZGVmIENPTkZJR19QTQorCS5yZXN1bWUgPSBhZDE4eHhfcmVzdW1lLAorI2VuZGlmCisJLnVwZGF0ZV9qYWNrcyA9IGFkMTk4Nl91cGRhdGVfamFja3MsCit9OworCitpbnQgcGF0Y2hfYWQxOTg2KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCit7CisJcGF0Y2hfYWQxODgxKGFjOTcpOworCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF9hZDE5ODZfYnVpbGRfb3BzOworCWFjOTctPmZsYWdzIHw9IEFDOTdfU1RFUkVPX01VVEVTOworCisJLyogdXBkYXRlIGN1cnJlbnQgamFjayBjb25maWd1cmF0aW9uICovCisJYWQxOTg2X3VwZGF0ZV9qYWNrcyhhYzk3KTsKKworCXJldHVybiAwOworfQorCisKIC8qCiAgKiByZWFsdGVrIEFMQzY1eC84NTAgY29kZWNzCiAgKi8KQEAgLTIwMTQsMTIgKzI0NzcsMTIgQEAKIHsKIAlpbnQgc2hhcmVkOwogCQotCS8qIHNoYXJlZCBMaW5lLUluICovCi0Jc2hhcmVkID0gaXNfc2hhcmVkX2xpbmVpbihhYzk3KTsKKwkvKiBzaGFyZWQgTGluZS1JbiAvIFN1cnJvdW5kIE91dCAqLworCXNoYXJlZCA9IGlzX3NoYXJlZF9zdXJyb3V0KGFjOTcpOwogCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQUxDNjUwX01VTFRJQ0gsIDEgPDwgOSwKIAkJCSAgICAgc2hhcmVkID8gKDEgPDwgOSkgOiAwKTsKLQkvKiB1cGRhdGUgc2hhcmVkIE1pYyAqLwotCXNoYXJlZCA9IGlzX3NoYXJlZF9taWNpbihhYzk3KTsKKwkvKiB1cGRhdGUgc2hhcmVkIE1pYyBJbiAvIENlbnRlci9MRkUgT3V0ICovCisJc2hhcmVkID0gaXNfc2hhcmVkX2NsZmVvdXQoYWM5Nyk7CiAJLyogZGlzYWJsZS9lbmFibGUgdnJlZiAqLwogCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQUxDNjUwX0NMT0NLLCAxIDw8IDEyLAogCQkJICAgICBzaGFyZWQgPyAoMSA8PCAxMikgOiAwKTsKQEAgLTIwNjQsNyArMjUyNyw3IEBACiAJLyogQUM5N19TSU5HTEUoIklFQzk1OCBJbnB1dCBNb25pdG9yIiwgQUM5N19BTEM2NTBfTVVMVElDSCwgMTMsIDEsIDApLCAqLwogfTsKIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlXzViaXRfM2RiX21heCwgLTQzNTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfNWJpdF8zZGJfbWF4LCAtNDM1MCwgMTUwLCAwKTsKIAogc3RhdGljIGludCBwYXRjaF9hbGM2NTBfc3BlY2lmaWMoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKQEAgLTIxNDksMTIgKzI2MTIsMTIgQEAKIHsKIAlpbnQgc2hhcmVkOwogCQotCS8qIHNoYXJlZCBMaW5lLUluICovCi0Jc2hhcmVkID0gaXNfc2hhcmVkX2xpbmVpbihhYzk3KTsKKwkvKiBzaGFyZWQgTGluZS1JbiAvIFN1cnJvdW5kIE91dCAqLworCXNoYXJlZCA9IGlzX3NoYXJlZF9zdXJyb3V0KGFjOTcpOwogCWFjOTdfdXBkYXRlX2JpdHNfcGFnZShhYzk3LCBBQzk3X0FMQzY1MF9NVUxUSUNILCAxIDw8IDksCiAJCQkgICAgICBzaGFyZWQgPyAoMSA8PCA5KSA6IDAsIDApOwotCS8qIHVwZGF0ZSBzaGFyZWQgbWljICovCi0Jc2hhcmVkID0gaXNfc2hhcmVkX21pY2luKGFjOTcpOworCS8qIHVwZGF0ZSBzaGFyZWQgTWljIEluIC8gQ2VudGVyL0xGRSBPdXQgKi8KKwlzaGFyZWQgPSBpc19zaGFyZWRfY2xmZW91dChhYzk3KTsKIAkvKiBtaXNjIGNvbnRyb2w7IHZyZWZvdXQgZGlzYWJsZSAqLwogCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQUxDNjUwX0NMT0NLLCAxIDw8IDEyLAogCQkJICAgICBzaGFyZWQgPyAoMSA8PCAxMikgOiAwKTsKQEAgLTIyNjQsNyArMjcyNyw4IEBACiAJCWlmIChhYzk3LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTQ2MiAmJgogCQkgICAgKGFjOTctPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMTMxIHx8IC8qIE1TSSBTMjcwIGxhcHRvcCAqLwogCQkgICAgIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMTYxIHx8IC8qIExHIEsxIEV4cHJlc3MgKi8KLQkJICAgICBhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDM1MSkpICAvKiBNU0kgTDcyNSBsYXB0b3AgKi8KKwkJICAgICBhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDM1MSB8fCAvKiBNU0kgTDcyNSBsYXB0b3AgKi8KKwkJICAgICBhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDA2MSkpICAvKiBNU0kgUzI1MCBsYXB0b3AgKi8KIAkJCXZhbCAmPSB+KDEgPDwgMSk7IC8qIFBpbiA0NyBpcyBFQVBEIChmb3IgaW50ZXJuYWwgc3BlYWtlcikgKi8KIAkJZWxzZQogCQkJdmFsIHw9ICgxIDw8IDEpOyAvKiBQaW4gNDcgaXMgc3BkaWYgaW5wdXQgcGluICovCkBAIC0yMjk3LDE2ICsyNzYxLDE2IEBACiB7CiAJaW50IHNoYXJlZDsKIAkKLQkvKiBzaGFyZWQgTGluZS1JbiAqLwotCXNoYXJlZCA9IGlzX3NoYXJlZF9saW5laW4oYWM5Nyk7CisJLyogc2hhcmVkIExpbmUtSW4gLyBTdXJyb3VuZCBPdXQgKi8KKwlzaGFyZWQgPSBpc19zaGFyZWRfc3Vycm91dChhYzk3KTsKIAkvKiBTVVJSIDFrT2htIChiaXQ0KSwgQW1wIChiaXQ1KSAqLwogCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQUxDODUwX01JU0MxLCAoMTw8NCl8KDE8PDUpLAogCQkJICAgICBzaGFyZWQgPyAoMTw8NSkgOiAoMTw8NCkpOwogCS8qIExJTkUtSU4gPSAwLCBTVVJST1VORCA9IDIgKi8KIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0FMQzg1MF9KQUNLX1NFTEVDVCwgNyA8PCAxMiwKIAkJCSAgICAgc2hhcmVkID8gKDI8PDEyKSA6ICgwPDwxMikpOwotCS8qIHVwZGF0ZSBzaGFyZWQgbWljICovCi0Jc2hhcmVkID0gaXNfc2hhcmVkX21pY2luKGFjOTcpOworCS8qIHVwZGF0ZSBzaGFyZWQgTWljIEluIC8gQ2VudGVyL0xGRSBPdXQgKi8KKwlzaGFyZWQgPSBpc19zaGFyZWRfY2xmZW91dChhYzk3KTsKIAkvKiBWcmVmIGRpc2FibGUgKGJpdDEyKSwgMWtPaG0gKGJpdDEzKSAqLwogCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQUxDODUwX01JU0MxLCAoMTw8MTIpfCgxPDwxMyksCiAJCQkgICAgIHNoYXJlZCA/ICgxPDwxMikgOiAoMTw8MTMpKTsKQEAgLTIzNzksOSArMjg0Myw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGNtOTczOF91cGRhdGVfamFja3Moc3RydWN0IHNuZF9hYzk3ICphYzk3KQogewotCS8qIHNoYXJlZCBMaW5lLUluICovCisJLyogc2hhcmVkIExpbmUtSW4gLyBTdXJyb3VuZCBPdXQgKi8KIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0NNOTczOF9WRU5ET1JfQ1RSTCwgMSA8PCAxMCwKLQkJCSAgICAgaXNfc2hhcmVkX2xpbmVpbihhYzk3KSA/ICgxIDw8IDEwKSA6IDApOworCQkJICAgICBpc19zaGFyZWRfc3Vycm91dChhYzk3KSA/ICgxIDw8IDEwKSA6IDApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FjOTdfY205NzM4X2NvbnRyb2xzW10gPSB7CkBAIC0yNDYzLDEyICsyOTI3LDEyIEBACiAKIHN0YXRpYyB2b2lkIGNtOTczOV91cGRhdGVfamFja3Moc3RydWN0IHNuZF9hYzk3ICphYzk3KQogewotCS8qIHNoYXJlZCBMaW5lLUluICovCisJLyogc2hhcmVkIExpbmUtSW4gLyBTdXJyb3VuZCBPdXQgKi8KIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0NNOTczOV9NVUxUSV9DSEFOLCAxIDw8IDEwLAotCQkJICAgICBpc19zaGFyZWRfbGluZWluKGFjOTcpID8gKDEgPDwgMTApIDogMCk7Ci0JLyogc2hhcmVkIE1pYyAqLworCQkJICAgICBpc19zaGFyZWRfc3Vycm91dChhYzk3KSA/ICgxIDw8IDEwKSA6IDApOworCS8qIHNoYXJlZCBNaWMgSW4gLyBDZW50ZXIvTEZFIE91dCAqKi8KIAlzbmRfYWM5N191cGRhdGVfYml0cyhhYzk3LCBBQzk3X0NNOTczOV9NVUxUSV9DSEFOLCAweDMwMDAsCi0JCQkgICAgIGlzX3NoYXJlZF9taWNpbihhYzk3KSA/IDB4MTAwMCA6IDB4MjAwMCk7CisJCQkgICAgIGlzX3NoYXJlZF9jbGZlb3V0KGFjOTcpID8gMHgxMDAwIDogMHgyMDAwKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hYzk3X2NtOTczOV9jb250cm9sc1tdID0gewpAQCAtMjU4MCw4ICszMDQ0LDggQEAKIAogCXZhbCB8PSBzdXJyX29uW2FjOTctPnNwZWMuZGV2X2ZsYWdzXVtpc19zdXJyb3VuZF9vbihhYzk3KV07CiAJdmFsIHw9IGNsZmVfb25bYWM5Ny0+c3BlYy5kZXZfZmxhZ3NdW2lzX2NsZmVfb24oYWM5NyldOwotCXZhbCB8PSBzdXJyX3NoYXJlZFthYzk3LT5zcGVjLmRldl9mbGFnc11baXNfc2hhcmVkX2xpbmVpbihhYzk3KV07Ci0JdmFsIHw9IGNsZmVfc2hhcmVkW2FjOTctPnNwZWMuZGV2X2ZsYWdzXVtpc19zaGFyZWRfbWljaW4oYWM5NyldOworCXZhbCB8PSBzdXJyX3NoYXJlZFthYzk3LT5zcGVjLmRldl9mbGFnc11baXNfc2hhcmVkX3N1cnJvdXQoYWM5NyldOworCXZhbCB8PSBjbGZlX3NoYXJlZFthYzk3LT5zcGVjLmRldl9mbGFnc11baXNfc2hhcmVkX2NsZmVvdXQoYWM5NyldOwogCiAJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgQUM5N19DTTk3NjFfTVVMVElfQ0hBTiwgMHgzYzg4LCB2YWwpOwogfQpAQCAtMjgyMSw2ICszMjg1LDcgQEAKIAlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCAweDVjLCAweDIwKTsKIAlhYzk3LT5leHRfaWQgfD0gQUM5N19FSV9TUERJRjsJLyogZm9yY2UgdGhlIGRldGVjdGlvbiBvZiBzcGRpZiAqLwogCWFjOTctPnJhdGVzW0FDOTdfUkFURVNfU1BESUZdID0gU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMDsKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfdnQxNjE2X29wczsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjgyOCwxMiArMzI5MywxMiBAQAogICovCiBzdGF0aWMgdm9pZCBpdDI2NDZfdXBkYXRlX2phY2tzKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKLQkvKiBzaGFyZWQgTGluZS1JbiAqLworCS8qIHNoYXJlZCBMaW5lLUluIC8gU3Vycm91bmQgT3V0ICovCiAJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgMHg3NiwgMSA8PCA5LAotCQkJICAgICBpc19zaGFyZWRfbGluZWluKGFjOTcpID8gKDE8PDkpIDogMCk7Ci0JLyogc2hhcmVkIE1pYyAqLworCQkJICAgICBpc19zaGFyZWRfc3Vycm91dChhYzk3KSA/ICgxPDw5KSA6IDApOworCS8qIHNoYXJlZCBNaWMgLyBDZW50ZXIvTEZFIE91dCAqLwogCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIDB4NzYsIDEgPDwgMTAsCi0JCQkgICAgIGlzX3NoYXJlZF9taWNpbihhYzk3KSA/ICgxPDwxMCkgOiAwKTsKKwkJCSAgICAgaXNfc2hhcmVkX2NsZmVvdXQoYWM5NykgPyAoMTw8MTApIDogMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfYWM5N19jb250cm9sc19pdDI2NDZbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guaCBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guaAppbmRleCA3NDE5NzkyLi45NDM0MGRhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmgKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5oCkBAIC00OCw2ICs0OCw3IEBACiBpbnQgcGF0Y2hfYWQxOTgxYShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKIGludCBwYXRjaF9hZDE5ODFiKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwogaW50IHBhdGNoX2FkMTk4NShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKK2ludCBwYXRjaF9hZDE5ODYoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7CiBpbnQgcGF0Y2hfYWxjNjUwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwogaW50IHBhdGNoX2FsYzY1NShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKIGludCBwYXRjaF9hbGM4NTAoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hazQ1MzFfY29kZWMuYyBiL3NvdW5kL3BjaS9hYzk3L2FrNDUzMV9jb2RlYy5jCmluZGV4IGMxNTNjYjcuLmRjMjY4MjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FrNDUzMV9jb2RlYy5jCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FrNDUzMV9jb2RlYy5jCkBAIC0yNjcsOSArMjY3LDkgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfbWFzdGVyLCAtNjIwMCwgMjAwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9tb25vLCAtMjgwMCwgNDAwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9pbnB1dCwgLTUwMDAsIDIwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfbWFzdGVyLCAtNjIwMCwgMjAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9tb25vLCAtMjgwMCwgNDAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9pbnB1dCwgLTUwMDAsIDIwMCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfYWs0NTMxX2NvbnRyb2xzW10gPSB7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbHMzMDAuYyBiL3NvdW5kL3BjaS9hbHMzMDAuYwppbmRleCA5ZjQwNmZiLi44YWZjYjk4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzMzAwLmMKKysrIGIvc291bmQvcGNpL2FsczMwMC5jCkBAIC00NDQsNyArNDQ0LDcgQEAKIH0KIAogc3RhdGljIGludCBzbmRfYWxzMzAwX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJCXNuZF9wY21faHdfcGFyYW1zX3QgKiBod19wYXJhbXMpCisJCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogewogCXJldHVybiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLAogCQkJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwpAQCAtNjczLDcgKzY3Myw3IEBACiAJc25kX2FsczMwMF9kYmdjYWxsbGVhdmUoKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgc25kX2FsczMwMF9jcmVhdGUoc25kX2NhcmRfdCAqY2FyZCwKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hbHMzMDBfY3JlYXRlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKIAkJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKnBjaSwgaW50IGNoaXBfdHlwZSwKIAkJCQkgICAgICAgc3RydWN0IHNuZF9hbHMzMDAgKipyY2hpcCkKIHsKQEAgLTY4MSw3ICs2ODEsNyBAQAogCXZvaWQgKmlycV9oYW5kbGVyOwogCWludCBlcnI7CiAKLQlzdGF0aWMgc25kX2RldmljZV9vcHNfdCBvcHMgPSB7CisJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBvcHMgPSB7CiAJCS5kZXZfZnJlZSA9IHNuZF9hbHMzMDBfZGV2X2ZyZWUsCiAJfTsKIAkqcmNoaXAgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cC5jIGIvc291bmQvcGNpL2F0aWl4cC5jCmluZGV4IDQ3NmMzNDMuLjdkODA1M2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHAuYworKysgYi9zb3VuZC9wY2kvYXRpaXhwLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIHN0YXRpYyBpbnQgYWM5N19jbG9jayA9IDQ4MDAwOwogc3RhdGljIGNoYXIgKmFjOTdfcXVpcms7CiBzdGF0aWMgaW50IHNwZGlmX2FjbGluayA9IDE7CitzdGF0aWMgaW50IGFjOTdfY29kZWMgPSAtMTsKIAogbW9kdWxlX3BhcmFtKGluZGV4LCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBBVEkgSVhQIGNvbnRyb2xsZXIuIik7CkBAIC01NCw2ICs1NSw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKGFjOTdfY2xvY2ssICJBQyc5NyBjb2RlYyBjbG9jayAoZGVmYXVsdCA0ODAwMEh6KS4iKTsKIG1vZHVsZV9wYXJhbShhYzk3X3F1aXJrLCBjaGFycCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFjOTdfcXVpcmssICJBQyc5NyB3b3JrYXJvdW5kIGZvciBzdHJhbmdlIGhhcmR3YXJlLiIpOworbW9kdWxlX3BhcmFtKGFjOTdfY29kZWMsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFjOTdfY29kZWMsICJTcGVjaWZ5IGNvZGVjIGluc3RlYWQgb2YgcHJvYmluZy4iKTsKIG1vZHVsZV9wYXJhbShzcGRpZl9hY2xpbmssIGJvb2wsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzcGRpZl9hY2xpbmssICJTL1BESUYgb3ZlciBBQy1saW5rLiIpOwogCkBAIC0yOTMsNiArMjk2LDEwIEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfYXRpaXhwX2lkcyk7CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhdGlpeHBfcXVpcmtzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTViZCwgMHgzMTAwLCAiREZJIFJTNDgyIiwgMCksCisJeyB9IC8qIHRlcm1pbmF0b3IgKi8KK307CiAKIC8qCiAgKiBsb3dsZXZlbCBmdW5jdGlvbnMKQEAgLTU1MywxMSArNTYwLDMzIEBACiAJICAgICBBVElfUkVHX0lTUl9DT0RFQzJfTk9UX1JFQURZKQogI2RlZmluZSBDT0RFQ19DSEVDS19CSVRTIChBTExfQ09ERUNfTk9UX1JFQURZfEFUSV9SRUdfSVNSX05FV19GUkFNRSkKIAorc3RhdGljIGludCBhYzk3X3Byb2JpbmdfYnVncyhzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCWNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICpxOworCisJcSA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgYXRpaXhwX3F1aXJrcyk7CisJaWYgKHEpIHsKKwkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJBdGlpeHAgcXVpcmsgZm9yICVzLiAgIgorCQkJICAgICJGb3JjaW5nIGNvZGVjICVkXG4iLCBxLT5uYW1lLCBxLT52YWx1ZSk7CisJCXJldHVybiBxLT52YWx1ZTsKKwl9CisJLyogdGhpcyBoYXJkd2FyZSBkb2Vzbid0IG5lZWQgd29ya2Fyb3VuZHMuICBQcm9iZSBmb3IgY29kZWMgKi8KKwlyZXR1cm4gLTE7Cit9CisKIHN0YXRpYyBpbnQgc25kX2F0aWl4cF9jb2RlY19kZXRlY3Qoc3RydWN0IGF0aWl4cCAqY2hpcCkKIHsKIAlpbnQgdGltZW91dDsKIAogCWNoaXAtPmNvZGVjX25vdF9yZWFkeV9iaXRzID0gMDsKKwlpZiAoYWM5N19jb2RlYyA9PSAtMSkKKwkJYWM5N19jb2RlYyA9IGFjOTdfcHJvYmluZ19idWdzKGNoaXAtPnBjaSk7CisJaWYgKGFjOTdfY29kZWMgPj0gMCkgeworCQljaGlwLT5jb2RlY19ub3RfcmVhZHlfYml0cyB8PSAKKwkJCUNPREVDX0NIRUNLX0JJVFMgXiAoMSA8PCAoYWM5N19jb2RlYyArIDEwKSk7CisJCXJldHVybiAwOworCX0KKwogCWF0aWl4cF93cml0ZShjaGlwLCBJRVIsIENPREVDX0NIRUNLX0JJVFMpOwogCS8qIHdhaXQgZm9yIHRoZSBpbnRlcnJ1cHRzICovCiAJdGltZW91dCA9IDUwOwpAQCAtMTM5Niw3ICsxNDI1LDcgQEAKIAkJYWM5Ny5wcml2YXRlX2RhdGEgPSBjaGlwOwogCQlhYzk3LnBjaSA9IGNoaXAtPnBjaTsKIAkJYWM5Ny5udW0gPSBpOwotCQlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfTU9ERU07CisJCWFjOTcuc2NhcHMgPSBBQzk3X1NDQVBfU0tJUF9NT0RFTSB8IEFDOTdfU0NBUF9QT1dFUl9TQVZFOwogCQlpZiAoISBjaGlwLT5zcGRpZl9vdmVyX2FjbGluaykKIAkJCWFjOTcuc2NhcHMgfD0gQUM5N19TQ0FQX05PX1NQRElGOwogCQlpZiAoKGVyciA9IHNuZF9hYzk3X21peGVyKHBidXMsICZhYzk3LCAmY2hpcC0+YWM5N1tpXSkpIDwgMCkgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCmluZGV4IGNjMmU2YjkuLjkwNDAyM2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYworKysgYi9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKQEAgLTEwOTAsNyArMTA5MCw3IEBACiAJCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKIAkJYWM5Ny5wY2kgPSBjaGlwLT5wY2k7CiAJCWFjOTcubnVtID0gaTsKLQkJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX0FVRElPOworCQlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfQVVESU8gfCBBQzk3X1NDQVBfUE9XRVJfU0FWRTsKIAkJaWYgKChlcnIgPSBzbmRfYWM5N19taXhlcihwYnVzLCAmYWM5NywgJmNoaXAtPmFjOTdbaV0pKSA8IDApIHsKIAkJCWNoaXAtPmFjOTdbaV0gPSBOVUxMOyAvKiB0byBiZSBzdXJlICovCiAJCQlzbmRfcHJpbnRkZCgiYXRpaXhwLW1vZGVtOiBjb2RlYyAlZCBub3QgYXZhaWxhYmxlIGZvciBtb2RlbVxuIiwgaSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKaW5kZXggZjYxZjA1Mi4uZWE2NzEyYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYwpAQCAtMTM4Miw3ICsxMzgyLDYgQEAKIAlzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBTUERJRl9TRUxFQ1QxLCAwLCAweGYpOwogCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIFNQRElGX1NFTEVDVDIsIDAsIDB4MDAwZjAwMDApOyAvKiAweDBiMDAwMDAwIGZvciBkaWdpdGFsLCAweDAwMGIwMDAwIGZvciBhbmFsb2csIGZyb20gd2luMjAwMCBkcml2ZXJzLiBVc2UgMHgwMDBmMDAwMCBmb3Igc3Vycm91bmQ3MSAqLwogCWNoaXAtPnNwZGlmX2VuYWJsZSA9IDA7IC8qIFNldCBkaWdpdGFsIFNQRElGIG91dHB1dCBvZmYgKi8KLQljaGlwLT5jYXB0dXJlX3NvdXJjZSA9IDM7IC8qIFNldCBDQVBUVVJFX1NPVVJDRSAqLwogCS8vc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgMHg0NSwgMCwgMCk7IC8qIEFuYWxvZ3VlIG91dCAqLwogCS8vc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgMHg0NSwgMCwgMHhmMDApOyAvKiBEaWdpdGFsIG91dCAqLwogCkBAIC0xNDAyLDggKzE0MDEsMjIgQEAKIAkJc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgUExBWUJBQ0tfVk9MVU1FMSwgY2gsIDB4ZmZmZmZmZmYpOyAvKiBNdXRlICovCiAJCXNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIFBMQVlCQUNLX1ZPTFVNRTIsIGNoLCAweGZmZmZmZmZmKTsgLyogTXV0ZSAqLwogCX0KLSAgICAgICAgc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgQ0FQVFVSRV9TT1VSQ0UsIDB4MCwgMHgzMzMzMDBlNCk7IC8qIFNlbGVjdCBNSUMsIExpbmUgaW4sIFRBRCBpbiwgQVVYIGluICovCi0JY2hpcC0+Y2FwdHVyZV9zb3VyY2UgPSAzOyAvKiBTZXQgQ0FQVFVSRV9TT1VSQ0UgKi8KKwlpZiAoY2hpcC0+ZGV0YWlscy0+aTJjX2FkYyA9PSAxKSB7CisJICAgICAgICAvKiBTZWxlY3QgTUlDLCBMaW5lIGluLCBUQUQgaW4sIEFVWCBpbiAqLworCSAgICAgICAgc25kX2NhMDEwNl9wdHJfd3JpdGUoY2hpcCwgQ0FQVFVSRV9TT1VSQ0UsIDB4MCwgMHgzMzMzMDBlNCk7CisJCS8qIERlZmF1bHQgdG8gQ0FQVFVSRV9TT1VSQ0UgdG8gaTJzIGluICovCisJCWNoaXAtPmNhcHR1cmVfc291cmNlID0gMzsKKwl9IGVsc2UgaWYgKGNoaXAtPmRldGFpbHMtPmFjOTcgPT0gMSkgeworCSAgICAgICAgLyogRGVmYXVsdCB0byBBQzk3IGluICovCisJICAgICAgICBzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBDQVBUVVJFX1NPVVJDRSwgMHgwLCAweDQ0NDQwMGU0KTsKKwkJLyogRGVmYXVsdCB0byBDQVBUVVJFX1NPVVJDRSB0byBBQzk3IGluICovCisJCWNoaXAtPmNhcHR1cmVfc291cmNlID0gNDsKKwl9IGVsc2UgeworCSAgICAgICAgLyogU2VsZWN0IE1JQywgTGluZSBpbiwgVEFEIGluLCBBVVggaW4gKi8KKwkgICAgICAgIHNuZF9jYTAxMDZfcHRyX3dyaXRlKGNoaXAsIENBUFRVUkVfU09VUkNFLCAweDAsIDB4MzMzMzAwZTQpOworCQkvKiBEZWZhdWx0IHRvIFNldCBDQVBUVVJFX1NPVVJDRSB0byBpMnMgaW4gKi8KKwkJY2hpcC0+Y2FwdHVyZV9zb3VyY2UgPSAzOworCX0KIAogICAgICAgICBpZiAoY2hpcC0+ZGV0YWlscy0+Z3Bpb190eXBlID09IDIpIHsgLyogVGhlIFNCMDQzOCB1c2UgR1BJTyBkaWZmZXJlbnRseS4gKi8KIAkJLyogRklYTUU6IFN0aWxsIG5lZWQgdG8gZmluZCBvdXQgd2hhdCB0aGUgb3RoZXIgR1BJTyBiaXRzIGRvLiBFLmcuIEZvciBkaWdpdGFsIHNwZGlmIG91dC4gKi8KQEAgLTE2MDUsNiArMTYxOCw4IEBACiAJc25kX2NhMDEwNl9wcm9jX2luaXQoY2hpcCk7CiAjZW5kaWYKIAorCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKKwogCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWl4ZXIuYyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21peGVyLmMKaW5kZXggOTg1NWY1Mi4uYjkxM2ExZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWl4ZXIuYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9taXhlci5jCkBAIC03NCw4ICs3NCw4IEBACiAKICNpbmNsdWRlICJjYTAxMDYuaCIKIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKHNuZF9jYTAxMDZfZGJfc2NhbGUxLCAtNTE3NSwgMjUsIDEpOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKHNuZF9jYTAxMDZfZGJfc2NhbGUyLCAtMTAzNTAsIDUwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzbmRfY2EwMTA2X2RiX3NjYWxlMSwgLTUxNzUsIDI1LCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzbmRfY2EwMTA2X2RiX3NjYWxlMiwgLTEwMzUwLCA1MCwgMSk7CiAKIHN0YXRpYyBpbnQgc25kX2NhMDEwNl9zaGFyZWRfc3BkaWZfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKQEAgLTQ4MiwxOSArNDgyLDYgQEAKIAkucHJpdmF0ZV92YWx1ZSA9ICgoY2hpZCkgPDwgOCkgfCAocmVnKQkJCVwKIH0KIAotI2RlZmluZSBJMkNfVk9MVU1FKHhuYW1lLGNoaWQpIFwKLXsJCQkJCQkJCVwKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwJXAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwJCVwKLQkgICAgICAgICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFELAkJXAotCS5pbmZvID0gIHNuZF9jYTAxMDZfaTJjX3ZvbHVtZV9pbmZvLAkJCVwKLQkuZ2V0ID0gICBzbmRfY2EwMTA2X2kyY192b2x1bWVfZ2V0LAkJCVwKLQkucHV0ID0gICBzbmRfY2EwMTA2X2kyY192b2x1bWVfcHV0LAkJCVwKLQkudGx2ID0geyAucCA9IHNuZF9jYTAxMDZfZGJfc2NhbGUyIH0sCQkJXAotCS5wcml2YXRlX3ZhbHVlID0gY2hpZAkJCQkJXAotfQotCi0KIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfY2EwMTA2X3ZvbHVtZV9jdGxzW10gX19kZXZpbml0ZGF0YSA9IHsKIAlDQV9WT0xVTUUoIkFuYWxvZyBGcm9udCBQbGF5YmFjayBWb2x1bWUiLAogCQkgIENPTlRST0xfRlJPTlRfQ0hBTk5FTCwgUExBWUJBQ0tfVk9MVU1FMiksCkBAIC01MTcsMTEgKzUwNCw2IEBACiAgICAgICAgIENBX1ZPTFVNRSgiQ0FQVFVSRSBmZWVkYmFjayBQbGF5YmFjayBWb2x1bWUiLAogCQkgIDEsIENBUFRVUkVfQ09OVFJPTCksCiAKLSAgICAgICAgSTJDX1ZPTFVNRSgiUGhvbmUgQ2FwdHVyZSBWb2x1bWUiLCAwKSwKLSAgICAgICAgSTJDX1ZPTFVNRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMSksCi0gICAgICAgIEkyQ19WT0xVTUUoIkxpbmUgaW4gQ2FwdHVyZSBWb2x1bWUiLCAyKSwKLSAgICAgICAgSTJDX1ZPTFVNRSgiQXV4IENhcHR1cmUgVm9sdW1lIiwgMyksCi0KIAl7CiAJCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKIAkJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKQEAgLTUzOSwxNCArNTIxLDE0IEBACiAJfSwKIAl7CiAJCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9CQkiRGlnaXRhbCBDYXB0dXJlIFNvdXJjZSIsCisJCS5uYW1lID0JCSJEaWdpdGFsIFNvdXJjZSBDYXB0dXJlIEVudW0iLAogCQkuaW5mbyA9CQlzbmRfY2EwMTA2X2NhcHR1cmVfc291cmNlX2luZm8sCiAJCS5nZXQgPQkJc25kX2NhMDEwNl9jYXB0dXJlX3NvdXJjZV9nZXQsCiAJCS5wdXQgPQkJc25kX2NhMDEwNl9jYXB0dXJlX3NvdXJjZV9wdXQKIAl9LAogCXsKIAkJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0JCSJDYXB0dXJlIFNvdXJjZSIsCisJCS5uYW1lID0JCSJBbmFsb2cgU291cmNlIENhcHR1cmUgRW51bSIsCiAJCS5pbmZvID0JCXNuZF9jYTAxMDZfaTJjX2NhcHR1cmVfc291cmNlX2luZm8sCiAJCS5nZXQgPQkJc25kX2NhMDEwNl9pMmNfY2FwdHVyZV9zb3VyY2VfZ2V0LAogCQkucHV0ID0JCXNuZF9jYTAxMDZfaTJjX2NhcHR1cmVfc291cmNlX3B1dApAQCAtNTYxLDYgKzU0MywyNSBAQAogCX0sCiB9OwogCisjZGVmaW5lIEkyQ19WT0xVTUUoeG5hbWUsY2hpZCkgXAorewkJCQkJCQkJXAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLAlcCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAkJXAorCSAgICAgICAgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCQlcCisJLmluZm8gPSAgc25kX2NhMDEwNl9pMmNfdm9sdW1lX2luZm8sCQkJXAorCS5nZXQgPSAgIHNuZF9jYTAxMDZfaTJjX3ZvbHVtZV9nZXQsCQkJXAorCS5wdXQgPSAgIHNuZF9jYTAxMDZfaTJjX3ZvbHVtZV9wdXQsCQkJXAorCS50bHYgPSB7IC5wID0gc25kX2NhMDEwNl9kYl9zY2FsZTIgfSwJCQlcCisJLnByaXZhdGVfdmFsdWUgPSBjaGlkCQkJCQlcCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfY2EwMTA2X3ZvbHVtZV9pMmNfYWRjX2N0bHNbXSBfX2RldmluaXRkYXRhID0geworICAgICAgICBJMkNfVk9MVU1FKCJQaG9uZSBDYXB0dXJlIFZvbHVtZSIsIDApLAorICAgICAgICBJMkNfVk9MVU1FKCJNaWMgQ2FwdHVyZSBWb2x1bWUiLCAxKSwKKyAgICAgICAgSTJDX1ZPTFVNRSgiTGluZSBpbiBDYXB0dXJlIFZvbHVtZSIsIDIpLAorICAgICAgICBJMkNfVk9MVU1FKCJBdXggQ2FwdHVyZSBWb2x1bWUiLCAzKSwKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJlbW92ZV9jdGwoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgaWQ7CkBAIC02NDUsNiArNjQ2LDExIEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAlpZiAoZW11LT5kZXRhaWxzLT5pMmNfYWRjID09IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc25kX2NhMDEwNl92b2x1bWVfaTJjX2FkY19jdGxzKTsgaSsrKSB7CisJCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9jYTAxMDZfdm9sdW1lX2kyY19hZGNfY3Rsc1tpXSwgZW11KSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CiAJCWlmIChlbXUtPmRldGFpbHMtPmdwaW9fdHlwZSA9PSAxKQogCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfY2EwMTA2X2NhcHR1cmVfbWljX2xpbmVfaW4sIGVtdSkpOwogCQllbHNlICAvKiBncGlvX3R5cGUgPT0gMiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDI4MS5jIGIvc291bmQvcGNpL2NzNDI4MS5jCmluZGV4IDhlNTUxOWQuLjQ0Y2Y1NDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQyODEuYworKysgYi9zb3VuZC9wY2kvY3M0MjgxLmMKQEAgLTEwNTUsNyArMTA1NSw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RzcCwgLTQ2NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfZHNwLCAtNDY1MCwgMTUwLCAwKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9jczQyODFfZm1fdm9sID0gCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjAuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMC5jCmluZGV4IGI3MTA4ZTIuLjhlN2ZlMDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMC5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyNC5jCmluZGV4IGU1OWE5ODIuLmExM2M2MjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyNC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyNC5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG8zZy5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2cuYwppbmRleCAxMjA5OWZlLi44ZmIxNTgyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG8zZy5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnLmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnX2RzcC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2dfZHNwLmMKaW5kZXggZDI2YTFkMS4uNDhlYjdjNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2dfZHNwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2dfZHNwLmMKQEAgLTM5LDcgKzM5LDcgQEAKIHN0YXRpYyBpbnQgd3JpdGVfY29udHJvbF9yZWcoc3RydWN0IGVjaG9hdWRpbyAqY2hpcCwgdTMyIGN0bCwgdTMyIGZycSwKIAkJCSAgICAgY2hhciBmb3JjZSk7CiAKLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogc3RhdGljIGludCBpbml0X2h3KHN0cnVjdCBlY2hvYXVkaW8gKmNoaXAsIHUxNiBkZXZpY2VfaWQsIHUxNiBzdWJkZXZpY2VfaWQpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYwppbmRleCAwNDdlMGI1Li42YTQyOGI4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKQEAgLTM0LDYgKzM0LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICIgRUNIT0NBUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBjaGFubmVsc19saXN0WzEwXSA9IHsxLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwgOTk5OTk5fTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9vdXRwdXRfZ2FpbiwgLTEyODAwLCAxMDAsIDEpOwogCiBzdGF0aWMgaW50IGdldF9maXJtd2FyZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmd19lbnRyeSwKIAkJCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnJtLCBzdHJ1Y3QgZWNob2F1ZGlvICpjaGlwKQpAQCAtMTAxMSwxNyArMTAxMiwyMSBAQAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9lY2hvX2xpbmVfb3V0cHV0X2dhaW4gX19kZXZpbml0ZGF0YSA9IHsKIAkubmFtZSA9ICJMaW5lIFBsYXliYWNrIFZvbHVtZSIsCiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCiAJLmluZm8gPSBzbmRfZWNob19vdXRwdXRfZ2Fpbl9pbmZvLAogCS5nZXQgPSBzbmRfZWNob19vdXRwdXRfZ2Fpbl9nZXQsCiAJLnB1dCA9IHNuZF9lY2hvX291dHB1dF9nYWluX3B1dCwKKwkudGx2ID0gey5wID0gZGJfc2NhbGVfb3V0cHV0X2dhaW59LAogfTsKICNlbHNlCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2VjaG9fcGNtX291dHB1dF9nYWluIF9fZGV2aW5pdGRhdGEgPSB7CiAJLm5hbWUgPSAiUENNIFBsYXliYWNrIFZvbHVtZSIsCiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCiAJLmluZm8gPSBzbmRfZWNob19vdXRwdXRfZ2Fpbl9pbmZvLAogCS5nZXQgPSBzbmRfZWNob19vdXRwdXRfZ2Fpbl9nZXQsCiAJLnB1dCA9IHNuZF9lY2hvX291dHB1dF9nYWluX3B1dCwKKwkudGx2ID0gey5wID0gZGJfc2NhbGVfb3V0cHV0X2dhaW59LAogfTsKICNlbmRpZgogCkBAIC0xMDgwLDEyICsxMDg1LDE2IEBACiAJcmV0dXJuIGNoYW5nZWQ7CiB9CiAKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9pbnB1dF9nYWluLCAtMjUwMCwgNTAsIDApOworCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2VjaG9fbGluZV9pbnB1dF9nYWluIF9fZGV2aW5pdGRhdGEgPSB7CiAJLm5hbWUgPSAiTGluZSBDYXB0dXJlIFZvbHVtZSIsCiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCiAJLmluZm8gPSBzbmRfZWNob19pbnB1dF9nYWluX2luZm8sCiAJLmdldCA9IHNuZF9lY2hvX2lucHV0X2dhaW5fZ2V0LAogCS5wdXQgPSBzbmRfZWNob19pbnB1dF9nYWluX3B1dCwKKwkudGx2ID0gey5wID0gZGJfc2NhbGVfaW5wdXRfZ2Fpbn0sCiB9OwogCiAjZW5kaWYgLyogRUNIT0NBUkRfSEFTX0lOUFVUX0dBSU4gKi8KQEAgLTEyNzcsOSArMTI4NiwxMSBAQAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9lY2hvX21vbml0b3JfbWl4ZXIgX19kZXZpbml0ZGF0YSA9IHsKIAkubmFtZSA9ICJNb25pdG9yIE1peGVyIFZvbHVtZSIsCiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCiAJLmluZm8gPSBzbmRfZWNob19taXhlcl9pbmZvLAogCS5nZXQgPSBzbmRfZWNob19taXhlcl9nZXQsCiAJLnB1dCA9IHNuZF9lY2hvX21peGVyX3B1dCwKKwkudGx2ID0gey5wID0gZGJfc2NhbGVfb3V0cHV0X2dhaW59LAogfTsKIAogI2VuZGlmIC8qIEVDSE9DQVJEX0hBU19NT05JVE9SICovCkBAIC0xMzQzLDkgKzEzNTQsMTEgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfZWNob192bWl4ZXIgX19kZXZpbml0ZGF0YSA9IHsKIAkubmFtZSA9ICJWTWl4ZXIgVm9sdW1lIiwKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCwKIAkuaW5mbyA9IHNuZF9lY2hvX3ZtaXhlcl9pbmZvLAogCS5nZXQgPSBzbmRfZWNob192bWl4ZXJfZ2V0LAogCS5wdXQgPSBzbmRfZWNob192bWl4ZXJfcHV0LAorCS50bHYgPSB7LnAgPSBkYl9zY2FsZV9vdXRwdXRfZ2Fpbn0sCiB9OwogCiAjZW5kaWYgLyogRUNIT0NBUkRfSEFTX1ZNSVhFUiAqLwpAQCAtMTc1Myw5ICsxNzY2LDEyIEBACiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2VjaG9fdnVtZXRlcnMgX19kZXZpbml0ZGF0YSA9IHsKIAkubmFtZSA9ICJWVS1tZXRlcnMiLAogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfAorCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSB8CisJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFELAogCS5pbmZvID0gc25kX2VjaG9fdnVtZXRlcnNfaW5mbywKIAkuZ2V0ID0gc25kX2VjaG9fdnVtZXRlcnNfZ2V0LAorCS50bHYgPSB7LnAgPSBkYl9zY2FsZV9vdXRwdXRfZ2Fpbn0sCiB9OwogCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyMC5jCmluZGV4IDI5ZDZkMTIuLmFmNGQzMjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjAuYwpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjQuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTI0LmMKaW5kZXggZTQ2NGQ3Mi4uOWZmNDU0YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjQuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyNC5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnby5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ28uYwppbmRleCBiZmQyNDY3Li4zN2ViNzI2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnby5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGouYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGouYwppbmRleCA4ZWQ3ZmYxLi5kYzhiOTE4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2RqLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29kai5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2lvLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2lvLmMKaW5kZXggYTg3ODhlOS4uZWFkZjMyNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pby5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW8uYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjAuYwppbmRleCBlNTAzZDc0Li42Y2VkZTQ5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjAuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjAuYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTI0LmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjQuYwppbmRleCBkNDU4MWZkLi40NGY3MzU0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjQuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjQuYwpAQCAtNTgsNiArNTgsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9taWEuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhLmMKaW5kZXggYmU0MGM2NC4uZGMxNzJkMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9taWEuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21pYS5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmEuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbW9uYS5jCmluZGV4IDVkYzUxMmEuLmM4NTZlZDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbW9uYS5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbW9uYS5jCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCmluZGV4IDk3MmVjNDAuLjgwYWE1ODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCkBAIC0zLDggKzMsMTAgQEAKICAqICAgICAgICAgICAgICAgICAgIENyZWF0aXZlIExhYnMsIEluYy4KICAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBFTVUxMEsxIGNoaXBzCiAgKgotICogIENvcHlyaWdodCAoYykgYnkgSmFtZXMgQ291cnRpZXItRHV0dG9uIDxKYW1lc0BzdXBlcmJ1Zy5kZW1vbi5jby51az4KKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphbWVzIENvdXJ0aWVyLUR1dHRvbiA8SmFtZXNAc3VwZXJidWcuY28udWs+CiAgKiAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIEF1ZGlneSAyIFZhbHVlLgorICogIAlBZGRlZCBFTVUgMTAxMCBzdXBwb3J0LgorICogIAlHZW5lcmFsIGJ1ZyBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzLgogICoKICAqCiAgKiAgQlVHUzoKQEAgLTQxLDggKzQzLDEwIEBACiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZW11MTBrMS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSAicDE2di5oIgogI2luY2x1ZGUgInRpbmEyLmgiCisjaW5jbHVkZSAicDE3di5oIgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTcsMTEgKzEyMSwyOCBAQAogCQkweDA2MjIsCiAJCTB4MTQwMCwKIH07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTJjX2FkY19pbml0W11bMl0gPSB7CisJeyAweDE3LCAweDAwIH0sIC8qIFJlc2V0ICovCisJeyAweDA3LCAweDAwIH0sIC8qIFRpbWVvdXQgKi8KKwl7IDB4MGIsIDB4MjIgfSwgIC8qIEludGVyZmFjZSBjb250cm9sICovCisJeyAweDBjLCAweDIyIH0sICAvKiBNYXN0ZXIgbW9kZSBjb250cm9sICovCisJeyAweDBkLCAweDA4IH0sICAvKiBQb3dlcmRvd24gY29udHJvbCAqLworCXsgMHgwZSwgMHhjZiB9LCAgLyogQXR0ZW51YXRpb24gTGVmdCAgMHgwMSA9IC0xMDNkQiwgMHhmZiA9IDI0ZEIgKi8KKwl7IDB4MGYsIDB4Y2YgfSwgIC8qIEF0dGVudWF0aW9uIFJpZ2h0IDAuNWRCIHN0ZXBzICovCisJeyAweDEwLCAweDdiIH0sICAvKiBBTEMgQ29udHJvbCAxICovCisJeyAweDExLCAweDAwIH0sICAvKiBBTEMgQ29udHJvbCAyICovCisJeyAweDEyLCAweDMyIH0sICAvKiBBTEMgQ29udHJvbCAzICovCisJeyAweDEzLCAweDAwIH0sICAvKiBOb2lzZSBnYXRlIGNvbnRyb2wgKi8KKwl7IDB4MTQsIDB4YTYgfSwgIC8qIExpbWl0ZXIgY29udHJvbCAqLworCXsgMHgxNSwgQURDX01VWF8yIH0sICAvKiBBREMgTWl4ZXIgY29udHJvbC4gTWljIGZvciBBdWRpZ3kgMiBaUyBOb3RlYm9vayAqLworfTsKIAkKIHN0YXRpYyBpbnQgc25kX2VtdTEwazFfaW5pdChzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwgaW50IGVuYWJsZV9pciwgaW50IHJlc3VtZSkKIHsKIAl1bnNpZ25lZCBpbnQgc2lsZW50X3BhZ2U7CiAJaW50IGNoOworCXUzMiB0bXA7CiAKIAkvKiBkaXNhYmxlIGF1ZGlvIGFuZCBsb2NrIGNhY2hlICovCiAJb3V0bChIQ0ZHX0xPQ0tTT1VORENBQ0hFIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX01VVEVCVVRUT05FTkFCTEUsCkBAIC0xNjAsOCArMTgxLDYgQEAKIAogCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5jYTAxNTFfY2hpcCkgeyAvKiBhdWRpZ3kyICovCiAJCS8qIEhhY2tzIGZvciBBbGljZTMgdG8gd29yayBpbmRlcGVuZGVudCBvZiBoYVAxNlYgZHJpdmVyICovCi0JCXUzMiB0bXA7Ci0KIAkJLy9TZXR1cCBTUkNNdWx0aV9JMlMgU2FtcGxpbmdSYXRlCiAJCXRtcCA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgQV9TUERJRl9TQU1QTEVSQVRFLCAwKTsKIAkJdG1wICY9IDB4ZmZmZmYxZmY7CkBAIC0xODEsOCArMjAwLDYgQEAKIAl9CiAJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmNhMDEwOF9jaGlwKSB7IC8qIGF1ZGlneTIgVmFsdWUgKi8KIAkJLyogSGFja3MgZm9yIEFsaWNlMyB0byB3b3JrIGluZGVwZW5kZW50IG9mIGhhUDE2ViBkcml2ZXIgKi8KLQkJdTMyIHRtcDsKLQogCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiQXVkaWd5MiB2YWx1ZTogU3BlY2lhbCBjb25maWcuXG4iKTsKIAkJLy9TZXR1cCBTUkNNdWx0aV9JMlMgU2FtcGxpbmdSYXRlCiAJCXRtcCA9IHNuZF9lbXUxMGsxX3B0cl9yZWFkKGVtdSwgQV9TUERJRl9TQU1QTEVSQVRFLCAwKTsKQEAgLTIxMSw3ICsyMjgsNyBAQAogCQlpbnQgc2l6ZSwgbjsKIAogCQlzaXplID0gQVJSQVlfU0laRShzcGlfZGFjX2luaXQpOwotCQlmb3IgKG49MDsgbiA8IHNpemU7IG4rKykKKwkJZm9yIChuID0gMDsgbiA8IHNpemU7IG4rKykKIAkJCXNuZF9lbXUxMGsxX3NwaV93cml0ZShlbXUsIHNwaV9kYWNfaW5pdFtuXSk7CiAKIAkJc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCAweDYwLCAwLCAweDEwKTsKQEAgLTIyOCw2ICsyNDUsMjMgQEAKIAkJb3V0bCgweDc2LCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsgLyogV2luZG93cyB1c2VzIDB4M2Y3NiAqLwogCiAJfQorCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5pMmNfYWRjKSB7IC8qIEF1ZGlneSAyIFpTIE5vdGVib29rIHdpdGggQURDIFdvbGZzb24gV004Nzc1ICovCisJCWludCBzaXplLCBuOworCisJCXNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgUDE3Vl9JMlNfU1JDX1NFTCwgMCwgMHgyMDIwMjA1Zik7CisJCXRtcCA9IGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwkJb3V0bCh0bXAgfCAweDQsIGVtdS0+cG9ydCArIEFfSU9DRkcpOyAgLyogU2V0IGJpdCAyIGZvciBtaWMgaW5wdXQgKi8KKwkJdG1wID0gaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpOworCQlzaXplID0gQVJSQVlfU0laRShpMmNfYWRjX2luaXQpOworCQlmb3IgKG4gPSAwOyBuIDwgc2l6ZTsgbisrKQorCQkJc25kX2VtdTEwazFfaTJjX3dyaXRlKGVtdSwgaTJjX2FkY19pbml0W25dWzBdLCBpMmNfYWRjX2luaXRbbl1bMV0pOworCQlmb3IgKG49MDsgbiA8IDQ7IG4rKykgeworCQkJZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbbl1bMF09IDB4Y2Y7CisJCQllbXUtPmkyY19jYXB0dXJlX3ZvbHVtZVtuXVsxXT0gMHhjZjsKKwkJfQorCisJfQorCiAJCiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUFRCLCAwLCBlbXUtPnB0Yl9wYWdlcy5hZGRyKTsKIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBUQ0IsIDAsIDApOwkvKiB0YWtlbiBmcm9tIG9yaWdpbmFsIGRyaXZlciAqLwpAQCAtMjM5LDYgKzI3MywxMCBAQAogCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBNQVBCLCBjaCwgc2lsZW50X3BhZ2UpOwogCX0KIAorCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMDEwKSB7CisJCW91dGwoSENGR19BVVRPTVVURV9BU1lOQyB8CisJCQlIQ0ZHX0VNVTMyX1NMQVZFIHwKKwkJCUhDRkdfQVVESU9FTkFCTEUsIGVtdS0+cG9ydCArIEhDRkcpOwogCS8qCiAJICogIEhva2F5LCBzZXR1cCBIQ0ZHCiAJICogICBNdXRlIERpc2FibGUgQXVkaW8gPSAwCkBAIC0yNDYsNyArMjg0LDcgQEAKIAkgKiAgIExvY2sgU291bmQgTWVtb3J5ID0gMAogCSAqICAgQXV0byBNdXRlID0gMQogCSAqLwotCWlmIChlbXUtPmF1ZGlneSkgeworCX0gZWxzZSBpZiAoZW11LT5hdWRpZ3kpIHsKIAkJaWYgKGVtdS0+cmV2aXNpb24gPT0gNCkgLyogYXVkaWd5MiAqLwogCQkJb3V0bChIQ0ZHX0FVRElPRU5BQkxFIHwKIAkJCSAgICAgSENGR19BQzNFTkFCTEVfQ0RTUERJRiB8CkBAIC0yNjUsOCArMzAzLDEwIEBACiAJCW91dGwoSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX0FVVE9NVVRFIHwgSENGR19KT1lFTkFCTEUsIGVtdS0+cG9ydCArIEhDRkcpOwogCiAJaWYgKGVuYWJsZV9pcikgewkvKiBlbmFibGUgSVIgZm9yIFNCIExpdmUgKi8KLQkJaWYgKCBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMjEybSkgewotCQkJOyAgLyogRGlzYWJsZSBhbGwgYWNjZXNzIHRvIEFfSU9DRkcgZm9yIHRoZSBlbXUxMjEybSAqLworCQlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkgeworCQkJOyAgLyogRGlzYWJsZSBhbGwgYWNjZXNzIHRvIEFfSU9DRkcgZm9yIHRoZSBlbXUxMDEwICovCisJCX0gZWxzZSBpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+aTJjX2FkYykgeworCQkJOyAgLyogRGlzYWJsZSBBX0lPQ0ZHIGZvciBBdWRpZ3kgMiBaUyBOb3RlYm9vayAqLwogCQl9IGVsc2UgaWYgKGVtdS0+YXVkaWd5KSB7CiAJCQl1bnNpZ25lZCBpbnQgcmVnID0gaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpOwogCQkJb3V0bChyZWcgfCBBX0lPQ0ZHX0dQT1VUMiwgZW11LT5wb3J0ICsgQV9JT0NGRyk7CkBAIC0yODQsOCArMzI0LDEwIEBACiAgCQl9CiAJfQogCQotCWlmICggZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTIxMm0pIHsKLQkJOyAgLyogRGlzYWJsZSBhbGwgYWNjZXNzIHRvIEFfSU9DRkcgZm9yIHRoZSBlbXUxMjEybSAqLworCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMDEwKSB7CisJCTsgIC8qIERpc2FibGUgYWxsIGFjY2VzcyB0byBBX0lPQ0ZHIGZvciB0aGUgZW11MTAxMCAqLworCX0gZWxzZSBpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+aTJjX2FkYykgeworCQk7ICAvKiBEaXNhYmxlIEFfSU9DRkcgZm9yIEF1ZGlneSAyIFpTIE5vdGVib29rICovCiAJfSBlbHNlIGlmIChlbXUtPmF1ZGlneSkgewkvKiBlbmFibGUgYW5hbG9nIG91dHB1dCAqLwogCQl1bnNpZ25lZCBpbnQgcmVnID0gaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpOwogCQlvdXRsKHJlZyB8IEFfSU9DRkdfR1BPVVQwLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKQEAgLTMwMiw4ICszNDQsMTAgQEAKIAlvdXRsKGlubChlbXUtPnBvcnQgKyBIQ0ZHKSB8IEhDRkdfQVVESU9FTkFCTEUsIGVtdS0+cG9ydCArIEhDRkcpOwogCiAJLyogRW5hYmxlIGFuYWxvZy9kaWdpdGFsIG91dHMgb24gYXVkaWd5ICovCi0JaWYgKCBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMjEybSkgewotCQk7ICAvKiBEaXNhYmxlIGFsbCBhY2Nlc3MgdG8gQV9JT0NGRyBmb3IgdGhlIGVtdTEyMTJtICovCisJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApIHsKKwkJOyAgLyogRGlzYWJsZSBhbGwgYWNjZXNzIHRvIEFfSU9DRkcgZm9yIHRoZSBlbXUxMDEwICovCisJfSBlbHNlIGlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5pMmNfYWRjKSB7CisJCTsgIC8qIERpc2FibGUgQV9JT0NGRyBmb3IgQXVkaWd5IDIgWlMgTm90ZWJvb2sgKi8KIAl9IGVsc2UgaWYgKGVtdS0+YXVkaWd5KSB7CiAJCW91dGwoaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpICYgfjB4NDQsIGVtdS0+cG9ydCArIEFfSU9DRkcpOwogIApAQCAtNTk2LDEzMyArNjQwLDQyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgaW50IHJlZywgaW50IHZhbHVlKQorc3RhdGljIGludCBzbmRfZW11MTAxMF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgY29uc3QgY2hhciAqIGZpbGVuYW1lKQogewotCWlmIChyZWc8MCB8fCByZWc+MHgzZikKLQkJcmV0dXJuIDE7Ci0JcmVnKz0weDQwOyAvKiAweDQwIHVwd2FyZHMgYXJlIHJlZ2lzdGVycy4gKi8KLQlpZiAodmFsdWU8MCB8fCB2YWx1ZT4weDNmKSAvKiAwIHRvIDB4M2YgYXJlIHZhbHVlcyAqLwotCQlyZXR1cm4gMTsKLQlvdXRsKHJlZywgZW11LT5wb3J0ICsgQV9JT0NGRyk7Ci0Jb3V0bChyZWcgfCAweDgwLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsgIC8qIEhpZ2ggYml0IGNsb2NrcyB0aGUgdmFsdWUgaW50byB0aGUgZnBnYS4gKi8KLQlvdXRsKHZhbHVlLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKLQlvdXRsKHZhbHVlIHwgMHg4MCAsIGVtdS0+cG9ydCArIEFfSU9DRkcpOyAgLyogSGlnaCBiaXQgY2xvY2tzIHRoZSB2YWx1ZSBpbnRvIHRoZSBmcGdhLiAqLworCWludCBlcnI7CisJaW50IG4sIGk7CisJaW50IHJlZzsKKwlpbnQgdmFsdWU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeTsKIAorCWlmICgoZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksIGZpbGVuYW1lLCAmZW11LT5wY2ktPmRldikpICE9IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiZmlybXdhcmU6ICVzIG5vdCBmb3VuZC4gRXJyPSVkXG4iLGZpbGVuYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZmlybXdhcmUgc2l6ZT0weCV6eFxuIiwgZndfZW50cnktPnNpemUpOworCWlmIChmd19lbnRyeS0+c2l6ZSAhPSAweDEzM2E0KSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImZpcm13YXJlOiAlcyB3cm9uZyBzaXplLlxuIixmaWxlbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRoZSBGUEdBIGlzIGEgWGlsaW54IFNwYXJ0YW4gSUlFIFhDMlM1MEUgKi8KKwkvKiBHUElPNyAtPiBGUEdBIFBHTU4KKwkgKiBHUElPNiAtPiBGUEdBIENDTEsKKwkgKiBHUElPNSAtPiBGUEdBIERJTgorCSAqIEZQR0EgQ09ORklHIE9GRiAtPiBGUEdBIFBHTU4KKwkgKi8KKwlvdXRsKDB4MDAsIGVtdS0+cG9ydCArIEFfSU9DRkcpOyAvKiBTZXQgUEdNTiBsb3cgZm9yIDF1Uy4gKi8KKwl1ZGVsYXkoMSk7CisJb3V0bCgweDgwLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsgLyogTGVhdmUgYml0IDcgc2V0IGR1cmluZyBuZXRsaXN0IHNldHVwLiAqLworCXVkZWxheSgxMDApOyAvKiBBbGxvdyBGUEdBIG1lbW9yeSB0byBjbGVhbiAqLworCWZvcihuID0gMDsgbiA8IGZ3X2VudHJ5LT5zaXplOyBuKyspIHsKKwkJdmFsdWU9ZndfZW50cnktPmRhdGFbbl07CQorCQlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXJlZyA9IDB4ODA7CisJCQlpZiAodmFsdWUgJiAweDEpCisJCQkJcmVnID0gcmVnIHwgMHgyMDsKKwkJCXZhbHVlID0gdmFsdWUgPj4gMTsgICAKKwkJCW91dGwocmVnLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwkJCW91dGwocmVnIHwgMHg0MCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCX0KKwl9CisJLyogQWZ0ZXIgcHJvZ3JhbW1pbmcsIHNldCBHUElPIGJpdCA0IGhpZ2ggYWdhaW4uICovCisJb3V0bCgweDEwLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwkKKworICAgICAgICByZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzbmRfZW11MTIxMm1fZnBnYV9yZWFkKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgaW50IHJlZywgaW50ICp2YWx1ZSkKLXsKLQlpZiAocmVnPDAgfHwgcmVnPjB4M2YpCi0JCXJldHVybiAxOwotCXJlZys9MHg0MDsgLyogMHg0MCB1cHdhcmRzIGFyZSByZWdpc3RlcnMuICovCi0Jb3V0bChyZWcsIGVtdS0+cG9ydCArIEFfSU9DRkcpOwotCW91dGwocmVnIHwgMHg4MCwgZW11LT5wb3J0ICsgQV9JT0NGRyk7ICAvKiBIaWdoIGJpdCBjbG9ja3MgdGhlIHZhbHVlIGludG8gdGhlIGZwZ2EuICovCi0JKnZhbHVlID0gaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIGludCByZWcsIGludCB2YWx1ZSkKLXsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MDAsICgocmVnID4+IDgpICYgMHgzZikgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MDEsIChyZWcgJiAweDNmKSApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwMiwgKCh2YWx1ZSA+PiA4KSAmIDB4M2YpICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDAzLCAodmFsdWUgJiAweDNmKSApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2VtdTEwazFfZW11MTIxMm1faW5pdChzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUpCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX2VtdTEwMTBfaW5pdChzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUpCiB7CiAJdW5zaWduZWQgaW50IGk7Ci0JaW50IHRtcDsKKwlpbnQgdG1wLHRtcDI7CisJaW50IHJlZzsKKwlpbnQgZXJyOworCWNvbnN0IGNoYXIgKmhhbmFfZmlsZW5hbWUgPSAiZW11L2hhbmEuZnciOworCWNvbnN0IGNoYXIgKmRvY2tfZmlsZW5hbWUgPSAiZW11L2F1ZGlvX2RvY2suZnciOwogCi0Jc25kX3ByaW50ayhLRVJOX0VSUiAiZW11MTIxMm06IFNwZWNpYWwgY29uZmlnLlxuIik7CisJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IFNwZWNpYWwgY29uZmlnLlxuIik7CisJLyogQUM5NyAyLjEsIEFueSAxNk1lZyBvZiA0R2lnIGFkZHJlc3MsIEF1dG8tTXV0ZSwgRU1VMzIgU2xhdmUsCisJICogTG9jayBTb3VuZCBNZW1vcnkgQ2FjaGUsIExvY2sgVGFuayBNZW1vcnkgQ2FjaGUsCisJICogTXV0ZSBhbGwgY29kZWNzLgorCSAqLwogCW91dGwoMHgwMDA1YTAwYywgZW11LT5wb3J0ICsgSENGRyk7Ci0Jb3V0bCgweDAwMDVhMDA0LCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKwkvKiBBQzk3IDIuMSwgQW55IDE2TWVnIG9mIDRHaWcgYWRkcmVzcywgQXV0by1NdXRlLCBFTVUzMiBTbGF2ZSwKKwkgKiBMb2NrIFRhbmsgTWVtb3J5IENhY2hlLAorCSAqIE11dGUgYWxsIGNvZGVjcy4KKwkgKi8KKwlvdXRsKDB4MDAwNWEwMDQsIGVtdS0+cG9ydCArIEhDRkcpOyAKKwkvKiBBQzk3IDIuMSwgQW55IDE2TWVnIG9mIDRHaWcgYWRkcmVzcywgQXV0by1NdXRlLCBFTVUzMiBTbGF2ZSwKKwkgKiBNdXRlIGFsbCBjb2RlY3MuCisJICovCiAJb3V0bCgweDAwMDVhMDAwLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKKwkvKiBBQzk3IDIuMSwgQW55IDE2TWVnIG9mIDRHaWcgYWRkcmVzcywgQXV0by1NdXRlLCBFTVUzMiBTbGF2ZSwKKwkgKiBNdXRlIGFsbCBjb2RlY3MuCisJICovCiAJb3V0bCgweDAwMDVhMDAwLCBlbXUtPnBvcnQgKyBIQ0ZHKTsKIAotCXNuZF9lbXUxMjEybV9mcGdhX3JlYWQoZW11LCAweDIyLCAmdG1wICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfcmVhZChlbXUsIDB4MjMsICZ0bXAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9yZWFkKGVtdSwgMHgyNCwgJnRtcCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwNCwgMHgwMSApOwotCXNuZF9lbXUxMjEybV9mcGdhX3JlYWQoZW11LCAweDBiLCAmdG1wICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDBiLCAweDAxICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfcmVhZChlbXUsIDB4MTAsICZ0bXAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MTAsIDB4MDAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9yZWFkKGVtdSwgMHgxMSwgJnRtcCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgxMSwgMHgzMCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3JlYWQoZW11LCAweDEzLCAmdG1wICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDEzLCAweDBmICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfcmVhZChlbXUsIDB4MTEsICZ0bXAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MTEsIDB4MzAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9yZWFkKGVtdSwgMHgwYSwgJnRtcCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwYSwgMHgxMCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwYywgMHgxOSApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgxMiwgMHgwYyApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwOSwgMHgwZiApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwNiwgMHgwMCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwNSwgMHgwMCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3dyaXRlKGVtdSwgMHgwZSwgMHgxMiApOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMDAsIDB4MDIwMCk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDAwMSwgMHgwMjAxKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDAyLCAweDA1MDApOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMDMsIDB4MDUwMSk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDAwNCwgMHgwNDAwKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDA1LCAweDA0MDEpOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMDYsIDB4MDQwMik7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDAwNywgMHgwNDAzKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDA4LCAweDA0MDQpOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMDksIDB4MDQwNSk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDAwYSwgMHgwNDA2KTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDBiLCAweDA0MDcpOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMGMsIDB4MDEwMCk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDAwZCwgMHgwMTA0KTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMDBlLCAweDAyMDApOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAwMGYsIDB4MDIwMSk7Ci0JZm9yIChpPTA7aSA8IDB4MjA7aSsrKSB7Ci0JCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAxMDAraSwgMHgwMDAwKTsKLQl9Ci0JZm9yIChpPTA7aSA8IDQ7aSsrKSB7Ci0JCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAyMDAraSwgMHgwMDAwKTsKLQl9Ci0JZm9yIChpPTA7aSA8IDc7aSsrKSB7Ci0JCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAzMDAraSwgMHgwMDAwKTsKLQl9Ci0JZm9yIChpPTA7aSA8IDc7aSsrKSB7Ci0JCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDA0MDAraSwgMHgwMDAwKTsKLQl9Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDUwMCwgMHgwMTA4KTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwNTAxLCAweDAxMGMpOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDA2MDAsIDB4MDExMCk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDYwMSwgMHgwMTE0KTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwNzAwLCAweDAxMTgpOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDA3MDEsIDB4MDExYyk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDA3LCAweDAxICk7CisJLyogRGlzYWJsZSA0OFZvbHQgcG93ZXIgdG8gQXVkaW8gRG9jayAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCAgRU1VX0hBTkFfRE9DS19QV1IsICAwICk7CiAKLQlzbmRfZW11MTIxMm1fZnBnYV9yZWFkKGVtdSwgMHgyMSwgJnRtcCApOworCS8qIElELCBzaG91bGQgcmVhZCAmIDB4N2YgPSAweDU1LiAoQml0IDcgaXMgdGhlIElSUSBiaXQpICovCisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfSUQsICZyZWcgKTsKKwlzbmRfcHJpbnRkZCgicmVnMT0weCV4XG4iLHJlZyk7CisJaWYgKHJlZyA9PSAweDU1KSB7CisJCS8qIEZQR0EgbmV0bGlzdCBhbHJlYWR5IHByZXNlbnQgc28gY2xlYXIgaXQgKi8KKwkJLyogUmV0dXJuIHRvIHByb2dyYW1taW5nIG1vZGUgKi8KIAotCW91dGwoMHgwMDAwYTAwMCwgZW11LT5wb3J0ICsgSENGRyk7CisJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCAgRU1VX0hBTkFfRlBHQV9DT05GSUcsIDB4MDIgKTsKKwl9CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfSUQsICZyZWcgKTsKKwlzbmRfcHJpbnRkZCgicmVnMj0weCV4XG4iLHJlZyk7CisJaWYgKHJlZyA9PSAweDU1KSB7CisJCS8qIEZQR0EgZmFpbGVkIHRvIHJldHVybiB0byBwcm9ncmFtbWluZyBtb2RlICovCisJCXJldHVybiAtRU5PREVWOworCX0KKwlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogRU1VX0hBTkFfSUQ9MHgleFxuIixyZWcpOworCWlmICgoZXJyID0gc25kX2VtdTEwMTBfbG9hZF9maXJtd2FyZShlbXUsIGhhbmFfZmlsZW5hbWUpKSAhPSAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEhhbmEgRmlybXdhcmUgZmlsZSAlcyBmYWlsZWRcbiIsIGhhbmFfZmlsZW5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIElELCBzaG91bGQgcmVhZCAmIDB4N2YgPSAweDU1IHdoZW4gRlBHQSBwcm9ncmFtbWVkLiAqLworCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0lELCAmcmVnICk7CisJaWYgKHJlZyAhPSAweDU1KSB7CisJCS8qIEZQR0EgZmFpbGVkIHRvIGJlIHByb2dyYW1tZWQgKi8KKwkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IExvYWRpbmcgSGFuYSBGaXJtd2FyZSBmaWxlIGZhaWxlZCwgcmVnPTB4JXhcbiIsIHJlZyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBIYW5hIEZpcm13YXJlIGxvYWRlZFxuIik7CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfTUFKT1JfUkVWLCAmdG1wICk7CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfTUlOT1JfUkVWLCAmdG1wMiApOworCXNuZF9wcmludGsoIkhhbmEgdmVyOiVkLiVkXG4iLHRtcCAsdG1wMik7CisJLyogRW5hYmxlIDQ4Vm9sdCBwb3dlciB0byBBdWRpbyBEb2NrICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsICBFTVVfSEFOQV9ET0NLX1BXUiwgIEVNVV9IQU5BX0RPQ0tfUFdSX09OICk7CisKKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9PUFRJT05fQ0FSRFMsICZyZWcgKTsKKwlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogQ2FyZCBvcHRpb25zPTB4JXhcbiIscmVnKTsKKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9PUFRJT05fQ0FSRFMsICZyZWcgKTsKKwlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogQ2FyZCBvcHRpb25zPTB4JXhcbiIscmVnKTsKKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9PUFRJQ0FMX1RZUEUsICZ0bXAgKTsgCisJLyogQURBVCBpbnB1dC4gKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfT1BUSUNBTF9UWVBFLCAweDAxICk7CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfQURDX1BBRFMsICZ0bXAgKTsKKwkvKiBTZXQgbm8gYXR0ZW51YXRpb24gb24gQXVkaW8gRG9jayBwYWRzLiAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9BRENfUEFEUywgMHgwMCApOworCWVtdS0+ZW11MTAxMC5hZGNfcGFkcyA9IDB4MDA7CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfRE9DS19NSVNDLCAmdG1wICk7CisJLyogVW5tdXRlIEF1ZGlvIGRvY2sgREFDcywgSGVhZHBob25lIHNvdXJjZSBEQUMtNC4gKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfRE9DS19NSVNDLCAweDMwICk7CisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0RPQ0tfTEVEU18yLCAweDEyICk7CisJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfREFDX1BBRFMsICZ0bXAgKTsKKwkvKiBEQUMgUEFEcy4gKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfREFDX1BBRFMsIDB4MGYgKTsKKwllbXUtPmVtdTEwMTAuZGFjX3BhZHMgPSAweDBmOworCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX0RPQ0tfTUlTQywgJnRtcCApOworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ET0NLX01JU0MsIDB4MzAgKTsKKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9TUERJRl9NT0RFLCAmdG1wICk7CisJLyogU1BESUYgRm9ybWF0LiBTZXQgQ29uc3VtZXIgbW9kZSwgMjRiaXQsIGNvcHkgZW5hYmxlICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1NQRElGX01PREUsIDB4MTAgKTsKKwkvKiBNSURJIHJvdXRpbmcgKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfTUlESV9JTiwgMHgxOSApOworCS8qIFVua25vd24uICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX01JRElfT1VULCAweDBjICk7CisJLyogc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIDB4MDksIDB4MGYgKTsgLy8gSVJRIEVuYWJsZTogQWxsIG9uICovCisJLyogSVJRIEVuYWJsZTogQWxsIG9mZiAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9JUlFfRU5BQkxFLCAweDAwICk7CisKKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9PUFRJT05fQ0FSRFMsICZyZWcgKTsKKwlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogQ2FyZCBvcHRpb25zMz0weCV4XG4iLHJlZyk7CisJLyogRGVmYXVsdCBXQ0xLIHNldCB0byA0OGtIei4gKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfREVGQ0xPQ0ssIDB4MDAgKTsKKwkvKiBXb3JkIENsb2NrIHNvdXJjZSwgSW50ZXJuYWwgNDhrSHogeDEgKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfV0NMT0NLLCBFTVVfSEFOQV9XQ0xPQ0tfSU5UXzQ4SyApOworCS8vc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1dDTE9DSywgRU1VX0hBTkFfV0NMT0NLX0lOVF80OEsgfCBFTVVfSEFOQV9XQ0xPQ0tfNFggKTsKKwkvKiBBdWRpbyBEb2NrIExFRHMuICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX0RPQ0tfTEVEU18yLCAweDEyICk7CisKKyNpZiAwCisJLyogRm9yIDk2a0h6ICovCisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl8wLCBFTVVfU1JDX0hBTU9BX0FEQ19MRUZUMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl8xLCBFTVVfU1JDX0hBTU9BX0FEQ19SSUdIVDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfNCwgRU1VX1NSQ19IQU1PQV9BRENfTEVGVDIpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfNSwgRU1VX1NSQ19IQU1PQV9BRENfUklHSFQyKTsKKyNlbmRpZgorI2lmIDAKKwkvKiBGb3IgMTkya0h6ICovCisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl8wLCBFTVVfU1JDX0hBTU9BX0FEQ19MRUZUMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl8xLCBFTVVfU1JDX0hBTU9BX0FEQ19SSUdIVDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfMiwgRU1VX1NSQ19IQU1PQV9BRENfTEVGVDIpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfMywgRU1VX1NSQ19IQU1PQV9BRENfUklHSFQyKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzQsIEVNVV9TUkNfSEFNT0FfQURDX0xFRlQzKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzUsIEVNVV9TUkNfSEFNT0FfQURDX1JJR0hUMyk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl82LCBFTVVfU1JDX0hBTU9BX0FEQ19MRUZUNCk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl83LCBFTVVfU1JDX0hBTU9BX0FEQ19SSUdIVDQpOworI2VuZGlmCisjaWYgMQorCS8qIEZvciA0OGtIeiAqLworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfMCwgRU1VX1NSQ19ET0NLX01JQ19BMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl8xLCBFTVVfU1JDX0RPQ0tfTUlDX0IxKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzIsIEVNVV9TUkNfSEFNT0FfQURDX0xFRlQyKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzMsIEVNVV9TUkNfSEFNT0FfQURDX0xFRlQyKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzQsIEVNVV9TUkNfRE9DS19BREMxX0xFRlQxKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzUsIEVNVV9TUkNfRE9DS19BREMxX1JJR0hUMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl82LCBFTVVfU1JDX0RPQ0tfQURDMl9MRUZUMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl83LCBFTVVfU1JDX0RPQ0tfQURDMl9SSUdIVDEpOworI2VuZGlmCisjaWYgMAorCS8qIE9yaWdpbmFsICovCisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl80LCBFTVVfU1JDX0hBTkFfQURBVCk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl81LCBFTVVfU1JDX0hBTkFfQURBVCArIDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfNiwgRU1VX1NSQ19IQU5BX0FEQVQgKyAyKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzcsIEVNVV9TUkNfSEFOQV9BREFUICsgMyk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl84LCBFTVVfU1JDX0hBTkFfQURBVCArIDQpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfOSwgRU1VX1NSQ19IQU5BX0FEQVQgKyA1KTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyX0EsIEVNVV9TUkNfSEFOQV9BREFUICsgNik7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl9CLCBFTVVfU1JDX0hBTkFfQURBVCArIDcpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRTJfRU1VMzJfQywgRU1VX1NSQ19ET0NLX01JQ19BMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFMl9FTVUzMl9ELCBFTVVfU1JDX0RPQ0tfTUlDX0IxKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyX0UsIEVNVV9TUkNfSEFNT0FfQURDX0xFRlQyKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0UyX0VNVTMyX0YsIEVNVV9TUkNfSEFNT0FfQURDX0xFRlQyKTsKKyNlbmRpZgorCWZvciAoaSA9IDA7aSA8IDB4MjA7IGkrKyApIHsKKwkJLyogQXVkaW9Eb2NrIEVsaW5rIDwtICBTaWxlbmNlICovCisJCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwgMHgwMTAwK2ksIEVNVV9TUkNfU0lMRU5DRSk7CisJfQorCWZvciAoaSA9IDA7aSA8IDQ7IGkrKykgeworCQkvKiBIYW5hIFNQRElGIE91dCA8LSBTaWxlbmNlICovCisJCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwgMHgwMjAwK2ksIEVNVV9TUkNfU0lMRU5DRSk7CisJfQorCWZvciAoaSA9IDA7aSA8IDc7IGkrKykgeworCQkvKiBIYW1vYSBEQUMgPC0gU2lsZW5jZSAqLworCQlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsIDB4MDMwMCtpLCBFTVVfU1JDX1NJTEVOQ0UpOworCX0KKwlmb3IgKGkgPSAwO2kgPCA3OyBpKyspIHsKKwkJLyogSGFuYSBBREFUIE91dCA8LSBTaWxlbmNlICovCisJCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwgRU1VX0RTVF9IQU5BX0FEQVQgKyBpLCBFTVVfU1JDX1NJTEVOQ0UpOworCX0KKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0VfSTJTMF9MRUZULCBFTVVfU1JDX0RPQ0tfQURDMV9MRUZUMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFX0kyUzBfUklHSFQsIEVNVV9TUkNfRE9DS19BREMxX1JJR0hUMSk7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0FMSUNFX0kyUzFfTEVGVCwgRU1VX1NSQ19ET0NLX0FEQzJfTEVGVDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRV9JMlMxX1JJR0hULCBFTVVfU1JDX0RPQ0tfQURDMl9SSUdIVDEpOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9BTElDRV9JMlMyX0xFRlQsIEVNVV9TUkNfRE9DS19BREMzX0xFRlQxKTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfQUxJQ0VfSTJTMl9SSUdIVCwgRU1VX1NSQ19ET0NLX0FEQzNfUklHSFQxKTsKKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfVU5NVVRFLCAweDAxICk7IC8vIFVubXV0ZSBhbGwKKworCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIEVNVV9IQU5BX09QVElPTl9DQVJEUywgJnRtcCApOworCQorCS8qIEFDOTcgMS4wMywgQW55IDMyTWVnIG9mIDJHaWcgYWRkcmVzcywgQXV0by1NdXRlLCBFTVUzMiBTbGF2ZSwKKwkgKiBMb2NrIFNvdW5kIE1lbW9yeSBDYWNoZSwgTG9jayBUYW5rIE1lbW9yeSBDYWNoZSwKKwkgKiBNdXRlIGFsbCBjb2RlY3MuCisJICovCisJb3V0bCgweDAwMDBhMDAwLCBlbXUtPnBvcnQgKyBIQ0ZHKTsgCisJLyogQUM5NyAxLjAzLCBBbnkgMzJNZWcgb2YgMkdpZyBhZGRyZXNzLCBBdXRvLU11dGUsIEVNVTMyIFNsYXZlLAorCSAqIExvY2sgU291bmQgTWVtb3J5IENhY2hlLCBMb2NrIFRhbmsgTWVtb3J5IENhY2hlLAorCSAqIFVuLU11dGUgYWxsIGNvZGVjcy4KKwkgKi8KIAlvdXRsKDB4MDAwMGEwMDEsIGVtdS0+cG9ydCArIEhDRkcpOworIAogCS8qIEluaXRpYWwgYm9vdCBjb21wbGV0ZS4gTm93IHBhdGNoZXMgKi8KIAotCXNuZF9lbXUxMjEybV9mcGdhX3JlYWQoZW11LCAweDIxLCAmdG1wICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDBjLCAweDE5ICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDEyLCAweDBjICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDBjLCAweDE5ICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2Ffd3JpdGUoZW11LCAweDEyLCAweDBjICk7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfcmVhZChlbXUsIDB4MGEsICZ0bXAgKTsKLQlzbmRfZW11MTIxMm1fZnBnYV93cml0ZShlbXUsIDB4MGEsIDB4MTAgKTsKKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9PUFRJT05fQ0FSRFMsICZ0bXAgKTsKKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfTUlESV9JTiwgMHgxOSApOyAvKiBNSURJIFJvdXRlICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX01JRElfT1VULCAweDBjICk7IC8qIFVua25vd24gKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfTUlESV9JTiwgMHgxOSApOyAvKiBNSURJIFJvdXRlICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX01JRElfT1VULCAweDBjICk7IC8qIFVua25vd24gKi8KKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9TUERJRl9NT0RFLCAmdG1wICk7IAorCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9TUERJRl9NT0RFLCAweDEwICk7IC8qIFNQRElGIEZvcm1hdCBzcGRpZiAgKG9yIDB4MTEgZm9yIGFlcy9lYnUpICovCiAKLQlzbmRfZW11MTIxMm1fZnBnYV9yZWFkKGVtdSwgMHgyMCwgJnRtcCApOwotCXNuZF9lbXUxMjEybV9mcGdhX3JlYWQoZW11LCAweDIxLCAmdG1wICk7CisJLyogRGVsYXkgdG8gYWxsb3cgQXVkaW8gRG9jayB0byBzZXR0bGUgKi8KKwltc2xlZXAoMTAwKTsKKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9JUlFfU1RBVFVTLCAmdG1wICk7IC8qIElSUSBTdGF0dXMgKi8KKwlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9PUFRJT05fQ0FSRFMsICZyZWcgKTsgLyogT1BUSU9OUzogV2hpY2ggY2FyZHMgYXJlIGF0dGFjaGVkIHRvIHRoZSBFTVUgKi8KKwkvKiBGSVhNRTogVGhlIGxvYWRpbmcgb2YgdGhpcyBzaG91bGQgYmUgYWJsZSB0byBoYXBwZW4gYW55IHRpbWUsCisJICogYXMgdGhlIHVzZXIgY2FuIHBsdWcvdW5wbHVnIGl0IGF0IGFueSB0aW1lCisJICovCisJaWYgKHJlZyAmIChFTVVfSEFOQV9PUFRJT05fRE9DS19PTkxJTkUgfCBFTVVfSEFOQV9PUFRJT05fRE9DS19PRkZMSU5FKSApIHsKKwkJLyogQXVkaW8gRG9jayBhdHRhY2hlZCAqLworCQkvKiBSZXR1cm4gdG8gQXVkaW8gRG9jayBwcm9ncmFtbWluZyBtb2RlICovCisJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEF1ZGlvIERvY2sgRmlybXdhcmVcbiIpOworCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgIEVNVV9IQU5BX0ZQR0FfQ09ORklHLCBFTVVfSEFOQV9GUEdBX0NPTkZJR19BVURJT0RPQ0sgKTsKKwkJaWYgKChlcnIgPSBzbmRfZW11MTAxMF9sb2FkX2Zpcm13YXJlKGVtdSwgZG9ja19maWxlbmFtZSkpICE9IDApIHsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsICBFTVVfSEFOQV9GUEdBX0NPTkZJRywgMCApOworCQlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfSEFOQV9JUlFfU1RBVFVTLCAmcmVnICk7CisJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBFTVVfSEFOQStET0NLX0lSUV9TVEFUVVM9MHgleFxuIixyZWcpOworCQkvKiBJRCwgc2hvdWxkIHJlYWQgJiAweDdmID0gMHg1NSB3aGVuIEZQR0EgcHJvZ3JhbW1lZC4gKi8KKwkJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0hBTkFfSUQsICZyZWcgKTsKKwkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IEVNVV9IQU5BK0RPQ0tfSUQ9MHgleFxuIixyZWcpOworCQlpZiAocmVnICE9IDB4NTUpIHsKKwkJCS8qIEZQR0EgZmFpbGVkIHRvIGJlIHByb2dyYW1tZWQgKi8KKwkJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEF1ZGlvIERvY2sgRmlybXdhcmUgZmlsZSBmYWlsZWQsIHJlZz0weCV4XG4iLCByZWcpOworCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogQXVkaW8gRG9jayBGaXJtd2FyZSBsb2FkZWRcbiIpOworCQlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBFTVVfRE9DS19NQUpPUl9SRVYsICZ0bXAgKTsKKwkJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgRU1VX0RPQ0tfTUlOT1JfUkVWLCAmdG1wMiApOworCQlzbmRfcHJpbnRrKCJBdWRpbyBEb2NrIHZlcjolZC4lZFxuIix0bXAgLHRtcDIpOworCX0KKyNpZiAwCisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0hBTU9BX0RBQ19MRUZUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkIgKyAyKTsgLyogQUxJQ0UyIGJ1cyAweGEyICovCisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0hBTU9BX0RBQ19SSUdIVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJCICsgMyk7IC8qIEFMSUNFMiBidXMgMHhhMyAqLworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU5BX1NQRElGX0xFRlQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDIpOyAvKiBBTElDRTIgYnVzIDB4YjIgKi8KKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9TUERJRl9SSUdIVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMyk7IC8qIEFMSUNFMiBidXMgMHhiMyAqLworI2VuZGlmCisJLyogRGVmYXVsdCBvdXRwdXRzICovCisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0RPQ0tfREFDMV9MRUZUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAwKTsgLyogQUxJQ0UyIGJ1cyAweGEwICovCisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbMF0gPSAyMTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfRE9DS19EQUMxX1JJR0hUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAxKTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsxXSA9IDIyOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9ET0NLX0RBQzJfTEVGVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMik7CisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbMl0gPSAyMzsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfRE9DS19EQUMyX1JJR0hUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAzKTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVszXSA9IDI0OworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9ET0NLX0RBQzNfTEVGVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgNCk7CisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbNF0gPSAyNTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfRE9DS19EQUMzX1JJR0hUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyA1KTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVs1XSA9IDI2OworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9ET0NLX0RBQzRfTEVGVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgNik7CisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbNl0gPSAyNzsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfRE9DS19EQUM0X1JJR0hUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyA3KTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVs3XSA9IDI4OworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9ET0NLX1BIT05FU19MRUZUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAwKTsgLyogQUxJQ0UyIGJ1cyAweGEwICovCisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbOF0gPSAyMTsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfRE9DS19QSE9ORVNfUklHSFQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDEpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzldID0gMjI7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0RPQ0tfU1BESUZfTEVGVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMCk7IC8qIEFMSUNFMiBidXMgMHhhMCAqLworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzEwXSA9IDIxOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9ET0NLX1NQRElGX1JJR0hUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAxKTsKKwllbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVsxMV0gPSAyMjsKKwlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCUVNVV9EU1RfSEFOQV9TUERJRl9MRUZUMSwgRU1VX1NSQ19BTElDRV9FTVUzMkEgKyAwKTsgLyogQUxJQ0UyIGJ1cyAweGEwICovCisJZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbMTJdID0gMjE7CisJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQlFTVVfRFNUX0hBTkFfU1BESUZfUklHSFQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDEpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzEzXSA9IDIyOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU1PQV9EQUNfTEVGVDEsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMCk7IC8qIEFMSUNFMiBidXMgMHhhMCAqLworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzE0XSA9IDIxOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU1PQV9EQUNfUklHSFQxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDEpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzE1XSA9IDIyOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU5BX0FEQVQsIEVNVV9TUkNfQUxJQ0VfRU1VMzJBICsgMCk7IC8qIEFMSUNFMiBidXMgMHhhMCAqLworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzE2XSA9IDIxOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU5BX0FEQVQgKyAxLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDEpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzE3XSA9IDIyOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU5BX0FEQVQgKyAyLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDIpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzE4XSA9IDIzOworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU5BX0FEQVQgKyAzLCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDMpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzE5XSA9IDI0OworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU5BX0FEQVQgKyA0LCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDQpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzIwXSA9IDI1OworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU5BX0FEQVQgKyA1LCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDUpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzIxXSA9IDI2OworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU5BX0FEQVQgKyA2LCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDYpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzIyXSA9IDI3OworCXNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKGVtdSwKKwkJRU1VX0RTVF9IQU5BX0FEQVQgKyA3LCBFTVVfU1JDX0FMSUNFX0VNVTMyQSArIDcpOworCWVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlWzIzXSA9IDI4OwogCi0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDMwMCwgMHgwMzEyKTsKLQlzbmRfZW11MTIxMm1fZnBnYV9uZXRsaXN0X3dyaXRlKGVtdSwgMHgwMzAxLCAweDAzMTMpOwotCXNuZF9lbXUxMjEybV9mcGdhX25ldGxpc3Rfd3JpdGUoZW11LCAweDAyMDAsIDB4MDMwMik7Ci0Jc25kX2VtdTEyMTJtX2ZwZ2FfbmV0bGlzdF93cml0ZShlbXUsIDB4MDIwMSwgMHgwMzAzKTsKKwkvKiBURU1QOiBTZWxlY3QgU1BESUYgaW4vb3V0ICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX09QVElDQUxfVFlQRSwgMHgwKTsgLyogT3V0cHV0IHNwZGlmICovCisKKwkvKiBURU1QOiBTZWxlY3QgNDhrSHogU1BESUYgb3V0ICovCisJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1VOTVVURSwgMHgwKTsgLyogTXV0ZSBhbGwgKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfREVGQ0xPQ0ssIDB4MCk7IC8qIERlZmF1bHQgZmFsbGJhY2sgY2xvY2sgNDhrSHogKi8KKwkvKiBXb3JkIENsb2NrIHNvdXJjZSwgSW50ZXJuYWwgNDhrSHogeDEgKi8KKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfV0NMT0NLLCBFTVVfSEFOQV9XQ0xPQ0tfSU5UXzQ4SyApOworCS8vc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1dDTE9DSywgRU1VX0hBTkFfV0NMT0NLX0lOVF80OEsgfCBFTVVfSEFOQV9XQ0xPQ0tfNFggKTsKKwllbXUtPmVtdTEwMTAuaW50ZXJuYWxfY2xvY2sgPSAxOyAvKiA0ODAwMCAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ET0NLX0xFRFNfMiwgMHgxMik7LyogU2V0IExFRHMgb24gQXVkaW8gRG9jayAqLworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9VTk1VVEUsIDB4MSk7IC8qIFVubXV0ZSBhbGwgKi8KKwkvL3NuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCAweDcsIDB4MCk7IC8qIE11dGUgYWxsICovCisJLy9zbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgMHg3LCAweDEpOyAvKiBVbm11dGUgYWxsICovCisJLy9zbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgMHhlLCAweDEyKTsgLyogU2V0IExFRHMgb24gQXVkaW8gRG9jayAqLwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NDcsNiArMTA4MSwxMCBAQAogCQl9CiAJCXNuZF9lbXUxMGsxX2ZyZWVfZWZ4KGVtdSk7CiAgICAgICAgCX0KKwlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkgeworCQkvKiBEaXNhYmxlIDQ4Vm9sdCBwb3dlciB0byBBdWRpbyBEb2NrICovCisJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCAgRU1VX0hBTkFfRE9DS19QV1IsICAwICk7CisJfQogCWlmIChlbXUtPm1lbWhkcikKIAkJc25kX3V0aWxfbWVtaGRyX2ZyZWUoZW11LT5tZW1oZHIpOwogCWlmIChlbXUtPnNpbGVudF9wYWdlLmFyZWEpCkBAIC04MzgsMTAgKzExNzYsMTEgQEAKIAkgLmFkY18xMzYxdCA9IDEsICAvKiAyNCBiaXQgY2FwdHVyZSBpbnN0ZWFkIG9mIDE2Yml0ICovCiAJIC5hYzk3X2NoaXAgPSAxfSAsCiAJLyogQXVkaWd5IDIgWlMgTm90ZWJvb2sgQ2FyZGJ1cyBjYXJkLiovCi0JLyogVGVzdGVkIGJ5IEphbWVzQHN1cGVyYnVnLmNvLnVrIDIydGggRGVjZW1iZXIgMjAwNSAqLworCS8qIFRlc3RlZCBieSBKYW1lc0BzdXBlcmJ1Zy5jby51ayA2dGggTm92ZW1iZXIgMjAwNiAqLwogCS8qIEF1ZGlvIG91dHB1dCA3LjEvSGVhZHBob25lcyB3b3JraW5nLgogCSAqIERpZ2l0YWwgb3V0cHV0IHdvcmtpbmcuIChBQzMgbm90IGNoZWNrZWQsIG9ubHkgUENNKQotCSAqIEF1ZGlvIGlucHV0cyBub3QgdGVzdGVkLgorCSAqIEF1ZGlvIE1pYy9MaW5lIGlucHV0cyB3b3JraW5nLgorCSAqIERpZ2l0YWwgaW5wdXQgbm90IHRlc3RlZC4KIAkgKi8gCiAJLyogRFNQOiBUaW5hMgogCSAqIERBQzogV29sZnNvbiBXTTg3NjgvV004NTY4CkBAIC04NDksNiArMTE4OCwyNSBAQAogCSAqIEFDOTc6IE5vbmUKIAkgKiBDQTAxNTE6IE5vbmUKIAkgKi8KKwkvKiBUZXN0ZWQgYnkgSmFtZXNAc3VwZXJidWcuY28udWsgNHRoIEFwcmlsIDIwMDYgKi8KKwkvKiBBX0lPQ0ZHIGJpdHMKKwkgKiBPdXRwdXQKKwkgKiAwOiBOb3QgVXNlZAorCSAqIDE6IDAgPSBNdXRlIGFsbCB0aGUgNy4xIGNoYW5uZWwgb3V0LiAxID0gdW5tdXRlLgorCSAqIDI6IEFuYWxvZyBpbnB1dCAwID0gbGluZSBpbiwgMSA9IG1pYyBpbgorCSAqIDM6IE5vdCBVc2VkCisJICogNDogRGlnaXRhbCBvdXRwdXQgMCA9IG9mZiwgMSA9IG9uLgorCSAqIDU6IE5vdCBVc2VkCisJICogNjogTm90IFVzZWQKKwkgKiA3OiBOb3QgVXNlZAorCSAqIElucHV0CisJICogICAgICBBbGwgYml0cyAxICgweDNmeHgpIG1lYW5zIG5vdGhpbmcgcGx1Z2dlZCBpbi4KKwkgKiA4LTk6IDAgPSBMaW5lIGluL01pYywgMiA9IE9wdGljYWwgaW4sIDMgPSBOb3RoaW5nLgorCSAqIEEtQjogMCA9IEhlYWRwaG9uZXMsIDIgPSBPcHRpY2FsIG91dCwgMyA9IE5vdGhpbmcuCisJICogQy1EOiAyID0gRnJvbnQvUmVhci9ldGMsIDMgPSBub3RoaW5nLgorCSAqIEUtRjogQWx3YXlzIDAKKwkgKgorCSAqLwogCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDA4LCAuc3Vic3lzdGVtID0gMHgyMDAxMTEwMiwKIAkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiQXVkaWd5IDIgWlMgTm90ZWJvb2sgW1NCMDUzMF0iLCAKIAkgLmlkID0gIkF1ZGlneTIiLApAQCAtODU2LDYgKzEyMTQsNyBAQAogCSAuY2EwMTA4X2NoaXAgPSAxLAogCSAuY2FfY2FyZGJ1c19jaGlwID0gMSwKIAkgLnNwaV9kYWMgPSAxLAorCSAuaTJjX2FkYyA9IDEsCiAJIC5zcGs3MSA9IDF9ICwKIAl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwOCwgCiAJIC5kcml2ZXIgPSAiQXVkaWd5MiIsIC5uYW1lID0gIkF1ZGlneSAyIFZhbHVlIFtVbmtub3duXSIsIApAQCAtODY1LDExICsxMjI0LDEyIEBACiAJIC5hYzk3X2NoaXAgPSAxfSAsCiAJLyogVGVzdGVkIGJ5IEphbWVzQHN1cGVyYnVnLmNvLnVrIDh0aCBKdWx5IDIwMDUuIE5vIHNvdW5kIGF2YWlsYWJsZSB5ZXQuICovCiAJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDQsIC5zdWJzeXN0ZW0gPSAweDQwMDExMTAyLAotCSAuZHJpdmVyID0gIkF1ZGlneTIiLCAubmFtZSA9ICJFLW11IDEyMTJtIFs0MDAxXSIsIAotCSAuaWQgPSAiRU1VMTIxMm0iLAorCSAuZHJpdmVyID0gIkF1ZGlneTIiLCAubmFtZSA9ICJFLW11IDEwMTAgWzQwMDFdIiwgCisJIC5pZCA9ICJFTVUxMDEwIiwKIAkgLmVtdTEwazJfY2hpcCA9IDEsCiAJIC5jYTAxMDJfY2hpcCA9IDEsCi0JIC5lbXUxMjEybSA9IDF9ICwKKwkgLnNwazcxID0gMSwKKwkgLmVtdTEwMTAgPSAxfSAsCiAJLyogVGVzdGVkIGJ5IEphbWVzQHN1cGVyYnVnLmNvLnVrIDNyZCBKdWx5IDIwMDUgKi8KIAl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwNCwgLnN1YnN5c3RlbSA9IDB4MjAwNzExMDIsCiAJIC5kcml2ZXIgPSAiQXVkaWd5MiIsIC5uYW1lID0gIkF1ZGlneSA0IFBSTyBbU0IwMzgwXSIsIApAQCAtMTI5Nyw4ICsxNjU3LDggQEAKIAl9IGVsc2UgaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmNhX2NhcmRidXNfY2hpcCkgewogCQlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX2NhcmRidXNfaW5pdChlbXUpKSA8IDApCiAJCQlnb3RvIGVycm9yOwotIAl9IGVsc2UgaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEyMTJtKSB7Ci0gCQlpZiAoKGVyciA9IHNuZF9lbXUxMGsxX2VtdTEyMTJtX2luaXQoZW11KSkgPCAwKSB7CisgCX0gZWxzZSBpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkgeworIAkJaWYgKChlcnIgPSBzbmRfZW11MTBrMV9lbXUxMDEwX2luaXQoZW11KSkgPCAwKSB7CiAgCQkJc25kX2VtdTEwazFfZnJlZShlbXUpOwogIAkJCXJldHVybiBlcnI7CiAgCQl9CkBAIC0xNDQ2LDggKzE4MDYsOCBAQAogCQlzbmRfZW11MTBrMV9lY2FyZF9pbml0KGVtdSk7CiAJZWxzZSBpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+Y2FfY2FyZGJ1c19jaGlwKQogCQlzbmRfZW11MTBrMV9jYXJkYnVzX2luaXQoZW11KTsKLQllbHNlIGlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMjEybSkKLSAJCXNuZF9lbXUxMGsxX2VtdTEyMTJtX2luaXQoZW11KTsKKwllbHNlIGlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMDEwKQorIAkJc25kX2VtdTEwazFfZW11MTAxMF9pbml0KGVtdSk7CiAJZWxzZQogCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBQzk3U0xPVCwgMCwgQUM5N1NMT1RfQ05UUnxBQzk3U0xPVF9MRkUpOwogCXNuZF9lbXUxMGsxX2luaXQoZW11LCBlbXUtPmVuYWJsZV9pciwgMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwppbmRleCAyMTk5YjQyLi5iYjBmZWM3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKQEAgLTQ2MCw3ICs0NjAsNyBAQAogCXUzMiBwZXJpb2Rfc2l6ZV9ieXRlcyA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CiAJaW50IGk7CiAJCi0JZm9yKGk9MDsgaSA8IHJ1bnRpbWUtPnBlcmlvZHM7IGkrKykgeworCWZvcihpID0gMDsgaSA8IHJ1bnRpbWUtPnBlcmlvZHM7IGkrKykgewogCQkqdGFibGVfYmFzZSsrPXJ1bnRpbWUtPmRtYV9hZGRyKyhpKnBlcmlvZF9zaXplX2J5dGVzKTsKIAkJKnRhYmxlX2Jhc2UrKz1wZXJpb2Rfc2l6ZV9ieXRlczw8MTY7CiAJfQpAQCAtMTA0Miw4ICsxMDQyLDggQEAKIAkJaWYgKHNzY2FuZihsaW5lLCAiJXggJXggJXgiLCAmcmVnLCAmY2hhbm5lbF9pZCwgJnZhbCkgIT0gMykKIAkJCWNvbnRpbnVlOwogCi0JCWlmICgocmVnIDwgMHg0OSkgJiYgKHJlZyA+PTApICYmICh2YWwgPD0gMHhmZmZmZmZmZikgCi0JCSAgICAmJiAoY2hhbm5lbF9pZCA+PTApICYmIChjaGFubmVsX2lkIDw9IDIpICkKKwkJaWYgKChyZWcgPCAweDQ5KSAmJiAocmVnID49IDApICYmICh2YWwgPD0gMHhmZmZmZmZmZikgCisJCSAgICAmJiAoY2hhbm5lbF9pZCA+PSAwKSAmJiAoY2hhbm5lbF9pZCA8PSAyKSApCiAJCQlzbmRfZW11MTBrMXhfcHRyX3dyaXRlKGVtdSwgcmVnLCBjaGFubmVsX2lkLCB2YWwpOwogCX0KIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVmeC5jCmluZGV4IDEzY2Q2Y2UuLmMwMjAxMmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdWZ4LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11ZnguYwpAQCAtMyw2ICszLDkgQEAKICAqICAgICAgICAgICAgICAgICAgIENyZWF0aXZlIExhYnMsIEluYy4KICAqICBSb3V0aW5lcyBmb3IgZWZmZWN0IHByb2Nlc3NvciBGWDgwMTAKICAqCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYW1lcyBDb3VydGllci1EdXR0b24gPEphbWVzQHN1cGVyYnVnLmNvLnVrPgorICogIAlBZGRlZCBFTVUgMTAxMCBzdXBwb3J0LgorICoKICAqICBCVUdTOgogICogICAgLS0KICAqCkBAIC0yOTMsNyArMjk2LDcgQEAKIH07CiAKIC8qIEVNVTEwazEvRU1VMTBrMiBEU1AgY29udHJvbCBkYiBnYWluICovCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoc25kX2VtdTEwazFfZGJfc2NhbGUxLCAtNDAwMCwgNDAsIDEpOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHNuZF9lbXUxMGsxX2RiX3NjYWxlMSwgLTQwMDAsIDQwLCAxKTsKIAogc3RhdGljIGNvbnN0IHUzMiBvbm9mZl90YWJsZVsyXSA9IHsKIAkweDAwMDAwMDAwLCAweDAwMDAwMDAxCkBAIC02NTIsMTMgKzY1NSw2NiBAQAogCXJldHVybiBOVUxMOwogfQogCisjZGVmaW5lIE1BWF9UTFZfU0laRQkyNTYKKworc3RhdGljIHVuc2lnbmVkIGludCAqY29weV90bHYoY29uc3QgdW5zaWduZWQgaW50IF9fdXNlciAqX3RsdikKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YVsyXTsKKwl1bnNpZ25lZCBpbnQgKnRsdjsKKworCWlmICghX3RsdikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIF90bHYsIHNpemVvZihkYXRhKSkpCisJCXJldHVybiBOVUxMOworCWlmIChkYXRhWzFdID49IE1BWF9UTFZfU0laRSkKKwkJcmV0dXJuIE5VTEw7CisJdGx2ID0ga21hbGxvYyhkYXRhWzFdICogNCArIHNpemVvZihkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0bHYpCisJCXJldHVybiBOVUxMOworCW1lbWNweSh0bHYsIGRhdGEsIHNpemVvZihkYXRhKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKHRsdiArIDIsIF90bHYgKyAyLCBkYXRhWzFdKSkgeworCQlrZnJlZSh0bHYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHRsdjsKK30KKworc3RhdGljIGludCBjb3B5X2djdGwoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsCisJCSAgICAgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciAqZ2N0bCwKKwkJICAgICBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByIF9fdXNlciAqX2djdGwsCisJCSAgICAgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfb2xkX2dwciBfX3VzZXIgKm9jdGw7CisKKwlpZiAoZW11LT5zdXBwb3J0X3RsdikKKwkJcmV0dXJuIGNvcHlfZnJvbV91c2VyKGdjdGwsICZfZ2N0bFtpZHhdLCBzaXplb2YoKmdjdGwpKTsKKwlvY3RsID0gKHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9vbGRfZ3ByIF9fdXNlciAqKV9nY3RsOworCWlmIChjb3B5X2Zyb21fdXNlcihnY3RsLCAmb2N0bFtpZHhdLCBzaXplb2YoKm9jdGwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZ2N0bC0+dGx2ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3B5X2djdGxfdG9fdXNlcihzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwKKwkJICAgICBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByIF9fdXNlciAqX2djdGwsCisJCSAgICAgc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciAqZ2N0bCwKKwkJICAgICBpbnQgaWR4KQoreworCXN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9vbGRfZ3ByIF9fdXNlciAqb2N0bDsKKworCWlmIChlbXUtPnN1cHBvcnRfdGx2KQorCQlyZXR1cm4gY29weV90b191c2VyKCZfZ2N0bFtpZHhdLCBnY3RsLCBzaXplb2YoKmdjdGwpKTsKKwkKKwlvY3RsID0gKHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9vbGRfZ3ByIF9fdXNlciAqKV9nY3RsOworCXJldHVybiBjb3B5X3RvX3VzZXIoJm9jdGxbaWR4XSwgZ2N0bCwgc2l6ZW9mKCpvY3RsKSk7Cit9CisKIHN0YXRpYyBpbnQgc25kX2VtdTEwazFfdmVyaWZ5X2NvbnRyb2xzKHN0cnVjdCBzbmRfZW11MTBrMSAqZW11LAogCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvZGUgKmljb2RlKQogewogCXVuc2lnbmVkIGludCBpOwogCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgX191c2VyICpfaWQ7CiAJc3RydWN0IHNuZF9jdGxfZWxlbV9pZCBpZDsKLQlzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByIF9fdXNlciAqX2djdGw7CiAJc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciAqZ2N0bDsKIAlpbnQgZXJyOwogCQpAQCAtNjczLDkgKzcyOSw4IEBACiAJaWYgKCEgZ2N0bCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJZXJyID0gMDsKLQlmb3IgKGkgPSAwLCBfZ2N0bCA9IGljb2RlLT5ncHJfYWRkX2NvbnRyb2xzOwotCSAgICAgaSA8IGljb2RlLT5ncHJfYWRkX2NvbnRyb2xfY291bnQ7IGkrKywgX2djdGwrKykgewotCQlpZiAoY29weV9mcm9tX3VzZXIoZ2N0bCwgX2djdGwsIHNpemVvZigqZ2N0bCkpKSB7CisJZm9yIChpID0gMDsgaSA8IGljb2RlLT5ncHJfYWRkX2NvbnRyb2xfY291bnQ7IGkrKykgeworCQlpZiAoY29weV9nY3RsKGVtdSwgZ2N0bCwgaWNvZGUtPmdwcl9hZGRfY29udHJvbHMsIGkpKSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJZ290byBfX2Vycm9yOwogCQl9CkBAIC02OTQsMTAgKzc0OSw5IEBACiAJCQlnb3RvIF9fZXJyb3I7CiAJCX0KIAl9Ci0JZm9yIChpID0gMCwgX2djdGwgPSBpY29kZS0+Z3ByX2xpc3RfY29udHJvbHM7Ci0JICAgICBpIDwgaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xfY291bnQ7IGkrKywgX2djdGwrKykgeworCWZvciAoaSA9IDA7IGkgPCBpY29kZS0+Z3ByX2xpc3RfY29udHJvbF9jb3VudDsgaSsrKSB7CiAJICAgICAJLyogRklYTUU6IHdlIG5lZWQgdG8gY2hlY2sgdGhlIFdSSVRFIGFjY2VzcyAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoZ2N0bCwgX2djdGwsIHNpemVvZigqZ2N0bCkpKSB7CisJCWlmIChjb3B5X2djdGwoZW11LCBnY3RsLCBpY29kZS0+Z3ByX2xpc3RfY29udHJvbHMsIGkpKSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJZ290byBfX2Vycm9yOwogCQl9CkBAIC03MTUsMTMgKzc2OSwxNCBAQAogCWtjdGwtPnByaXZhdGVfdmFsdWUgPSAwOwogCWxpc3RfZGVsKCZjdGwtPmxpc3QpOwogCWtmcmVlKGN0bCk7CisJaWYgKGtjdGwtPnRsdi5wKQorCQlrZnJlZShrY3RsLT50bHYucCk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX2VtdTEwazFfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfZW11MTBrMSAqZW11LAogCQkJCSAgICBzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvZGUgKmljb2RlKQogewogCXVuc2lnbmVkIGludCBpLCBqOwotCXN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHIgX191c2VyICpfZ2N0bDsKIAlzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByICpnY3RsOwogCXN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY3RsICpjdGwsICpuY3RsOwogCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGtuZXc7CkBAIC03MzcsOSArNzkyLDggQEAKIAkJZ290byBfX2Vycm9yOwogCX0KIAotCWZvciAoaSA9IDAsIF9nY3RsID0gaWNvZGUtPmdwcl9hZGRfY29udHJvbHM7Ci0JICAgICBpIDwgaWNvZGUtPmdwcl9hZGRfY29udHJvbF9jb3VudDsgaSsrLCBfZ2N0bCsrKSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihnY3RsLCBfZ2N0bCwgc2l6ZW9mKCpnY3RsKSkpIHsKKwlmb3IgKGkgPSAwOyBpIDwgaWNvZGUtPmdwcl9hZGRfY29udHJvbF9jb3VudDsgaSsrKSB7CisJCWlmIChjb3B5X2djdGwoZW11LCBnY3RsLCBpY29kZS0+Z3ByX2FkZF9jb250cm9scywgaSkpIHsKIAkJCWVyciA9IC1FRkFVTFQ7CiAJCQlnb3RvIF9fZXJyb3I7CiAJCX0KQEAgLTc2MCwxMSArODE0LDEwIEBACiAJCWtuZXcuZGV2aWNlID0gZ2N0bC0+aWQuZGV2aWNlOwogCQlrbmV3LnN1YmRldmljZSA9IGdjdGwtPmlkLnN1YmRldmljZTsKIAkJa25ldy5pbmZvID0gc25kX2VtdTEwazFfZ3ByX2N0bF9pbmZvOwotCQlpZiAoZ2N0bC0+dGx2LnApIHsKLQkJCWtuZXcudGx2LnAgPSBnY3RsLT50bHYucDsKKwkJa25ldy50bHYucCA9IGNvcHlfdGx2KGdjdGwtPnRsdik7CisJCWlmIChrbmV3LnRsdi5wKQogCQkJa25ldy5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKIAkJCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQ7Ci0JCX0gCiAJCWtuZXcuZ2V0ID0gc25kX2VtdTEwazFfZ3ByX2N0bF9nZXQ7CiAJCWtuZXcucHV0ID0gc25kX2VtdTEwazFfZ3ByX2N0bF9wdXQ7CiAJCW1lbXNldChuY3RsLCAwLCBzaXplb2YoKm5jdGwpKTsKQEAgLTc4MiwxMiArODM1LDE0IEBACiAJCQljdGwgPSBrbWFsbG9jKHNpemVvZigqY3RsKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoY3RsID09IE5VTEwpIHsKIAkJCQllcnIgPSAtRU5PTUVNOworCQkJCWtmcmVlKGtuZXcudGx2LnApOwogCQkJCWdvdG8gX19lcnJvcjsKIAkJCX0KIAkJCWtuZXcucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKWN0bDsKIAkJCSpjdGwgPSAqbmN0bDsKIAkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoZW11LT5jYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZrbmV3LCBlbXUpKSkgPCAwKSB7CiAJCQkJa2ZyZWUoY3RsKTsKKwkJCQlrZnJlZShrbmV3LnRsdi5wKTsKIAkJCQlnb3RvIF9fZXJyb3I7CiAJCQl9CiAJCQlrY3RsLT5wcml2YXRlX2ZyZWUgPSBzbmRfZW11MTBrMV9jdGxfcHJpdmF0ZV9mcmVlOwpAQCAtODM4LDcgKzg5Myw2IEBACiAJdW5zaWduZWQgaW50IGkgPSAwLCBqOwogCXVuc2lnbmVkIGludCB0b3RhbCA9IDA7CiAJc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwciAqZ2N0bDsKLQlzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByIF9fdXNlciAqX2djdGw7CiAJc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jdGwgKmN0bDsKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkICppZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwpAQCAtODQ3LDExICs5MDEsMTEgQEAKIAlpZiAoISBnY3RsKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCV9nY3RsID0gaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xzOwkKIAlsaXN0X2Zvcl9lYWNoKGxpc3QsICZlbXUtPmZ4ODAxMC5ncHJfY3RsKSB7CiAJCWN0bCA9IGVtdTEwazFfZ3ByX2N0bChsaXN0KTsKIAkJdG90YWwrKzsKLQkJaWYgKF9nY3RsICYmIGkgPCBpY29kZS0+Z3ByX2xpc3RfY29udHJvbF9jb3VudCkgeworCQlpZiAoaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xzICYmCisJCSAgICBpIDwgaWNvZGUtPmdwcl9saXN0X2NvbnRyb2xfY291bnQpIHsKIAkJCW1lbXNldChnY3RsLCAwLCBzaXplb2YoKmdjdGwpKTsKIAkJCWlkID0gJmN0bC0+a2NvbnRyb2wtPmlkOwogCQkJZ2N0bC0+aWQuaWZhY2UgPSBpZC0+aWZhY2U7CkBAIC04NjgsMTEgKzkyMiwxMSBAQAogCQkJZ2N0bC0+bWluID0gY3RsLT5taW47CiAJCQlnY3RsLT5tYXggPSBjdGwtPm1heDsKIAkJCWdjdGwtPnRyYW5zbGF0aW9uID0gY3RsLT50cmFuc2xhdGlvbjsKLQkJCWlmIChjb3B5X3RvX3VzZXIoX2djdGwsIGdjdGwsIHNpemVvZigqZ2N0bCkpKSB7CisJCQlpZiAoY29weV9nY3RsX3RvX3VzZXIoZW11LCBpY29kZS0+Z3ByX2xpc3RfY29udHJvbHMsCisJCQkJCSAgICAgIGdjdGwsIGkpKSB7CiAJCQkJa2ZyZWUoZ2N0bCk7CiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9Ci0JCQlfZ2N0bCsrOwogCQkJaSsrOwogCQl9CiAJfQpAQCAtMTAyMyw3ICsxMDc3LDcgQEAKIAljdGwtPmdwclswXSA9IGdwciArIDA7IGN0bC0+dmFsdWVbMF0gPSBkZWZ2YWw7CiAJY3RsLT5taW4gPSAwOwogCWN0bC0+bWF4ID0gMTAwOwotCWN0bC0+dGx2LnAgPSBzbmRfZW11MTBrMV9kYl9zY2FsZTE7CisJY3RsLT50bHYgPSBzbmRfZW11MTBrMV9kYl9zY2FsZTE7CiAJY3RsLT50cmFuc2xhdGlvbiA9IEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX1RBQkxFMTAwOwkKIH0KIApAQCAtMTAzOCw3ICsxMDkyLDcgQEAKIAljdGwtPmdwclsxXSA9IGdwciArIDE7IGN0bC0+dmFsdWVbMV0gPSBkZWZ2YWw7CiAJY3RsLT5taW4gPSAwOwogCWN0bC0+bWF4ID0gMTAwOwotCWN0bC0+dGx2LnAgPSBzbmRfZW11MTBrMV9kYl9zY2FsZTE7CisJY3RsLT50bHYgPSBzbmRfZW11MTBrMV9kYl9zY2FsZTE7CiAJY3RsLT50cmFuc2xhdGlvbiA9IEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX1RBQkxFMTAwOwogfQogCkBAIC0xMDY5LDYgKzExMjMsMjEgQEAKIAljdGwtPnRyYW5zbGF0aW9uID0gRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fT05PRkY7CiB9CiAKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfYXVkaWd5X2RzcF9jb252ZXJ0XzMyX3RvXzJ4MTYoCisJCQkJc3RydWN0IHNuZF9lbXUxMGsxX2Z4ODAxMF9jb2RlICppY29kZSwKKwkJCQl1MzIgKnB0ciwgaW50IHRtcCwgaW50IGJpdF9zaGlmdGVyMTYsCisJCQkJaW50IHJlZ19pbiwgaW50IHJlZ19vdXQpCit7CisJQV9PUChpY29kZSwgcHRyLCBpQUNDMywgQV9HUFIodG1wICsgMSksIHJlZ19pbiwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDApOworCUFfT1AoaWNvZGUsIHB0ciwgaUFORFhPUiwgQV9HUFIodG1wKSwgQV9HUFIodG1wICsgMSksIEFfR1BSKGJpdF9zaGlmdGVyMTYgLSAxKSwgQV9DXzAwMDAwMDAwKTsKKwlBX09QKGljb2RlLCBwdHIsIGlUU1RORUcsIEFfR1BSKHRtcCArIDIpLCBBX0dQUih0bXApLCBBX0NfODAwMDAwMDAsIEFfR1BSKGJpdF9zaGlmdGVyMTYgLSAyKSk7CisJQV9PUChpY29kZSwgcHRyLCBpQU5EWE9SLCBBX0dQUih0bXAgKyAyKSwgQV9HUFIodG1wICsgMiksIEFfQ184MDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwlBX09QKGljb2RlLCBwdHIsIGlBTkRYT1IsIEFfR1BSKHRtcCksIEFfR1BSKHRtcCksIEFfR1BSKGJpdF9zaGlmdGVyMTYgLSAzKSwgQV9DXzAwMDAwMDAwKTsKKwlBX09QKGljb2RlLCBwdHIsIGlNQUNJTlQwLCBBX0dQUih0bXApLCBBX0NfMDAwMDAwMDAsIEFfR1BSKHRtcCksIEFfQ18wMDAxMDAwMCk7CisJQV9PUChpY29kZSwgcHRyLCBpQU5EWE9SLCByZWdfb3V0LCBBX0dQUih0bXApLCBBX0NfZmZmZmZmZmYsIEFfR1BSKHRtcCArIDIpKTsKKwlBX09QKGljb2RlLCBwdHIsIGlBQ0MzLCByZWdfb3V0ICsgMSwgQV9HUFIodG1wICsgMSksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwlyZXR1cm4gMTsKK30KIAogLyoKICAqIGluaXRpYWwgRFNQIGNvbmZpZ3VyYXRpb24gZm9yIEF1ZGlneQpAQCAtMTA3Nyw2ICsxMTQ2LDcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IF9zbmRfZW11MTBrMV9hdWRpZ3lfaW5pdF9lZngoc3RydWN0IHNuZF9lbXUxMGsxICplbXUpCiB7CiAJaW50IGVyciwgaSwgeiwgZ3ByLCBuY3RsOworCWludCBiaXRfc2hpZnRlcjE2OwogCWNvbnN0IGludCBwbGF5YmFjayA9IDEwOwogCWNvbnN0IGludCBjYXB0dXJlID0gcGxheWJhY2sgKyAoU05EX0VNVTEwSzFfUExBWUJBQ0tfQ0hBTk5FTFMgKiAyKTsgLyogd2UgcmVzZXJ2ZSAxMCB2b2ljZXMgKi8KIAljb25zdCBpbnQgc3RlcmVvX21peCA9IGNhcHR1cmUgKyAyOwpAQCAtMTExNCwxNyArMTE4NCwxNCBAQAogCXB0ciA9IDA7CiAJbmN0bCA9IDA7CiAJZ3ByID0gc3RlcmVvX21peCArIDEwOworCWdwcl9tYXBbZ3ByKytdID0gMHgwMDAwN2ZmZjsKKwlncHJfbWFwW2dwcisrXSA9IDB4MDAwMDgwMDA7CisJZ3ByX21hcFtncHIrK10gPSAweDAwMDBmZmZmOworCWJpdF9zaGlmdGVyMTYgPSBncHI7CiAKIAkvKiBzdG9wIEZYIHByb2Nlc3NvciAqLwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFfREJHLCAwLCAoZW11LT5meDgwMTAuZGJnID0gMCkgfCBBX0RCR19TSU5HTEVfU1RFUCk7CiAKLSNpZiAwCi0JLyogRklYOiBqY2QgdGVzdCAqLwotCWZvciAoeiA9IDA7IHogPCA4MDsgej16KzIpIHsKLQkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfRVhUT1VUKHopLCBBX0ZYQlVTKEZYQlVTX1BDTV9MRUZUX0ZST05UKSwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDApOyAvKiBsZWZ0ICovCi0JCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0VYVE9VVCh6KzEpLCBBX0ZYQlVTKEZYQlVTX1BDTV9SSUdIVF9GUk9OVCksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsgLyogcmlnaHQgKi8KLQl9Ci0jZW5kaWYgLyogamNkIHRlc3QgKi8KICNpZiAxCiAJLyogUENNIGZyb250IFBsYXliYWNrIFZvbHVtZSAoaW5kZXBlbmRlbnQgZnJvbSBzdGVyZW8gbWl4KSAqLwogCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihwbGF5YmFjayksIEFfQ18wMDAwMDAwMCwgQV9HUFIoZ3ByKSwgQV9GWEJVUyhGWEJVU19QQ01fTEVGVF9GUk9OVCkpOwpAQCAtMTE4MiwxMyArMTI0OSwyMCBAQAogCUFfT1AoaWNvZGUsICZwdHIsIGlNQUMwLCBBX0dQUihjYXB0dXJlKzEpLCBBX0dQUihjYXB0dXJlKzEpLCBBX0dQUihncHIrMSksIEFfRlhCVVMoRlhCVVNfTUlESV9SSUdIVCkpOwogCXNuZF9lbXUxMGsxX2luaXRfc3RlcmVvX2NvbnRyb2woJmNvbnRyb2xzW25jdGwrK10sICJTeW50aCBDYXB0dXJlIFZvbHVtZSIsIGdwciwgMCk7CiAJZ3ByICs9IDI7Ci0KKyAgICAgIAogCS8qCiAJICogaW5wdXRzCiAJICovCiAjZGVmaW5lIEFfQUREX1ZPTFVNRV9JTih2YXIsdm9sLGlucHV0KSBcCiBBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9HUFIodmFyKSwgQV9HUFIodmFyKSwgQV9HUFIodm9sKSwgQV9FWFRJTihpbnB1dCkpCiAKKwkvKiBlbXUxMjEyIERTUCAwIGFuZCBEU1AgMSBDYXB0dXJlICovCisJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApIHsKKwkJQV9PUChpY29kZSwgJnB0ciwgaU1BQzAsIEFfR1BSKGNhcHR1cmUrMCksIEFfR1BSKGNhcHR1cmUrMCksIEFfR1BSKGdwciksIEFfUDE2VklOKDB4MCkpOworCQlBX09QKGljb2RlLCAmcHRyLCBpTUFDMCwgQV9HUFIoY2FwdHVyZSsxKSwgQV9HUFIoY2FwdHVyZSsxKSwgQV9HUFIoZ3ByKzEpLCBBX1AxNlZJTigweDEpKTsKKwkJc25kX2VtdTEwazFfaW5pdF9zdGVyZW9fY29udHJvbCgmY29udHJvbHNbbmN0bCsrXSwgIkVNVSBDYXB0dXJlIFZvbHVtZSIsIGdwciwgMCk7CisJCWdwciArPSAyOworCX0KIAkvKiBBQyc5NyBQbGF5YmFjayBWb2x1bWUgLSB1c2VkIG9ubHkgZm9yIG1pYyAocmVuYW1lZCBsYXRlcikgKi8KIAlBX0FERF9WT0xVTUVfSU4oc3RlcmVvX21peCwgZ3ByLCBBX0VYVElOX0FDOTdfTCk7CiAJQV9BRERfVk9MVU1FX0lOKHN0ZXJlb19taXgrMSwgZ3ByKzEsIEFfRVhUSU5fQUM5N19SKTsKQEAgLTE0MjksNiArMTUwMywxMyBAQAogCiAJLyogZGlnaXRhbCBvdXRwdXRzICovCiAJLyogQV9QVVRfU1RFUkVPX09VVFBVVChBX0VYVE9VVF9GUk9OVF9MLCBBX0VYVE9VVF9GUk9OVF9SLCBwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTKTsgKi8KKwlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkgeworCQkvKiBFTVUxMDEwIE91dHB1dHMgZnJvbSBQQ00gRnJvbnQsIFJlYXIsIENlbnRlciwgTEZFLCBTaWRlICovCisJCXNuZF9wcmludGsoIkVNVSBvdXRwdXRzIG9uXG4iKTsKKwkJZm9yICh6ID0gMDsgeiA8IDg7IHorKykgeworCQkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfRU1VMzJPVVRMKHopLCBBX0dQUihwbGF5YmFjayArIFNORF9FTVUxMEsxX1BMQVlCQUNLX0NIQU5ORUxTICsgeiksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwkJfQorCX0KIAogCS8qIElFQzk1OCBPcHRpY2FsIFJhdyBQbGF5YmFjayBTd2l0Y2ggKi8gCiAJZ3ByX21hcFtncHIrK10gPSAwOwpAQCAtMTQ2Niw5ICsxNTQ3LDU3IEBACiAJQV9QVVRfT1VUUFVUKEFfRVhUT1VUX0FEQ19DQVBfUiwgY2FwdHVyZSsxKTsKICNlbmRpZgogCi0JLyogRUZYIGNhcHR1cmUgLSBjYXB0dXJlIHRoZSAxNiBFWFRJTnMgKi8KLQlmb3IgKHogPSAwOyB6IDwgMTY7IHorKykgewotCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9GWEJVUzIoeiksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwLCBBX0VYVElOKHopKTsKKwlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkgeworCQlzbmRfcHJpbnRrKCJFTVUgaW5wdXRzIG9uXG4iKTsKKwkJLyogQ2FwdHVyZSA4IGNoYW5uZWxzIG9mIFMzMl9MRSBzb3VuZCAqLworCQkKKwkJLyogcHJpbnRrKCJlbXVmeC5jOiBncHI9MHgleCwgdG1wPTB4JXhcbiIsZ3ByLCB0bXApOyAqLworCQkvKiBGb3IgdGhlIEVNVTEwMTA6IEhvdyB0byBnZXQgMzJiaXQgdmFsdWVzIGZyb20gdGhlIERTUC4gSGlnaCAxNmJpdHMgaW50byBMLCBsb3cgMTZiaXRzIGludG8gUi4gKi8KKwkJLyogQV9QMTZWSU4oMCkgaXMgZGVsYXllZCBieSBvbmUgc2FtcGxlLAorCQkgKiBzbyBhbGwgb3RoZXIgQV9QMTZWSU4gY2hhbm5lbHMgd2lsbCBuZWVkIHRvIGFsc28gYmUgZGVsYXllZAorCQkgKi8KKwkJLyogTGVmdCBBREMgaW4uIDEgb2YgMiAqLworCQlzbmRfZW11MTBrMV9hdWRpZ3lfZHNwX2NvbnZlcnRfMzJfdG9fMngxNiggaWNvZGUsICZwdHIsIHRtcCwgYml0X3NoaWZ0ZXIxNiwgQV9QMTZWSU4oMHgwKSwgQV9GWEJVUzIoMCkgKTsKKwkJLyogUmlnaHQgQURDIGluIDEgb2YgMiAqLworCQlncHJfbWFwW2dwcisrXSA9IDB4MDAwMDAwMDA7CisJCXNuZF9lbXUxMGsxX2F1ZGlneV9kc3BfY29udmVydF8zMl90b18yeDE2KCBpY29kZSwgJnB0ciwgdG1wLCBiaXRfc2hpZnRlcjE2LCBBX0dQUihncHIgLSAxKSwgQV9GWEJVUzIoMikgKTsKKwkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfR1BSKGdwciAtIDEpLCBBX1AxNlZJTigweDEpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CisJCWdwcl9tYXBbZ3ByKytdID0gMHgwMDAwMDAwMDsKKwkJc25kX2VtdTEwazFfYXVkaWd5X2RzcF9jb252ZXJ0XzMyX3RvXzJ4MTYoIGljb2RlLCAmcHRyLCB0bXAsIGJpdF9zaGlmdGVyMTYsIEFfR1BSKGdwciAtIDEpLCBBX0ZYQlVTMig0KSApOworCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIoZ3ByIC0gMSksIEFfUDE2VklOKDB4MiksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwkJZ3ByX21hcFtncHIrK10gPSAweDAwMDAwMDAwOworCQlzbmRfZW11MTBrMV9hdWRpZ3lfZHNwX2NvbnZlcnRfMzJfdG9fMngxNiggaWNvZGUsICZwdHIsIHRtcCwgYml0X3NoaWZ0ZXIxNiwgQV9HUFIoZ3ByIC0gMSksIEFfRlhCVVMyKDYpICk7CisJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihncHIgLSAxKSwgQV9QMTZWSU4oMHgzKSwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDApOworCQkvKiBGb3IgOTZrSHogbW9kZSAqLworCQkvKiBMZWZ0IEFEQyBpbi4gMiBvZiAyICovCisJCWdwcl9tYXBbZ3ByKytdID0gMHgwMDAwMDAwMDsKKwkJc25kX2VtdTEwazFfYXVkaWd5X2RzcF9jb252ZXJ0XzMyX3RvXzJ4MTYoIGljb2RlLCAmcHRyLCB0bXAsIGJpdF9zaGlmdGVyMTYsIEFfR1BSKGdwciAtIDEpLCBBX0ZYQlVTMigweDgpICk7CisJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihncHIgLSAxKSwgQV9QMTZWSU4oMHg0KSwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDApOworCQkvKiBSaWdodCBBREMgaW4gMiBvZiAyICovCisJCWdwcl9tYXBbZ3ByKytdID0gMHgwMDAwMDAwMDsKKwkJc25kX2VtdTEwazFfYXVkaWd5X2RzcF9jb252ZXJ0XzMyX3RvXzJ4MTYoIGljb2RlLCAmcHRyLCB0bXAsIGJpdF9zaGlmdGVyMTYsIEFfR1BSKGdwciAtIDEpLCBBX0ZYQlVTMigweGEpICk7CisJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0dQUihncHIgLSAxKSwgQV9QMTZWSU4oMHg1KSwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDApOworCQlncHJfbWFwW2dwcisrXSA9IDB4MDAwMDAwMDA7CisJCXNuZF9lbXUxMGsxX2F1ZGlneV9kc3BfY29udmVydF8zMl90b18yeDE2KCBpY29kZSwgJnB0ciwgdG1wLCBiaXRfc2hpZnRlcjE2LCBBX0dQUihncHIgLSAxKSwgQV9GWEJVUzIoMHhjKSApOworCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9HUFIoZ3ByIC0gMSksIEFfUDE2VklOKDB4NiksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwKTsKKwkJZ3ByX21hcFtncHIrK10gPSAweDAwMDAwMDAwOworCQlzbmRfZW11MTBrMV9hdWRpZ3lfZHNwX2NvbnZlcnRfMzJfdG9fMngxNiggaWNvZGUsICZwdHIsIHRtcCwgYml0X3NoaWZ0ZXIxNiwgQV9HUFIoZ3ByIC0gMSksIEFfRlhCVVMyKDB4ZSkgKTsKKwkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfR1BSKGdwciAtIDEpLCBBX1AxNlZJTigweDcpLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CisKKyNpZiAwCisJCWZvciAoeiA9IDQ7IHogPCA4OyB6KyspIHsKKwkJCUFfT1AoaWNvZGUsICZwdHIsIGlBQ0MzLCBBX0ZYQlVTMih6KSwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCk7CisJCX0KKwkJZm9yICh6ID0gMHhjOyB6IDwgMHgxMDsgeisrKSB7CisJCQlBX09QKGljb2RlLCAmcHRyLCBpQUNDMywgQV9GWEJVUzIoeiksIEFfQ18wMDAwMDAwMCwgQV9DXzAwMDAwMDAwLCBBX0NfMDAwMDAwMDApOworCQl9CisjZW5kaWYKKwl9IGVsc2UgeworCQkvKiBFRlggY2FwdHVyZSAtIGNhcHR1cmUgdGhlIDE2IEVYVElOcyAqLworCQkvKiBDYXB0dXJlIDE2IGNoYW5uZWxzIG9mIFMxNl9MRSBzb3VuZCAqLworCQlmb3IgKHogPSAwOyB6IDwgMTY7IHorKykgeworCQkJQV9PUChpY29kZSwgJnB0ciwgaUFDQzMsIEFfRlhCVVMyKHopLCBBX0NfMDAwMDAwMDAsIEFfQ18wMDAwMDAwMCwgQV9FWFRJTih6KSk7CisJCX0KIAl9CiAJCiAjZW5kaWYgLyogSkNEIHRlc3QgKi8KQEAgLTE0ODgsNyArMTYxNyw5IEBACiAJc2VnID0gc25kX2VudGVyX3VzZXIoKTsKIAlpY29kZS0+Z3ByX2FkZF9jb250cm9sX2NvdW50ID0gbmN0bDsKIAlpY29kZS0+Z3ByX2FkZF9jb250cm9scyA9IChzdHJ1Y3Qgc25kX2VtdTEwazFfZng4MDEwX2NvbnRyb2xfZ3ByIF9fdXNlciAqKWNvbnRyb2xzOworCWVtdS0+c3VwcG9ydF90bHYgPSAxOyAvKiBzdXBwb3J0IFRMViAqLwogCWVyciA9IHNuZF9lbXUxMGsxX2ljb2RlX3Bva2UoZW11LCBpY29kZSk7CisJZW11LT5zdXBwb3J0X3RsdiA9IDA7IC8qIGNsZWFyIGFnYWluICovCiAJc25kX2xlYXZlX3VzZXIoc2VnKTsKIAogIF9fZXJyOgpAQCAtMjEwNSw3ICsyMjM2LDkgQEAKIAlzZWcgPSBzbmRfZW50ZXJfdXNlcigpOwogCWljb2RlLT5ncHJfYWRkX2NvbnRyb2xfY291bnQgPSBpOwogCWljb2RlLT5ncHJfYWRkX2NvbnRyb2xzID0gKHN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHIgX191c2VyICopY29udHJvbHM7CisJZW11LT5zdXBwb3J0X3RsdiA9IDE7IC8qIHN1cHBvcnQgVExWICovCiAJZXJyID0gc25kX2VtdTEwazFfaWNvZGVfcG9rZShlbXUsIGljb2RlKTsKKwllbXUtPnN1cHBvcnRfdGx2ID0gMDsgLyogY2xlYXIgYWdhaW4gKi8KIAlzbmRfbGVhdmVfdXNlcihzZWcpOwogCWlmIChlcnIgPj0gMCkKIAkJZXJyID0gc25kX2VtdTEwazFfaXBjbV9wb2tlKGVtdSwgaXBjbSk7CkBAIC0yMTM4LDcgKzIyNzEsNyBAQAogCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBEQkcsIDAsIGVtdS0+Zng4MDEwLmRiZyA9IEVNVTEwSzFfREJHX1NJTkdMRV9TVEVQKTsKIH0KIAotI2lmIDAgLy8gRklYTUU6IHdobyB1c2UgdGhlbT8KKyNpZiAwIC8qIEZJWE1FOiB3aG8gdXNlIHRoZW0/ICovCiBpbnQgc25kX2VtdTEwazFfZng4MDEwX3RvbmVfY29udHJvbF9hY3RpdmF0ZShzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwgaW50IG91dHB1dCkKIHsKIAlpZiAob3V0cHV0IDwgMCB8fCBvdXRwdXQgPj0gNikKQEAgLTIyNDksNiArMjM4Miw5IEBACiAJaW50IHJlczsKIAkKIAlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfRU1VMTBLMV9JT0NUTF9QVkVSU0lPTjoKKwkJZW11LT5zdXBwb3J0X3RsdiA9IDE7CisJCXJldHVybiBwdXRfdXNlcihTTkRSVl9FTVUxMEsxX1ZFUlNJT04sIChpbnQgX191c2VyICopYXJncCk7CiAJY2FzZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0lORk86CiAJCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwogCQlpZiAoIWluZm8pCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVtaXhlci5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYwppbmRleCBjMzFmM2QwLi40ZGI2ZTFjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVtaXhlci5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMKQEAgLTUsNiArNSw5IEBACiAgKiAgUm91dGluZXMgZm9yIGNvbnRyb2wgb2YgRU1VMTBLMSBjaGlwcyAvIG1peGVyIHJvdXRpbmVzCiAgKiAgTXVsdGljaGFubmVsIFBDTSBzdXBwb3J0IENvcHlyaWdodCAoYykgTGVlIFJldmVsbCA8cmxyZXZlbGxAam9lLWpvYi5jb20+CiAgKgorICogIENvcHlyaWdodCAoYykgYnkgSmFtZXMgQ291cnRpZXItRHV0dG9uIDxKYW1lc0BzdXBlcmJ1Zy5jby51az4KKyAqICAJQWRkZWQgRU1VIDEwMTAgc3VwcG9ydC4KKyAqCiAgKiAgQlVHUzoKICAqICAgIC0tCiAgKgpAQCAtMzIsOSArMzUsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2VtdTEwazEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorCisjaW5jbHVkZSAicDE3di5oIgogCiAjZGVmaW5lIEFDOTdfSURfU1RBQzk3NTgJMHg4Mzg0NzY1OAogCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoc25kX2F1ZGlneV9kYl9zY2FsZTIsIC0xMDM1MCwgNTAsIDEpOyAvKiBXTTg3NzUgZ2FpbiBzY2FsZSAqLworCiBzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3NwZGlmX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7CiAJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1ODsKQEAgLTY4LDYgKzc3LDY2OSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY2hhciAqZW11MTAxMF9zcmNfdGV4dHNbXSA9IHsgCisJIlNpbGVuY2UiLAorCSJEb2NrIE1pYyBBIiwKKwkiRG9jayBNaWMgQiIsCisJIkRvY2sgQURDMSBMZWZ0IiwKKwkiRG9jayBBREMxIFJpZ2h0IiwKKwkiRG9jayBBREMyIExlZnQiLAorCSJEb2NrIEFEQzIgUmlnaHQiLAorCSJEb2NrIEFEQzMgTGVmdCIsCisJIkRvY2sgQURDMyBSaWdodCIsCisJIjAyMDIgQURDIExlZnQiLAorCSIwMjAyIEFEQyBSaWdodCIsCisJIjAyMDIgU1BESUYgTGVmdCIsCisJIjAyMDIgU1BESUYgUmlnaHQiLAorCSJBREFUIDAiLAorCSJBREFUIDEiLAorCSJBREFUIDIiLAorCSJBREFUIDMiLAorCSJBREFUIDQiLAorCSJBREFUIDUiLAorCSJBREFUIDYiLAorCSJBREFUIDciLAorCSJEU1AgMCIsCisJIkRTUCAxIiwKKwkiRFNQIDIiLAorCSJEU1AgMyIsCisJIkRTUCA0IiwKKwkiRFNQIDUiLAorCSJEU1AgNiIsCisJIkRTUCA3IiwKKwkiRFNQIDgiLAorCSJEU1AgOSIsCisJIkRTUCAxMCIsCisJIkRTUCAxMSIsCisJIkRTUCAxMiIsCisJIkRTUCAxMyIsCisJIkRTUCAxNCIsCisJIkRTUCAxNSIsCisJIkRTUCAxNiIsCisJIkRTUCAxNyIsCisJIkRTUCAxOCIsCisJIkRTUCAxOSIsCisJIkRTUCAyMCIsCisJIkRTUCAyMSIsCisJIkRTUCAyMiIsCisJIkRTUCAyMyIsCisJIkRTUCAyNCIsCisJIkRTUCAyNSIsCisJIkRTUCAyNiIsCisJIkRTUCAyNyIsCisJIkRTUCAyOCIsCisJIkRTUCAyOSIsCisJIkRTUCAzMCIsCisJIkRTUCAzMSIsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGVtdTEwMTBfc3JjX3JlZ3NbXSA9IHsKKwlFTVVfU1JDX1NJTEVOQ0UsLyogMCAqLworCUVNVV9TUkNfRE9DS19NSUNfQTEsIC8qIDEgKi8KKwlFTVVfU1JDX0RPQ0tfTUlDX0IxLCAvKiAyICovCisJRU1VX1NSQ19ET0NLX0FEQzFfTEVGVDEsIC8qIDMgKi8KKwlFTVVfU1JDX0RPQ0tfQURDMV9SSUdIVDEsIC8qIDQgKi8KKwlFTVVfU1JDX0RPQ0tfQURDMl9MRUZUMSwgLyogNSAqLworCUVNVV9TUkNfRE9DS19BREMyX1JJR0hUMSwgLyogNiAqLworCUVNVV9TUkNfRE9DS19BREMzX0xFRlQxLCAvKiA3ICovCisJRU1VX1NSQ19ET0NLX0FEQzNfUklHSFQxLCAvKiA4ICovCisJRU1VX1NSQ19IQU1PQV9BRENfTEVGVDEsIC8qIDkgKi8KKwlFTVVfU1JDX0hBTU9BX0FEQ19SSUdIVDEsIC8qIDEwICovCisJRU1VX1NSQ19IQU5BX1NQRElGX0xFRlQxLCAvKiAxMSAqLworCUVNVV9TUkNfSEFOQV9TUERJRl9SSUdIVDEsIC8qIDEyICovCisJRU1VX1NSQ19IQU5BX0FEQVQsIC8qIDEzICovCisJRU1VX1NSQ19IQU5BX0FEQVQrMSwgLyogMTQgKi8KKwlFTVVfU1JDX0hBTkFfQURBVCsyLCAvKiAxNSAqLworCUVNVV9TUkNfSEFOQV9BREFUKzMsIC8qIDE2ICovCisJRU1VX1NSQ19IQU5BX0FEQVQrNCwgLyogMTcgKi8KKwlFTVVfU1JDX0hBTkFfQURBVCs1LCAvKiAxOCAqLworCUVNVV9TUkNfSEFOQV9BREFUKzYsIC8qIDE5ICovCisJRU1VX1NSQ19IQU5BX0FEQVQrNywgLyogMjAgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSwgLyogMjEgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSsxLCAvKiAyMiAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJBKzIsIC8qIDIzICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkErMywgLyogMjQgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSs0LCAvKiAyNSAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJBKzUsIC8qIDI2ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkErNiwgLyogMjcgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSs3LCAvKiAyOCAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJBKzgsIC8qIDI5ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkErOSwgLyogMzAgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSsweGEsIC8qIDMxICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkErMHhiLCAvKiAzMiAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJBKzB4YywgLyogMzMgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQSsweGQsIC8qIDM0ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkErMHhlLCAvKiAzNSAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJBKzB4ZiwgLyogMzYgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQiwgLyogMzcgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQisxLCAvKiAzOCAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJCKzIsIC8qIDM5ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIrMywgLyogNDAgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQis0LCAvKiA0MSAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJCKzUsIC8qIDQyICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIrNiwgLyogNDMgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQis3LCAvKiA0NCAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJCKzgsIC8qIDQ1ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIrOSwgLyogNDYgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQisweGEsIC8qIDQ3ICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIrMHhiLCAvKiA0OCAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJCKzB4YywgLyogNDkgKi8KKwlFTVVfU1JDX0FMSUNFX0VNVTMyQisweGQsIC8qIDUwICovCisJRU1VX1NSQ19BTElDRV9FTVUzMkIrMHhlLCAvKiA1MSAqLworCUVNVV9TUkNfQUxJQ0VfRU1VMzJCKzB4ZiwgLyogNTIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZW11MTAxMF9vdXRwdXRfZHN0W10gPSB7CisJRU1VX0RTVF9ET0NLX0RBQzFfTEVGVDEsIC8qIDAgKi8KKwlFTVVfRFNUX0RPQ0tfREFDMV9SSUdIVDEsIC8qIDEgKi8KKwlFTVVfRFNUX0RPQ0tfREFDMl9MRUZUMSwgLyogMiAqLworCUVNVV9EU1RfRE9DS19EQUMyX1JJR0hUMSwgLyogMyAqLworCUVNVV9EU1RfRE9DS19EQUMzX0xFRlQxLCAvKiA0ICovCisJRU1VX0RTVF9ET0NLX0RBQzNfUklHSFQxLCAvKiA1ICovCisJRU1VX0RTVF9ET0NLX0RBQzRfTEVGVDEsIC8qIDYgKi8KKwlFTVVfRFNUX0RPQ0tfREFDNF9SSUdIVDEsIC8qIDcgKi8KKwlFTVVfRFNUX0RPQ0tfUEhPTkVTX0xFRlQxLCAvKiA4ICovCisJRU1VX0RTVF9ET0NLX1BIT05FU19SSUdIVDEsIC8qIDkgKi8KKwlFTVVfRFNUX0RPQ0tfU1BESUZfTEVGVDEsIC8qIDEwICovCisJRU1VX0RTVF9ET0NLX1NQRElGX1JJR0hUMSwgLyogMTEgKi8KKwlFTVVfRFNUX0hBTkFfU1BESUZfTEVGVDEsIC8qIDEyICovCisJRU1VX0RTVF9IQU5BX1NQRElGX1JJR0hUMSwgLyogMTMgKi8KKwlFTVVfRFNUX0hBTU9BX0RBQ19MRUZUMSwgLyogMTQgKi8KKwlFTVVfRFNUX0hBTU9BX0RBQ19SSUdIVDEsIC8qIDE1ICovCisJRU1VX0RTVF9IQU5BX0FEQVQsIC8qIDE2ICovCisJRU1VX0RTVF9IQU5BX0FEQVQrMSwgLyogMTcgKi8KKwlFTVVfRFNUX0hBTkFfQURBVCsyLCAvKiAxOCAqLworCUVNVV9EU1RfSEFOQV9BREFUKzMsIC8qIDE5ICovCisJRU1VX0RTVF9IQU5BX0FEQVQrNCwgLyogMjAgKi8KKwlFTVVfRFNUX0hBTkFfQURBVCs1LCAvKiAyMSAqLworCUVNVV9EU1RfSEFOQV9BREFUKzYsIC8qIDIyICovCisJRU1VX0RTVF9IQU5BX0FEQVQrNywgLyogMjMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZW11MTAxMF9pbnB1dF9kc3RbXSA9IHsKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl8wLAorCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzEsCisJRU1VX0RTVF9BTElDRTJfRU1VMzJfMiwKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl8zLAorCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzQsCisJRU1VX0RTVF9BTElDRTJfRU1VMzJfNSwKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl82LAorCUVNVV9EU1RfQUxJQ0UyX0VNVTMyXzcsCisJRU1VX0RTVF9BTElDRTJfRU1VMzJfOCwKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl85LAorCUVNVV9EU1RfQUxJQ0UyX0VNVTMyX0EsCisJRU1VX0RTVF9BTElDRTJfRU1VMzJfQiwKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl9DLAorCUVNVV9EU1RfQUxJQ0UyX0VNVTMyX0QsCisJRU1VX0RTVF9BTElDRTJfRU1VMzJfRSwKKwlFTVVfRFNUX0FMSUNFMl9FTVUzMl9GLAorCUVNVV9EU1RfQUxJQ0VfSTJTMF9MRUZULAorCUVNVV9EU1RfQUxJQ0VfSTJTMF9SSUdIVCwKKwlFTVVfRFNUX0FMSUNFX0kyUzFfTEVGVCwKKwlFTVVfRFNUX0FMSUNFX0kyUzFfUklHSFQsCisJRU1VX0RTVF9BTElDRV9JMlMyX0xFRlQsCisJRU1VX0RTVF9BTElDRV9JMlMyX1JJR0hULAorfTsKKworc3RhdGljIGludCBzbmRfZW11MTAxMF9pbnB1dF9vdXRwdXRfc291cmNlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDUzOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCBlbXUxMDEwX3NyY190ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfb3V0cHV0X3NvdXJjZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbm5lbDsKKworCWNoYW5uZWwgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZW11LT5lbXUxMDEwLm91dHB1dF9zb3VyY2VbY2hhbm5lbF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfb3V0cHV0X3NvdXJjZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlID0gMDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjaGFubmVsOworCisJY2hhbm5lbCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgJiAweGZmOworCWlmIChlbXUtPmVtdTEwMTAub3V0cHV0X3NvdXJjZVtjaGFubmVsXSAhPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKSB7CisJCXZhbCA9IGVtdS0+ZW11MTAxMC5vdXRwdXRfc291cmNlW2NoYW5uZWxdID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwkJY2hhbmdlID0gMTsKKwkJc25kX2VtdTEwMTBfZnBnYV9saW5rX2RzdF9zcmNfd3JpdGUoZW11LAorCQkJZW11MTAxMF9vdXRwdXRfZHN0W2NoYW5uZWxdLCBlbXUxMDEwX3NyY19yZWdzW3ZhbF0pOworCX0KKwlyZXR1cm4gY2hhbmdlOworfQorCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX2lucHV0X3NvdXJjZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbm5lbDsKKworCWNoYW5uZWwgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZW11LT5lbXUxMDEwLmlucHV0X3NvdXJjZVtjaGFubmVsXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTAxMF9pbnB1dF9zb3VyY2VfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZSA9IDA7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY2hhbm5lbDsKKworCWNoYW5uZWwgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpICYgMHhmZjsKKwlpZiAoZW11LT5lbXUxMDEwLmlucHV0X3NvdXJjZVtjaGFubmVsXSAhPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKSB7CisJCXZhbCA9IGVtdS0+ZW11MTAxMC5pbnB1dF9zb3VyY2VbY2hhbm5lbF0gPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCQljaGFuZ2UgPSAxOworCQlzbmRfZW11MTAxMF9mcGdhX2xpbmtfZHN0X3NyY193cml0ZShlbXUsCisJCQllbXUxMDEwX2lucHV0X2RzdFtjaGFubmVsXSwgZW11MTAxMF9zcmNfcmVnc1t2YWxdKTsKKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBFTVUxMDEwX1NPVVJDRV9PVVRQVVQoeG5hbWUsY2hpZCkgXAorewkJCQkJCQkJXAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLAlcCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCQlcCisJLmluZm8gPSAgc25kX2VtdTEwMTBfaW5wdXRfb3V0cHV0X3NvdXJjZV9pbmZvLAkJXAorCS5nZXQgPSAgIHNuZF9lbXUxMDEwX291dHB1dF9zb3VyY2VfZ2V0LAkJCVwKKwkucHV0ID0gICBzbmRfZW11MTAxMF9vdXRwdXRfc291cmNlX3B1dCwJCQlcCisJLnByaXZhdGVfdmFsdWUgPSBjaGlkCQkJCQlcCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfZW11MTAxMF9vdXRwdXRfZW51bV9jdGxzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIkRvY2sgREFDMSBMZWZ0IFBsYXliYWNrIEVudW0iLCAwKSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIkRvY2sgREFDMSBSaWdodCBQbGF5YmFjayBFbnVtIiwgMSksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCJEb2NrIERBQzIgTGVmdCBQbGF5YmFjayBFbnVtIiwgMiksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCJEb2NrIERBQzIgUmlnaHQgUGxheWJhY2sgRW51bSIsIDMpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiRG9jayBEQUMzIExlZnQgUGxheWJhY2sgRW51bSIsIDQpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiRG9jayBEQUMzIFJpZ2h0IFBsYXliYWNrIEVudW0iLCA1KSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIkRvY2sgREFDNCBMZWZ0IFBsYXliYWNrIEVudW0iLCA2KSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIkRvY2sgREFDNCBSaWdodCBQbGF5YmFjayBFbnVtIiwgNyksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCJEb2NrIFBob25lcyBMZWZ0IFBsYXliYWNrIEVudW0iLCA4KSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIkRvY2sgUGhvbmVzIFJpZ2h0IFBsYXliYWNrIEVudW0iLCA5KSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIkRvY2sgU1BESUYgTGVmdCBQbGF5YmFjayBFbnVtIiwgMHhhKSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIkRvY2sgU1BESUYgUmlnaHQgUGxheWJhY2sgRW51bSIsIDB4YiksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCIxMDEwIFNQRElGIExlZnQgUGxheWJhY2sgRW51bSIsIDB4YyksCisJRU1VMTAxMF9TT1VSQ0VfT1VUUFVUKCIxMDEwIFNQRElGIFJpZ2h0IFBsYXliYWNrIEVudW0iLCAweGQpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMDIwMiBEQUMgTGVmdCBQbGF5YmFjayBFbnVtIiwgMHhlKSwKKwlFTVUxMDEwX1NPVVJDRV9PVVRQVVQoIjAyMDIgREFDIFJpZ2h0IFBsYXliYWNrIEVudW0iLCAweGYpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMTAxMCBBREFUIDAgUGxheWJhY2sgRW51bSIsIDB4MTApLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMTAxMCBBREFUIDEgUGxheWJhY2sgRW51bSIsIDB4MTEpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMTAxMCBBREFUIDIgUGxheWJhY2sgRW51bSIsIDB4MTIpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMTAxMCBBREFUIDMgUGxheWJhY2sgRW51bSIsIDB4MTMpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMTAxMCBBREFUIDQgUGxheWJhY2sgRW51bSIsIDB4MTQpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMTAxMCBBREFUIDUgUGxheWJhY2sgRW51bSIsIDB4MTUpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMTAxMCBBREFUIDYgUGxheWJhY2sgRW51bSIsIDB4MTYpLAorCUVNVTEwMTBfU09VUkNFX09VVFBVVCgiMTAxMCBBREFUIDcgUGxheWJhY2sgRW51bSIsIDB4MTcpLAorfTsKKworI2RlZmluZSBFTVUxMDEwX1NPVVJDRV9JTlBVVCh4bmFtZSxjaGlkKSBcCit7CQkJCQkJCQlcCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsCVwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwJCVwKKwkuaW5mbyA9ICBzbmRfZW11MTAxMF9pbnB1dF9vdXRwdXRfc291cmNlX2luZm8sCQlcCisJLmdldCA9ICAgc25kX2VtdTEwMTBfaW5wdXRfc291cmNlX2dldCwJCQlcCisJLnB1dCA9ICAgc25kX2VtdTEwMTBfaW5wdXRfc291cmNlX3B1dCwJCQlcCisJLnByaXZhdGVfdmFsdWUgPSBjaGlkCQkJCQlcCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfZW11MTAxMF9pbnB1dF9lbnVtX2N0bHNbXSBfX2RldmluaXRkYXRhID0geworCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgMCBDYXB0dXJlIEVudW0iLCAwKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDEgQ2FwdHVyZSBFbnVtIiwgMSksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCAyIENhcHR1cmUgRW51bSIsIDIpLAorCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgMyBDYXB0dXJlIEVudW0iLCAzKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDQgQ2FwdHVyZSBFbnVtIiwgNCksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCA1IENhcHR1cmUgRW51bSIsIDUpLAorCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgNiBDYXB0dXJlIEVudW0iLCA2KSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDcgQ2FwdHVyZSBFbnVtIiwgNyksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCA4IENhcHR1cmUgRW51bSIsIDgpLAorCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgOSBDYXB0dXJlIEVudW0iLCA5KSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIEEgQ2FwdHVyZSBFbnVtIiwgMHhhKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIEIgQ2FwdHVyZSBFbnVtIiwgMHhiKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIEMgQ2FwdHVyZSBFbnVtIiwgMHhjKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIEQgQ2FwdHVyZSBFbnVtIiwgMHhkKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIEUgQ2FwdHVyZSBFbnVtIiwgMHhlKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIEYgQ2FwdHVyZSBFbnVtIiwgMHhmKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDEwIENhcHR1cmUgRW51bSIsIDB4MTApLAorCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgMTEgQ2FwdHVyZSBFbnVtIiwgMHgxMSksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCAxMiBDYXB0dXJlIEVudW0iLCAweDEyKSwKKwlFTVUxMDEwX1NPVVJDRV9JTlBVVCgiRFNQIDEzIENhcHR1cmUgRW51bSIsIDB4MTMpLAorCUVNVTEwMTBfU09VUkNFX0lOUFVUKCJEU1AgMTQgQ2FwdHVyZSBFbnVtIiwgMHgxNCksCisJRU1VMTAxMF9TT1VSQ0VfSU5QVVQoIkRTUCAxNSBDYXB0dXJlIEVudW0iLCAweDE1KSwKK307CisKKworCisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfYWRjX3BhZHNfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTAxMF9hZGNfcGFkc19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCBtYXNrID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKGVtdS0+ZW11MTAxMC5hZGNfcGFkcyAmIG1hc2spID8gMSA6IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfYWRjX3BhZHNfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwl1bnNpZ25lZCBpbnQgdmFsLCBjYWNoZTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwljYWNoZSA9IGVtdS0+ZW11MTAxMC5hZGNfcGFkczsKKwlpZiAodmFsID09IDEpIAorCQljYWNoZSA9IGNhY2hlIHwgbWFzazsKKwllbHNlCisJCWNhY2hlID0gY2FjaGUgJiB+bWFzazsKKwlpZiAoY2FjaGUgIT0gZW11LT5lbXUxMDEwLmFkY19wYWRzKSB7CisJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9BRENfUEFEUywgY2FjaGUgKTsKKwkgICAgICAgIGVtdS0+ZW11MTAxMC5hZGNfcGFkcyA9IGNhY2hlOworCX0KKworCXJldHVybiAwOworfQorCisKKworI2RlZmluZSBFTVUxMDEwX0FEQ19QQURTKHhuYW1lLGNoaWQpIFwKK3sJCQkJCQkJCVwKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwJXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAkJXAorCS5pbmZvID0gIHNuZF9lbXUxMDEwX2FkY19wYWRzX2luZm8sCQkJXAorCS5nZXQgPSAgIHNuZF9lbXUxMDEwX2FkY19wYWRzX2dldCwJCQlcCisJLnB1dCA9ICAgc25kX2VtdTEwMTBfYWRjX3BhZHNfcHV0LAkJCVwKKwkucHJpdmF0ZV92YWx1ZSA9IGNoaWQJCQkJCVwKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9lbXUxMDEwX2FkY19wYWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlFTVUxMDEwX0FEQ19QQURTKCJBREMxIDE0ZEIgUEFEIEF1ZGlvIERvY2sgQ2FwdHVyZSBTd2l0Y2giLCBFTVVfSEFOQV9ET0NLX0FEQ19QQUQxKSwKKwlFTVUxMDEwX0FEQ19QQURTKCJBREMyIDE0ZEIgUEFEIEF1ZGlvIERvY2sgQ2FwdHVyZSBTd2l0Y2giLCBFTVVfSEFOQV9ET0NLX0FEQ19QQUQyKSwKKwlFTVUxMDEwX0FEQ19QQURTKCJBREMzIDE0ZEIgUEFEIEF1ZGlvIERvY2sgQ2FwdHVyZSBTd2l0Y2giLCBFTVVfSEFOQV9ET0NLX0FEQ19QQUQzKSwKKwlFTVUxMDEwX0FEQ19QQURTKCJBREMxIDE0ZEIgUEFEIDAyMDIgQ2FwdHVyZSBTd2l0Y2giLCBFTVVfSEFOQV8wMjAyX0FEQ19QQUQxKSwKK307CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfZGFjX3BhZHNfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTAxMF9kYWNfcGFkc19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCBtYXNrID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKGVtdS0+ZW11MTAxMC5kYWNfcGFkcyAmIG1hc2spID8gMSA6IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfZGFjX3BhZHNfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwl1bnNpZ25lZCBpbnQgdmFsLCBjYWNoZTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwljYWNoZSA9IGVtdS0+ZW11MTAxMC5kYWNfcGFkczsKKwlpZiAodmFsID09IDEpIAorCQljYWNoZSA9IGNhY2hlIHwgbWFzazsKKwllbHNlCisJCWNhY2hlID0gY2FjaGUgJiB+bWFzazsKKwlpZiAoY2FjaGUgIT0gZW11LT5lbXUxMDEwLmRhY19wYWRzKSB7CisJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9EQUNfUEFEUywgY2FjaGUgKTsKKwkgICAgICAgIGVtdS0+ZW11MTAxMC5kYWNfcGFkcyA9IGNhY2hlOworCX0KKworCXJldHVybiAwOworfQorCisKKworI2RlZmluZSBFTVUxMDEwX0RBQ19QQURTKHhuYW1lLGNoaWQpIFwKK3sJCQkJCQkJCVwKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwJXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAkJXAorCS5pbmZvID0gIHNuZF9lbXUxMDEwX2RhY19wYWRzX2luZm8sCQkJXAorCS5nZXQgPSAgIHNuZF9lbXUxMDEwX2RhY19wYWRzX2dldCwJCQlcCisJLnB1dCA9ICAgc25kX2VtdTEwMTBfZGFjX3BhZHNfcHV0LAkJCVwKKwkucHJpdmF0ZV92YWx1ZSA9IGNoaWQJCQkJCVwKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9lbXUxMDEwX2RhY19wYWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlFTVUxMDEwX0RBQ19QQURTKCJEQUMxIEF1ZGlvIERvY2sgMTRkQiBQQUQgUGxheWJhY2sgU3dpdGNoIiwgRU1VX0hBTkFfRE9DS19EQUNfUEFEMSksCisJRU1VMTAxMF9EQUNfUEFEUygiREFDMiBBdWRpbyBEb2NrIDE0ZEIgUEFEIFBsYXliYWNrIFN3aXRjaCIsIEVNVV9IQU5BX0RPQ0tfREFDX1BBRDIpLAorCUVNVTEwMTBfREFDX1BBRFMoIkRBQzMgQXVkaW8gRG9jayAxNGRCIFBBRCBQbGF5YmFjayBTd2l0Y2giLCBFTVVfSEFOQV9ET0NLX0RBQ19QQUQzKSwKKwlFTVUxMDEwX0RBQ19QQURTKCJEQUM0IEF1ZGlvIERvY2sgMTRkQiBQQUQgUGxheWJhY2sgU3dpdGNoIiwgRU1VX0hBTkFfRE9DS19EQUNfUEFENCksCisJRU1VMTAxMF9EQUNfUEFEUygiREFDMSAwMjAyIDE0ZEIgUEFEIFBsYXliYWNrIFN3aXRjaCIsIEVNVV9IQU5BXzAyMDJfREFDX1BBRDEpLAorfTsKKworCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX2ludGVybmFsX2Nsb2NrX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbMl0gPSB7CisJCSI0NDEwMCIsICI0ODAwMCIKKwl9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAxKQorICAgICAgICAgICAgICAgIHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfaW50ZXJuYWxfY2xvY2tfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBlbXUtPmVtdTEwMTAuaW50ZXJuYWxfY2xvY2s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfaW50ZXJuYWxfY2xvY2tfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBjaGFuZ2UgPSAwOworCisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA7CisJY2hhbmdlID0gKGVtdS0+ZW11MTAxMC5pbnRlcm5hbF9jbG9jayAhPSB2YWwpOworCWlmIChjaGFuZ2UpIHsKKwkJZW11LT5lbXUxMDEwLmludGVybmFsX2Nsb2NrID0gdmFsOworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIDA6CisJCQkvKiA0NDEwMCAqLworCQkJLyogTXV0ZSBhbGwgKi8KKwkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9VTk1VVEUsIEVNVV9NVVRFICk7CisJCQkvKiBEZWZhdWx0IGZhbGxiYWNrIGNsb2NrIDQ4a0h6ICovCisJCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfREVGQ0xPQ0ssIEVNVV9IQU5BX0RFRkNMT0NLXzQ0XzFLICk7CisJCQkvKiBXb3JkIENsb2NrIHNvdXJjZSwgSW50ZXJuYWwgNDQuMWtIeiB4MSAqLworCQkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1dDTE9DSywKKwkJCUVNVV9IQU5BX1dDTE9DS19JTlRfNDRfMUsgfCBFTVVfSEFOQV9XQ0xPQ0tfMVggKTsKKwkJCS8qIFNldCBMRURzIG9uIEF1ZGlvIERvY2sgKi8KKwkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ET0NLX0xFRFNfMiwKKwkJCQlFTVVfSEFOQV9ET0NLX0xFRFNfMl80NEsgfCBFTVVfSEFOQV9ET0NLX0xFRFNfMl9MT0NLICk7CisJCQkvKiBBbGxvdyBETEwgdG8gc2V0dGxlICovCisJCQltc2xlZXAoMTApOworCQkJLyogVW5tdXRlIGFsbCAqLworCQkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1VOTVVURSwgRU1VX1VOTVVURSApOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCS8qIDQ4MDAwICovCisJCQkvKiBNdXRlIGFsbCAqLworCQkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1VOTVVURSwgRU1VX01VVEUgKTsKKwkJCS8qIERlZmF1bHQgZmFsbGJhY2sgY2xvY2sgNDhrSHogKi8KKwkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ERUZDTE9DSywgRU1VX0hBTkFfREVGQ0xPQ0tfNDhLICk7CisJCQkvKiBXb3JkIENsb2NrIHNvdXJjZSwgSW50ZXJuYWwgNDhrSHogeDEgKi8KKwkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9XQ0xPQ0ssCisJCQkJRU1VX0hBTkFfV0NMT0NLX0lOVF80OEsgfCBFTVVfSEFOQV9XQ0xPQ0tfMVggKTsKKwkJCS8qIFNldCBMRURzIG9uIEF1ZGlvIERvY2sgKi8KKwkJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9ET0NLX0xFRFNfMiwKKwkJCQlFTVVfSEFOQV9ET0NLX0xFRFNfMl80OEsgfCBFTVVfSEFOQV9ET0NLX0xFRFNfMl9MT0NLICk7CisJCQkvKiBBbGxvdyBETEwgdG8gc2V0dGxlICovCisJCQltc2xlZXAoMTApOworCQkJLyogVW5tdXRlIGFsbCAqLworCQkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX1VOTVVURSwgRU1VX1VOTVVURSApOworCQkJYnJlYWs7CisJCX0KKwl9CisgICAgICAgIHJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfZW11MTAxMF9pbnRlcm5hbF9jbG9jayA9Cit7CisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCisJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gICAgICAgICAiQ2xvY2sgSW50ZXJuYWwgUmF0ZSIsCisJLmNvdW50ID0JMSwKKwkuaW5mbyA9ICAgICAgICAgc25kX2VtdTEwMTBfaW50ZXJuYWxfY2xvY2tfaW5mbywKKwkuZ2V0ID0gICAgICAgICAgc25kX2VtdTEwMTBfaW50ZXJuYWxfY2xvY2tfZ2V0LAorCS5wdXQgPSAgICAgICAgICBzbmRfZW11MTAxMF9pbnRlcm5hbF9jbG9ja19wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2F1ZGlneV9pMmNfY2FwdHVyZV9zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworI2lmIDAKKwlzdGF0aWMgY2hhciAqdGV4dHNbNF0gPSB7CisJCSJVbmtub3duMSIsICJVbmtub3duMiIsICJNaWMiLCAiTGluZSIKKwl9OworI2VuZGlmCisJc3RhdGljIGNoYXIgKnRleHRzWzJdID0geworCQkiTWljIiwgIkxpbmUiCisJfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAyOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gMSkKKyAgICAgICAgICAgICAgICB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9hdWRpZ3lfaTJjX2NhcHR1cmVfc291cmNlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZW11LT5pMmNfY2FwdHVyZV9zb3VyY2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2F1ZGlneV9pMmNfY2FwdHVyZV9zb3VyY2VfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgc291cmNlX2lkOworCXVuc2lnbmVkIGludCBuZ2Fpbiwgb2dhaW47CisJdTMyIGdwaW87CisJaW50IGNoYW5nZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgc291cmNlOworCS8qIElmIHRoZSBjYXB0dXJlIHNvdXJjZSBoYXMgY2hhbmdlZCwKKwkgKiB1cGRhdGUgdGhlIGNhcHR1cmUgdm9sdW1lIGZyb20gdGhlIGNhY2hlZCB2YWx1ZQorCSAqIGZvciB0aGUgcGFydGljdWxhciBzb3VyY2UuCisJICovCisJc291cmNlX2lkID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsgLyogVXNlIDIgYW5kIDMgKi8KKwljaGFuZ2UgPSAoZW11LT5pMmNfY2FwdHVyZV9zb3VyY2UgIT0gc291cmNlX2lkKTsKKwlpZiAoY2hhbmdlKSB7CisJCXNuZF9lbXUxMGsxX2kyY193cml0ZShlbXUsIEFEQ19NVVgsIDApOyAvKiBNdXRlIGlucHV0ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CisJCWdwaW8gPSBpbmwoZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCWlmIChzb3VyY2VfaWQ9PTApCisJCQlvdXRsKGdwaW8gfCAweDQsIGVtdS0+cG9ydCArIEFfSU9DRkcpOworCQllbHNlCisJCQlvdXRsKGdwaW8gJiB+MHg0LCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOworCisJCW5nYWluID0gZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbc291cmNlX2lkXVswXTsgLyogTGVmdCAqLworCQlvZ2FpbiA9IGVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW2VtdS0+aTJjX2NhcHR1cmVfc291cmNlXVswXTsgLyogTGVmdCAqLworCQlpZiAobmdhaW4gIT0gb2dhaW4pCisJCQlzbmRfZW11MTBrMV9pMmNfd3JpdGUoZW11LCBBRENfQVRURU5fQURDTCwgKChuZ2FpbikgJiAweGZmKSk7CisJCW5nYWluID0gZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbc291cmNlX2lkXVsxXTsgLyogUmlnaHQgKi8KKwkJb2dhaW4gPSBlbXUtPmkyY19jYXB0dXJlX3ZvbHVtZVtlbXUtPmkyY19jYXB0dXJlX3NvdXJjZV1bMV07IC8qIFJpZ2h0ICovCisJCWlmIChuZ2FpbiAhPSBvZ2FpbikKKwkJCXNuZF9lbXUxMGsxX2kyY193cml0ZShlbXUsIEFEQ19BVFRFTl9BRENSLCAoKG5nYWluKSAmIDB4ZmYpKTsKKworCQlzb3VyY2UgPSAxIDw8IChzb3VyY2VfaWQgKyAyKTsKKwkJc25kX2VtdTEwazFfaTJjX3dyaXRlKGVtdSwgQURDX01VWCwgc291cmNlKTsgLyogU2V0IHNvdXJjZSAqLworCQllbXUtPmkyY19jYXB0dXJlX3NvdXJjZSA9IHNvdXJjZV9pZDsKKwl9CisgICAgICAgIHJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfYXVkaWd5X2kyY19jYXB0dXJlX3NvdXJjZSA9Cit7CisJCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9CQkiQ2FwdHVyZSBTb3VyY2UiLAorCQkuaW5mbyA9CQlzbmRfYXVkaWd5X2kyY19jYXB0dXJlX3NvdXJjZV9pbmZvLAorCQkuZ2V0ID0JCXNuZF9hdWRpZ3lfaTJjX2NhcHR1cmVfc291cmNlX2dldCwKKwkJLnB1dCA9CQlzbmRfYXVkaWd5X2kyY19jYXB0dXJlX3NvdXJjZV9wdXQKK307CisKK3N0YXRpYyBpbnQgc25kX2F1ZGlneV9pMmNfdm9sdW1lX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAyNTU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2F1ZGlneV9pMmNfdm9sdW1lX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHNvdXJjZV9pZDsKKworCXNvdXJjZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBlbXUtPmkyY19jYXB0dXJlX3ZvbHVtZVtzb3VyY2VfaWRdWzBdOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbc291cmNlX2lkXVsxXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfYXVkaWd5X2kyY192b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgb2dhaW47CisJdW5zaWduZWQgaW50IG5nYWluOworCWludCBzb3VyY2VfaWQ7CisJaW50IGNoYW5nZSA9IDA7CisKKwlzb3VyY2VfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlvZ2FpbiA9IGVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMF07IC8qIExlZnQgKi8KKwluZ2FpbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWlmIChuZ2FpbiA+IDB4ZmYpCisJCXJldHVybiAwOworCWlmIChvZ2FpbiAhPSBuZ2FpbikgeworCQlpZiAoZW11LT5pMmNfY2FwdHVyZV9zb3VyY2UgPT0gc291cmNlX2lkKQorCQkJc25kX2VtdTEwazFfaTJjX3dyaXRlKGVtdSwgQURDX0FUVEVOX0FEQ0wsICgobmdhaW4pICYgMHhmZikgKTsKKwkJZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbc291cmNlX2lkXVswXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQljaGFuZ2UgPSAxOworCX0KKwlvZ2FpbiA9IGVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMV07IC8qIFJpZ2h0ICovCisJbmdhaW4gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwlpZiAobmdhaW4gPiAweGZmKQorCQlyZXR1cm4gMDsKKwlpZiAob2dhaW4gIT0gbmdhaW4pIHsKKwkJaWYgKGVtdS0+aTJjX2NhcHR1cmVfc291cmNlID09IHNvdXJjZV9pZCkKKwkJCXNuZF9lbXUxMGsxX2kyY193cml0ZShlbXUsIEFEQ19BVFRFTl9BRENSLCAoKG5nYWluKSAmIDB4ZmYpKTsKKwkJZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbc291cmNlX2lkXVsxXSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCQljaGFuZ2UgPSAxOworCX0KKworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgSTJDX1ZPTFVNRSh4bmFtZSxjaGlkKSBcCit7CQkJCQkJCQlcCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsCVwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CQlcCisJICAgICAgICAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCwJCVwKKwkuaW5mbyA9ICBzbmRfYXVkaWd5X2kyY192b2x1bWVfaW5mbywJCQlcCisJLmdldCA9ICAgc25kX2F1ZGlneV9pMmNfdm9sdW1lX2dldCwJCQlcCisJLnB1dCA9ICAgc25kX2F1ZGlneV9pMmNfdm9sdW1lX3B1dCwJCQlcCisJLnRsdiA9IHsgLnAgPSBzbmRfYXVkaWd5X2RiX3NjYWxlMiB9LAkJCVwKKwkucHJpdmF0ZV92YWx1ZSA9IGNoaWQJCQkJCVwKK30KKworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2F1ZGlneV9pMmNfdm9sdW1lX2N0bHNbXSBfX2RldmluaXRkYXRhID0geworCUkyQ19WT0xVTUUoIk1pYyBDYXB0dXJlIFZvbHVtZSIsIDApLAorCUkyQ19WT0xVTUUoIkxpbmUgQ2FwdHVyZSBWb2x1bWUiLCAwKQorfTsKKwogI2lmIDAKIHN0YXRpYyBpbnQgc25kX2F1ZGlneV9zcGRpZl9vdXRwdXRfcmF0ZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewpAQCAtNjY4LDcgKzEzNDAsOSBAQAogCWludCBjaGFuZ2UgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+cmVnX2xvY2ssIGZsYWdzKTsKLQlpZiAoZW11LT5hdWRpZ3kpIHsKKwlpZiAoIGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmkyY19hZGMpIHsKKwkJLyogRG8gbm90aGluZyBmb3IgQXVkaWd5IDIgWlMgTm90ZWJvb2sgKi8KKwl9IGVsc2UgaWYgKGVtdS0+YXVkaWd5KSB7CiAJCXJlZyA9IGlubChlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsKIAkJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyBBX0lPQ0ZHX0dQT1VUMCA6IDA7CiAJCWNoYW5nZSA9IChyZWcgJiBBX0lPQ0ZHX0dQT1VUMCkgIT0gdmFsOwpAQCAtODA2LDYgKzE0ODAsMjQgQEAKIAkJIkFNaWMgUGxheWJhY2sgVm9sdW1lIiwgIk1pYyBQbGF5YmFjayBWb2x1bWUiLAogCQlOVUxMCiAJfTsKKwlzdGF0aWMgY2hhciAqYXVkaWd5X3JlbmFtZV9jdGxzX2kyY19hZGNbXSA9IHsKKwkJLy8iQW5hbG9nIE1peCBDYXB0dXJlIFZvbHVtZSIsIk9MRCBBbmFsb2cgTWl4IENhcHR1cmUgVm9sdW1lIiwKKwkJIkxpbmUgQ2FwdHVyZSBWb2x1bWUiLCAiQW5hbG9nIE1peCBDYXB0dXJlIFZvbHVtZSIsCisJCSJXYXZlIFBsYXliYWNrIFZvbHVtZSIsICJPTEQgUENNIFBsYXliYWNrIFZvbHVtZSIsCisJCSJXYXZlIE1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsCisJCSJBTWljIFBsYXliYWNrIFZvbHVtZSIsICJPbGQgTWljIFBsYXliYWNrIFZvbHVtZSIsCisJCSJDRCBDYXB0dXJlIFZvbHVtZSIsICJJRUM5NTggT3B0aWNhbCBDYXB0dXJlIFZvbHVtZSIsCisJCU5VTEwKKwl9OworCXN0YXRpYyBjaGFyICphdWRpZ3lfcmVtb3ZlX2N0bHNfaTJjX2FkY1tdID0geworCQkvKiBPbiB0aGUgQXVkaWd5MiBaUyBOb3RlYm9vaworCQkgKiBDYXB0dXJlIHZpYSBXTTg3NzUgICovCisJCSJNaWMgQ2FwdHVyZSBWb2x1bWUiLAorCQkiQW5hbG9nIE1peCBDYXB0dXJlIFZvbHVtZSIsCisJCSJBdXggQ2FwdHVyZSBWb2x1bWUiLAorCQkiSUVDOTU4IE9wdGljYWwgQ2FwdHVyZSBWb2x1bWUiLAorCQlOVUxMCisJfTsKIAlzdGF0aWMgY2hhciAqYXVkaWd5X3JlbW92ZV9jdGxzXzEzNjF0X2FkY1tdID0gewogCQkvKiBPbiB0aGUgQXVkaWd5MiB0aGUgQUM5NyBwbGF5YmFjayBpcyBwaXBlZCBpbnRvCiAJCSAqIHRoZSBQaGlsaXBzIEFEQyBmb3IgMjRiaXQgY2FwdHVyZSAqLwpAQCAtODkwLDYgKzE1ODIsNyBAQAogCQkJaWYgKGVtdS0+YWM5Ny0+aWQgPT0gQUM5N19JRF9TVEFDOTc1OCkgewogCQkJCWVtdS0+cmVhcl9hYzk3ID0gMTsKIAkJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBQzk3U0xPVCwgMCwgQUM5N1NMT1RfQ05UUnxBQzk3U0xPVF9MRkV8QUM5N1NMT1RfUkVBUl9MRUZUfEFDOTdTTE9UX1JFQVJfUklHSFQpOworCQkJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGVtdS0+YWM5NywgQUM5N19IRUFEUEhPTkUsIDB4MDIwMik7CiAJCQl9CiAJCQkvKiByZW1vdmUgdW51c2VkIEFDOTcgY29udHJvbHMgKi8KIAkJCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGVtdS0+YWM5NywgQUM5N19TVVJST1VORF9NQVNURVIsIDB4MDIwMik7CkBAIC04OTgsNiArMTU5MSwxMCBAQAogCQl9CiAJCWZvciAoOyAqYzsgYysrKQogCQkJcmVtb3ZlX2N0bChjYXJkLCAqYyk7CisJfSBlbHNlIGlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5pMmNfYWRjKSB7CisJCWMgPSBhdWRpZ3lfcmVtb3ZlX2N0bHNfaTJjX2FkYzsKKwkJZm9yICg7ICpjOyBjKyspCisJCQlyZW1vdmVfY3RsKGNhcmQsICpjKTsKIAl9IGVsc2UgewogCW5vX2FjOTc6CiAJCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lY2FyZCkKQEAgLTkxMSw2ICsxNjA4LDggQEAKIAlpZiAoZW11LT5hdWRpZ3kpCiAJCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5hZGNfMTM2MXQpCiAJCQljID0gYXVkaWd5X3JlbmFtZV9jdGxzXzEzNjF0X2FkYzsKKwkJZWxzZSBpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+aTJjX2FkYykKKwkJCWMgPSBhdWRpZ3lfcmVuYW1lX2N0bHNfaTJjX2FkYzsKIAkJZWxzZQogCQkJYyA9IGF1ZGlneV9yZW5hbWVfY3RsczsKIAllbHNlCkBAIC0xMDIxLDcgKzE3MjAsNyBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAoIGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEyMTJtKSB7CisJaWYgKCBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMDEwKSB7CiAJCTsgIC8qIERpc2FibGUgdGhlIHNuZF9hdWRpZ3lfc3BkaWZfc2hhcmVkX3NwZGlmICovCiAJfSBlbHNlIGlmIChlbXUtPmF1ZGlneSkgewogCQlpZiAoKGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9hdWRpZ3lfc2hhcmVkX3NwZGlmLCBlbXUpKSA9PSBOVUxMKQpAQCAtMTA0NSw2ICsxNzQ0LDQ4IEBACiAJCWlmICgoZXJyID0gc25kX3AxNnZfbWl4ZXIoZW11KSkpCiAJCQlyZXR1cm4gZXJyOwogCX0KKworCWlmICggZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzbmRfZW11MTAxMF9vdXRwdXRfZW51bV9jdGxzKTsgaSsrKSB7CisJCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9lbXUxMDEwX291dHB1dF9lbnVtX2N0bHNbaV0sIGVtdSkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzbmRfZW11MTAxMF9pbnB1dF9lbnVtX2N0bHMpOyBpKyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2VtdTEwMTBfaW5wdXRfZW51bV9jdGxzW2ldLCBlbXUpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc25kX2VtdTEwMTBfYWRjX3BhZHMpOyBpKyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2VtdTEwMTBfYWRjX3BhZHNbaV0sIGVtdSkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzbmRfZW11MTAxMF9kYWNfcGFkcyk7IGkrKykgeworCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfZW11MTAxMF9kYWNfcGFkc1tpXSwgZW11KSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2VtdTEwMTBfaW50ZXJuYWxfY2xvY2ssIGVtdSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5pMmNfYWRjKSB7CisJCWludCBpOworCisJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2F1ZGlneV9pMmNfY2FwdHVyZV9zb3VyY2UsIGVtdSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc25kX2F1ZGlneV9pMmNfdm9sdW1lX2N0bHMpOyBpKyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2F1ZGlneV9pMmNfdm9sdW1lX2N0bHNbaV0sIGVtdSkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KIAkJCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCmluZGV4IDcxN2U5MmUuLmFiNGY1ZGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAkJCQkJICAgICAgMSwKIAkJCQkJICAgICAgJmVwY20tPmV4dHJhKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCS8vIHByaW50aygicGNtX2NoYW5uZWxfYWxsb2M6IGZhaWxlZCBleHRyYTogdm9pY2VzPSVkLCBmcmFtZT0lZFxuIiwgdm9pY2VzLCBmcmFtZSk7CisJCQkvKiBwcmludGsoInBjbV9jaGFubmVsX2FsbG9jOiBmYWlsZWQgZXh0cmE6IHZvaWNlcz0lZCwgZnJhbWU9JWRcbiIsIHZvaWNlcywgZnJhbWUpOyAqLwogCQkJZm9yIChpID0gMDsgaSA8IHZvaWNlczsgaSsrKSB7CiAJCQkJc25kX2VtdTEwazFfdm9pY2VfZnJlZShlcGNtLT5lbXUsIGVwY20tPnZvaWNlc1tpXSk7CiAJCQkJZXBjbS0+dm9pY2VzW2ldID0gTlVMTDsKQEAgLTMzOSw3ICszMzksNyBAQAogCQl9CiAJfQogCi0JLy8gc2V0dXAgcm91dGluZworCS8qIHNldHVwIHJvdXRpbmcgKi8KIAlpZiAoZW11LT5hdWRpZ3kpIHsKIAkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9GWFJUMSwgdm9pY2UsCiAJCQkJICAgICAgc25kX2VtdTEwazFfY29tcG9zZV9hdWRpZ3lfZnhydDEoc2VuZF9yb3V0aW5nKSk7CkBAIC0zNTMsMTIgKzM1MywxNSBAQAogCX0gZWxzZQogCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBGWFJULCB2b2ljZSwKIAkJCQkgICAgICBzbmRfZW11MTBrMV9jb21wb3NlX3NlbmRfcm91dGluZyhzZW5kX3JvdXRpbmcpKTsKLQkvLyBTdG9wIENBCi0JLy8gQXNzdW1wdGlvbiB0aGF0IFBUIGlzIGFscmVhZHkgMCBzbyBubyBoYXJtIG92ZXJ3cml0aW5nCisJLyogU3RvcCBDQSAqLworCS8qIEFzc3VtcHRpb24gdGhhdCBQVCBpcyBhbHJlYWR5IDAgc28gbm8gaGFybSBvdmVyd3JpdGluZyAqLwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFBUUlgsIHZvaWNlLCAoc2VuZF9hbW91bnRbMF0gPDwgOCkgfCBzZW5kX2Ftb3VudFsxXSk7CiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgRFNMLCB2b2ljZSwgZW5kX2FkZHIgfCAoc2VuZF9hbW91bnRbM10gPDwgMjQpKTsKIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBQU1NULCB2b2ljZSwgc3RhcnRfYWRkciB8IChzZW5kX2Ftb3VudFsyXSA8PCAyNCkpOwotCXBpdGNoX3RhcmdldCA9IGVtdTEwazFfY2FsY19waXRjaF90YXJnZXQocnVudGltZS0+cmF0ZSk7CisJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApCisJCXBpdGNoX3RhcmdldCA9IFBJVENIXzQ4MDAwOyAvKiBEaXNhYmxlIGludGVycG9sYXRvcnMgb24gZW11MTAxMCBjYXJkICovCisJZWxzZSAKKwkJcGl0Y2hfdGFyZ2V0ID0gZW11MTBrMV9jYWxjX3BpdGNoX3RhcmdldChydW50aW1lLT5yYXRlKTsKIAlpZiAoZXh0cmEpCiAJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDQ0EsIHZvaWNlLCBzdGFydF9hZGRyIHwKIAkJCSAgICAgIGVtdTEwazFfc2VsZWN0X2ludGVycHJvbShwaXRjaF90YXJnZXQpIHwKQEAgLTM2NywxNCArMzcwLDE0IEBACiAJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDQ0EsIHZvaWNlLCAoc3RhcnRfYWRkciArIGNjaXMpIHwKIAkJCSAgICAgIGVtdTEwazFfc2VsZWN0X2ludGVycHJvbShwaXRjaF90YXJnZXQpIHwKIAkJCSAgICAgICh3XzE2ID8gMCA6IENDQ0FfOEJJVFNFTEVDVCkpOwotCS8vIENsZWFyIGZpbHRlciBkZWxheSBtZW1vcnkKKwkvKiBDbGVhciBmaWx0ZXIgZGVsYXkgbWVtb3J5ICovCiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgWjEsIHZvaWNlLCAwKTsKIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBaMiwgdm9pY2UsIDApOwotCS8vIGludmFsaWRhdGUgbWFwcworCS8qIGludmFsaWRhdGUgbWFwcyAqLwogCXNpbGVudF9wYWdlID0gKCh1bnNpZ25lZCBpbnQpZW11LT5zaWxlbnRfcGFnZS5hZGRyIDw8IDEpIHwgTUFQX1BUSV9NQVNLOwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIE1BUEEsIHZvaWNlLCBzaWxlbnRfcGFnZSk7CiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgTUFQQiwgdm9pY2UsIHNpbGVudF9wYWdlKTsKLQkvLyBtb2R1bGF0aW9uIGVudmVsb3BlCisJLyogbW9kdWxhdGlvbiBlbnZlbG9wZSAqLwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENWQ0YsIHZvaWNlLCAweGZmZmYpOwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIFZURlQsIHZvaWNlLCAweGZmZmYpOwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFUS0hMRE0sIHZvaWNlLCAwKTsKQEAgLTM4NSwxMiArMzg4LDEyIEBACiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgVFJFTUZSUSwgdm9pY2UsIDApOwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEZNMkZSUTIsIHZvaWNlLCAwKTsKIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBFTlZWQUwsIHZvaWNlLCAweDgwMDApOwotCS8vIHZvbHVtZSBlbnZlbG9wZQorCS8qIHZvbHVtZSBlbnZlbG9wZSAqLwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEFUS0hMRFYsIHZvaWNlLCAweDdmN2YpOwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIEVOVlZPTCwgdm9pY2UsIDB4MDAwMCk7Ci0JLy8gZmlsdGVyIGVudmVsb3BlCisJLyogZmlsdGVyIGVudmVsb3BlICovCiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUEVGRV9GSUxURVJBTU9VTlQsIHZvaWNlLCAweDdmKTsKLQkvLyBwaXRjaCBlbnZlbG9wZQorCS8qIHBpdGNoIGVudmVsb3BlICovCiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUEVGRV9QSVRDSEFNT1VOVCwgdm9pY2UsIDApOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5yZWdfbG9jaywgZmxhZ3MpOwpAQCAtNDY4LDcgKzQ3MSw3IEBACiAJCXNuZF9lbXUxMGsxX3ZvaWNlX2ZyZWUoZXBjbS0+ZW11LCBlcGNtLT5leHRyYSk7CiAJCWVwY20tPmV4dHJhID0gTlVMTDsKIAl9Ci0JZm9yIChpPTA7IGkgPCBOVU1fRUZYX1BMQVlCQUNLOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0VGWF9QTEFZQkFDSzsgaSsrKSB7CiAJCWlmIChlcGNtLT52b2ljZXNbaV0pIHsKIAkJCXNuZF9lbXUxMGsxX3ZvaWNlX2ZyZWUoZXBjbS0+ZW11LCBlcGNtLT52b2ljZXNbaV0pOwogCQkJZXBjbS0+dm9pY2VzW2ldID0gTlVMTDsKQEAgLTYzNyw3ICs2NDAsNyBAQAogCXN0ZXJlbyA9ICghZXh0cmEgJiYgcnVudGltZS0+Y2hhbm5lbHMgPT0gMik7CiAJc2FtcGxlID0gc25kX3BjbV9mb3JtYXRfd2lkdGgocnVudGltZS0+Zm9ybWF0KSA9PSAxNiA/IDAgOiAweDgwODA4MDgwOwogCWNjaXMgPSBlbXUxMGsxX2NjaXMoc3RlcmVvLCBzYW1wbGUgPT0gMCk7Ci0JLy8gc2V0IGNzIHRvIDIgKiBudW1iZXIgb2YgY2FjaGUgcmVnaXN0ZXJzIGJlc2lkZSB0aGUgaW52YWxpZGF0ZWQKKwkvKiBzZXQgY3MgdG8gMiAqIG51bWJlciBvZiBjYWNoZSByZWdpc3RlcnMgYmVzaWRlIHRoZSBpbnZhbGlkYXRlZCAqLwogCWNzID0gKHNhbXBsZSA9PSAwKSA/ICgzMi1jY2lzKSA6ICg2NC1jY2lzKzEpID4+IDE7CiAJaWYgKGNzID4gMTYpIGNzID0gMTY7CiAJZm9yIChpID0gMDsgaSA8IGNzOyBpKyspIHsKQEAgLTY0NiwxNCArNjQ5LDE0IEBACiAJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDRDAgKyBpLCB2b2ljZSArIDEsIHNhbXBsZSk7CiAJCX0KIAl9Ci0JLy8gcmVzZXQgY2FjaGUKKwkvKiByZXNldCBjYWNoZSAqLwogCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZSwgMCk7CiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0NSX1JFQURBRERSRVNTLCB2b2ljZSwgY3JhKTsKIAlpZiAoc3RlcmVvKSB7CiAJCXNuZF9lbXUxMGsxX3B0cl93cml0ZShlbXUsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZSArIDEsIDApOwogCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDQ1JfUkVBREFERFJFU1MsIHZvaWNlICsgMSwgY3JhKTsKIAl9Ci0JLy8gZmlsbCBjYWNoZQorCS8qIGZpbGwgY2FjaGUgKi8KIAlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UsIGNjaXMpOwogCWlmIChzdGVyZW8pIHsKIAkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQ0NSX0NBQ0hFSU5WQUxJRFNJWkUsIHZvaWNlKzEsIGNjaXMpOwpAQCAtNjk4LDcgKzcwMSwxMCBAQAogCXZvaWNlID0gZXZvaWNlLT5udW1iZXI7CiAKIAlwaXRjaCA9IHNuZF9lbXUxMGsxX3JhdGVfdG9fcGl0Y2gocnVudGltZS0+cmF0ZSkgPj4gODsKLQlwaXRjaF90YXJnZXQgPSBlbXUxMGsxX2NhbGNfcGl0Y2hfdGFyZ2V0KHJ1bnRpbWUtPnJhdGUpOworCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMDEwKQorCQlwaXRjaF90YXJnZXQgPSBQSVRDSF80ODAwMDsgLyogRGlzYWJsZSBpbnRlcnBvbGF0b3JzIG9uIGVtdTEwMTAgY2FyZCAqLworCWVsc2UgCisJCXBpdGNoX3RhcmdldCA9IGVtdTEwazFfY2FsY19waXRjaF90YXJnZXQocnVudGltZS0+cmF0ZSk7CiAJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgUFRSWF9QSVRDSFRBUkdFVCwgdm9pY2UsIHBpdGNoX3RhcmdldCk7CiAJaWYgKG1hc3RlciB8fCBldm9pY2UtPmVwY20tPnR5cGUgPT0gUExBWUJBQ0tfRUZYKQogCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBDUEZfQ1VSUkVOVFBJVENILCB2b2ljZSwgcGl0Y2hfdGFyZ2V0KTsKQEAgLTczMiw3ICs3MzgsNyBAQAogCXN0cnVjdCBzbmRfZW11MTBrMV9wY21fbWl4ZXIgKm1peDsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCS8vIHByaW50aygidHJpZ2dlciAtIGVtdTEwazEgPSAweCV4LCBjbWQgPSAlaSwgcG9pbnRlciA9ICVpXG4iLCAoaW50KWVtdSwgY21kLCBzdWJzdHJlYW0tPm9wcy0+cG9pbnRlcihzdWJzdHJlYW0pKTsKKwkvKiBwcmludGsoInRyaWdnZXIgLSBlbXUxMGsxID0gMHgleCwgY21kID0gJWksIHBvaW50ZXIgPSAlaVxuIiwgKGludCllbXUsIGNtZCwgc3Vic3RyZWFtLT5vcHMtPnBvaW50ZXIoc3Vic3RyZWFtKSk7ICovCiAJc3Bpbl9sb2NrKCZlbXUtPnJlZ19sb2NrKTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CkBAIC03NzgsMTAgKzc4NCwxMCBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQkJLy8gaG1tIHRoaXMgc2hvdWxkIGNhdXNlIGZ1bGwgYW5kIGhhbGYgZnVsbCBpbnRlcnJ1cHQgdG8gYmUgcmFpc2VkPyAgCisJCS8qIGhtbSB0aGlzIHNob3VsZCBjYXVzZSBmdWxsIGFuZCBoYWxmIGZ1bGwgaW50ZXJydXB0IHRvIGJlIHJhaXNlZD8gKi8KIAkJb3V0bChlcGNtLT5jYXB0dXJlX2lwciwgZW11LT5wb3J0ICsgSVBSKTsKIAkJc25kX2VtdTEwazFfaW50cl9lbmFibGUoZW11LCBlcGNtLT5jYXB0dXJlX2ludGUpOwotCQkvLyBwcmludGsoImFkY2NyID0gMHgleCwgYWRjYnMgPSAweCV4XG4iLCBlcGNtLT5hZGNjciwgZXBjbS0+YWRjYnMpOworCQkvKiBwcmludGsoImFkY2NyID0gMHgleCwgYWRjYnMgPSAweCV4XG4iLCBlcGNtLT5hZGNjciwgZXBjbS0+YWRjYnMpOyAqLwogCQlzd2l0Y2ggKGVwY20tPnR5cGUpIHsKIAkJY2FzZSBDQVBUVVJFX0FDOTdBREM6CiAJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBRENDUiwgMCwgZXBjbS0+Y2FwdHVyZV9jcl92YWwpOwpAQCAtNzkwLDYgKzc5Niw3IEBACiAJCQlpZiAoZW11LT5hdWRpZ3kpIHsKIAkJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBBX0ZYV0MxLCAwLCBlcGNtLT5jYXB0dXJlX2NyX3ZhbCk7CiAJCQkJc25kX2VtdTEwazFfcHRyX3dyaXRlKGVtdSwgQV9GWFdDMiwgMCwgZXBjbS0+Y2FwdHVyZV9jcl92YWwyKTsKKwkJCQlzbmRfcHJpbnRkZCgiY3JfdmFsPTB4JXgsIGNyX3ZhbDI9MHgleFxuIiwgZXBjbS0+Y2FwdHVyZV9jcl92YWwsIGVwY20tPmNhcHR1cmVfY3JfdmFsMik7CiAJCQl9IGVsc2UKIAkJCQlzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBGWFdDLCAwLCBlcGNtLT5jYXB0dXJlX2NyX3ZhbCk7CiAJCQlicmVhazsKQEAgLTg1MSw3ICs4NTgsNyBAQAogCQkJcHRyIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwogCX0KICNlbmRpZgotCS8vIHByaW50aygicHRyID0gMHgleCwgYnVmZmVyX3NpemUgPSAweCV4LCBwZXJpb2Rfc2l6ZSA9IDB4JXhcbiIsIHB0ciwgcnVudGltZS0+YnVmZmVyX3NpemUsIHJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKKwkvKiBwcmludGsoInB0ciA9IDB4JXgsIGJ1ZmZlcl9zaXplID0gMHgleCwgcGVyaW9kX3NpemUgPSAweCV4XG4iLCBwdHIsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSk7ICovCiAJcmV0dXJuIHB0cjsKIH0KIApAQCAtODY4LDcgKzg3NSw3IEBACiAJc3Bpbl9sb2NrKCZlbXUtPnJlZ19sb2NrKTsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JCS8vIHByZXBhcmUgdm9pY2VzCisJCS8qIHByZXBhcmUgdm9pY2VzICovCiAJCWZvciAoaSA9IDA7IGkgPCBOVU1fRUZYX1BMQVlCQUNLOyBpKyspIHsJCiAJCQlzbmRfZW11MTBrMV9wbGF5YmFja19pbnZhbGlkYXRlX2NhY2hlKGVtdSwgMCwgZXBjbS0+dm9pY2VzW2ldKTsKIAkJfQpAQCAtOTE3LDcgKzkyNCw3IEBACiAJaWYgKCFlcGNtLT5ydW5uaW5nKQogCQlyZXR1cm4gMDsKIAlpZiAoZXBjbS0+Zmlyc3RfcHRyKSB7Ci0JCXVkZWxheSg1MCk7CS8vIGhhY2ssIGl0IHRha2VzIGF3aGlsZSB1bnRpbCBjYXB0dXJlIGlzIHN0YXJ0ZWQKKwkJdWRlbGF5KDUwKTsJLyogaGFjaywgaXQgdGFrZXMgYXdoaWxlIHVudGlsIGNhcHR1cmUgaXMgc3RhcnRlZCAqLwogCQllcGNtLT5maXJzdF9wdHIgPSAwOwogCX0KIAlwdHIgPSBzbmRfZW11MTBrMV9wdHJfcmVhZChlbXUsIGVwY20tPmNhcHR1cmVfaWR4X3JlZywgMCkgJiAweDAwMDBmZmZmOwpAQCAtOTcyLDYgKzk3OSwyOCBAQAogCS5maWZvX3NpemUgPQkJMCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfZW11MTBrMV9jYXB0dXJlX2VmeCA9Cit7CisJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8CisJCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQpLAorCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgCisJCQkJIFNORFJWX1BDTV9SQVRFXzg4MjAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfCAKKwkJCQkgU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwLAorCS5yYXRlX21pbiA9CQk0NDEwMCwKKwkucmF0ZV9tYXggPQkJMTkyMDAwLAorCS5jaGFubmVsc19taW4gPQkJOCwKKwkuY2hhbm5lbHNfbWF4ID0JCTgsCisJLmJ1ZmZlcl9ieXRlc19tYXggPQkoNjQqMTAyNCksCisJLnBlcmlvZF9ieXRlc19taW4gPQkzODQsCisJLnBlcmlvZF9ieXRlc19tYXggPQkoNjQqMTAyNCksCisJLnBlcmlvZHNfbWluID0JCTIsCisJLnBlcmlvZHNfbWF4ID0JCTIsCisJLmZpZm9fc2l6ZSA9CQkwLAorfTsKKwogLyoKICAqCiAgKi8KQEAgLTEwMTYsNyArMTA0NSw3IEBACiAJc3RydWN0IHNuZF9lbXUxMGsxX3BjbV9taXhlciAqbWl4OwogCWludCBpOwogCi0JZm9yIChpPTA7IGkgPCBOVU1fRUZYX1BMQVlCQUNLOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0VGWF9QTEFZQkFDSzsgaSsrKSB7CiAJCW1peCA9ICZlbXUtPmVmeF9wY21fbWl4ZXJbaV07CiAJCW1peC0+ZXBjbSA9IE5VTEw7CiAJCXNuZF9lbXUxMGsxX3BjbV9lZnhfbWl4ZXJfbm90aWZ5KGVtdSwgaSwgMCk7CkBAIC0xMDQ1LDcgKzEwNzQsNyBAQAogCXJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF9lbXUxMGsxX3BjbV9mcmVlX3N1YnN0cmVhbTsKIAlydW50aW1lLT5odyA9IHNuZF9lbXUxMGsxX2VmeF9wbGF5YmFjazsKIAkKLQlmb3IgKGk9MDsgaSA8IE5VTV9FRlhfUExBWUJBQ0s7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBOVU1fRUZYX1BMQVlCQUNLOyBpKyspIHsKIAkJbWl4ID0gJmVtdS0+ZWZ4X3BjbV9taXhlcltpXTsKIAkJbWl4LT5zZW5kX3JvdXRpbmdbMF1bMF0gPSBpOwogCQltZW1zZXQoJm1peC0+c2VuZF92b2x1bWUsIDAsIHNpemVvZihtaXgtPnNlbmRfdm9sdW1lKSk7CkBAIC0xMTk5LDE1ICsxMjI4LDY5IEBACiAJZXBjbS0+Y2FwdHVyZV9pZHhfcmVnID0gRlhJRFg7CiAJc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGEgPSBlcGNtOwogCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9mcmVlID0gc25kX2VtdTEwazFfcGNtX2ZyZWVfc3Vic3RyZWFtOwotCXJ1bnRpbWUtPmh3ID0gc25kX2VtdTEwazFfY2FwdHVyZTsKKwlydW50aW1lLT5odyA9IHNuZF9lbXUxMGsxX2NhcHR1cmVfZWZ4OwogCXJ1bnRpbWUtPmh3LnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDA7CiAJcnVudGltZS0+aHcucmF0ZV9taW4gPSBydW50aW1lLT5ody5yYXRlX21heCA9IDQ4MDAwOwogCXNwaW5fbG9ja19pcnEoJmVtdS0+cmVnX2xvY2spOwotCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IHJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IDA7Ci0JZm9yIChpZHggPSAwOyBpZHggPCBuZWZ4OyBpZHgrKykgewotCQlpZiAoZW11LT5lZnhfdm9pY2VzX21hc2tbaWR4LzMyXSAmICgxIDw8IChpZHglMzIpKSkgewotCQkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluKys7Ci0JCQlydW50aW1lLT5ody5jaGFubmVsc19tYXgrKzsKKwlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11MTAxMCkgeworCQkvKiBUT0RPIAorCQkgKiBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFCisJCSAqIFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAorCQkgKiBTTkRSVl9QQ01fUkFURV84ODIwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKKwkJICogU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwCisJCSAqIHJhdGVfbWluID0gNDQxMDAsCisJCSAqIHJhdGVfbWF4ID0gMTkyMDAwLAorCQkgKiBjaGFubmVsc19taW4gPSA4LAorCQkgKiBjaGFubmVsc19tYXggPSA4LAorCQkgKiBOZWVkIHRvIGFkZCBtaXhlciBjb250cm9sIHRvIGZpeCBzYW1wbGUgcmF0ZQorCQkgKiAgICAgICAgICAgICAgICAgCisJCSAqIFRoZXJlIGFyZSAxNiBtb25vIGNoYW5uZWxzIG9mIDE2Yml0cyBlYWNoLgorCQkgKiAyNGJpdCBBdWRpbyB1c2VzIDJ4IGNoYW5uZWxzIG92ZXIgMTZiaXQKKwkJICogOTZrSHogdXNlcyAyeCBjaGFubmVscyBvdmVyIDQ4a0h6CisJCSAqIDE5MmtIeiB1c2VzIDR4IGNoYW5uZWxzIG92ZXIgNDhrSHoKKwkJICogU28sIGZvciA0OGtIeiAyNGJpdCwgb25lIGhhcyA4IGNoYW5uZWxzCisJCSAqIGZvciA5NmtIeiAyNGJpdCwgb25lIGhhcyA0IGNoYW5uZWxzCisJCSAqIGZvciAxOTJrSHogMjRiaXQsIG9uZSBoYXMgMiBjaGFubmVscworCQkgKi8KKyNpZiAxCisJCXN3aXRjaCAoZW11LT5lbXUxMDEwLmludGVybmFsX2Nsb2NrKSB7CisJCWNhc2UgMDoKKwkJCS8qIEZvciA0NC4xa0h6ICovCisJCQlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwOworCQkJcnVudGltZS0+aHcucmF0ZV9taW4gPSBydW50aW1lLT5ody5yYXRlX21heCA9IDQ0MTAwOworCQkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gODsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkvKiBGb3IgNDhrSHogKi8KKwkJCXJ1bnRpbWUtPmh3LnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDA7CisJCQlydW50aW1lLT5ody5yYXRlX21pbiA9IHJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gNDgwMDA7CisJCQlydW50aW1lLT5ody5jaGFubmVsc19taW4gPSBydW50aW1lLT5ody5jaGFubmVsc19tYXggPSA4OworCQkJYnJlYWs7CisJCX07CisjZW5kaWYKKyNpZiAwCisJCS8qIEZvciA5NmtIeiAqLworCQlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzk2MDAwOworCQlydW50aW1lLT5ody5yYXRlX21pbiA9IHJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gOTYwMDA7CisJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IHJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IDQ7CisjZW5kaWYKKyNpZiAwCisJCS8qIEZvciAxOTJrSHogKi8KKwkJcnVudGltZS0+aHcucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8xOTIwMDA7CisJCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0gcnVudGltZS0+aHcucmF0ZV9tYXggPSAxOTIwMDA7CisJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbiA9IHJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IDI7CisjZW5kaWYKKwkJcnVudGltZS0+aHcuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFOworCQkvKiBlZnhfdm9pY2VzX21hc2tbMF0gaXMgZXhwZWN0ZWQgdG8gYmUgemVybworIAkJICogZWZ4X3ZvaWNlc19tYXNrWzFdIGlzIGV4cGVjdGVkIHRvIGhhdmUgMTZiaXRzIHNldAorCQkgKi8KKwl9IGVsc2UgeworCQlydW50aW1lLT5ody5jaGFubmVsc19taW4gPSBydW50aW1lLT5ody5jaGFubmVsc19tYXggPSAwOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG5lZng7IGlkeCsrKSB7CisJCQlpZiAoZW11LT5lZnhfdm9pY2VzX21hc2tbaWR4LzMyXSAmICgxIDw8IChpZHglMzIpKSkgeworCQkJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21pbisrOworCQkJCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCsrOworCQkJfQogCQl9CiAJfQogCWVwY20tPmNhcHR1cmVfY3JfdmFsID0gZW11LT5lZnhfdm9pY2VzX21hc2tbMF07CkBAIC0xNDYwLDcgKzE1NDMsNyBAQAogCQkJCQkJICAgdW5zaWduZWQgaW50IGNvdW50LAogCQkJCQkJICAgdW5zaWduZWQgaW50IHRyYW1fc2hpZnQpCiB7Ci0JLy8gcHJpbnRrKCJ0cmFtX3Bva2UxOiBkc3RfbGVmdCA9IDB4JXAsIGRzdF9yaWdodCA9IDB4JXAsIHNyYyA9IDB4JXAsIGNvdW50ID0gMHgleFxuIiwgZHN0X2xlZnQsIGRzdF9yaWdodCwgc3JjLCBjb3VudCk7CisJLyogcHJpbnRrKCJ0cmFtX3Bva2UxOiBkc3RfbGVmdCA9IDB4JXAsIGRzdF9yaWdodCA9IDB4JXAsIHNyYyA9IDB4JXAsIGNvdW50ID0gMHgleFxuIiwgZHN0X2xlZnQsIGRzdF9yaWdodCwgc3JjLCBjb3VudCk7ICovCiAJaWYgKCh0cmFtX3NoaWZ0ICYgMSkgPT0gMCkgewogCQl3aGlsZSAoY291bnQtLSkgewogCQkJKmRzdF9sZWZ0LS0gPSAqc3JjKys7CkBAIC0xNTM3LDcgKzE2MjAsNyBAQAogCXN0cnVjdCBzbmRfZW11MTBrMV9meDgwMTBfcGNtICpwY20gPSAmZW11LT5meDgwMTAucGNtW3N1YnN0cmVhbS0+bnVtYmVyXTsKIAl1bnNpZ25lZCBpbnQgaTsKIAkKLQkvLyBwcmludGsoInByZXBhcmU6IGV0cmFtX3BhZ2VzID0gMHglcCwgZG1hX2FyZWEgPSAweCV4LCBidWZmZXJfc2l6ZSA9IDB4JXggKDB4JXgpXG4iLCBlbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcywgcnVudGltZS0+ZG1hX2FyZWEsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBydW50aW1lLT5idWZmZXJfc2l6ZSA8PCAyKTsKKwkvKiBwcmludGsoInByZXBhcmU6IGV0cmFtX3BhZ2VzID0gMHglcCwgZG1hX2FyZWEgPSAweCV4LCBidWZmZXJfc2l6ZSA9IDB4JXggKDB4JXgpXG4iLCBlbXUtPmZ4ODAxMC5ldHJhbV9wYWdlcywgcnVudGltZS0+ZG1hX2FyZWEsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBydW50aW1lLT5idWZmZXJfc2l6ZSA8PCAyKTsgKi8KIAltZW1zZXQoJnBjbS0+cGNtX3JlYywgMCwgc2l6ZW9mKHBjbS0+cGNtX3JlYykpOwogCXBjbS0+cGNtX3JlYy5od19idWZmZXJfc2l6ZSA9IHBjbS0+YnVmZmVyX3NpemUgKiAyOyAvKiBieXRlIHNpemUgKi8KIAlwY20tPnBjbV9yZWMuc3dfYnVmZmVyX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXByb2MuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXByb2MuYwppbmRleCBiOTM5ZTAzLi4yYzE1ODU5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwcm9jLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11cHJvYy5jCkBAIC0zLDYgKzMsOSBAQAogICogICAgICAgICAgICAgICAgICAgQ3JlYXRpdmUgTGFicywgSW5jLgogICogIFJvdXRpbmVzIGZvciBjb250cm9sIG9mIEVNVTEwSzEgY2hpcHMgLyBwcm9jIGludGVyZmFjZSByb3V0aW5lcwogICoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphbWVzIENvdXJ0aWVyLUR1dHRvbiA8SmFtZXNAc3VwZXJidWcuY28udWs+CisgKiAgCUFkZGVkIEVNVSAxMDEwIHN1cHBvcnQuCisgKgogICogIEJVR1M6CiAgKiAgICAtLQogICoKQEAgLTI1NSw3ICsyNTgsNyBAQAogCXVuc2lnbmVkIGludCB2YWwsIHRtcCwgbjsKIAl2YWwgPSBzbmRfZW11MTBrMV9wdHIyMF9yZWFkKGVtdSwgQ0FQVFVSRV9SQVRFX1NUQVRVUywgMCk7CiAJdG1wID0gKHZhbCA+PiAxNikgJiAweDg7Ci0JZm9yIChuPTA7bjw0O24rKykgeworCWZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKIAkJdG1wID0gdmFsID4+ICgxNiArIChuKjQpKTsKIAkJaWYgKHRtcCAmIDB4OCkgc25kX2lwcmludGYoYnVmZmVyLCAiQ2hhbm5lbCAlZDogUmF0ZT0lZFxuIiwgbiwgc2FtcGxlcmF0ZVt0bXAgJiAweDddKTsKIAkJZWxzZSBzbmRfaXByaW50ZihidWZmZXIsICJDaGFubmVsICVkOiBObyBpbnB1dFxuIiwgbik7CkBAIC0zNzIsNiArMzc1LDI3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCitzdGF0aWMgdm9pZCBzbmRfZW11X3Byb2NfZW11MTAxMF9yZWdfcmVhZChzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5LAorCQkJCSAgICAgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQoreworCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gZW50cnktPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyByZWdzOworCWludCBpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkVNVTEwMTAgUmVnaXN0ZXJzOlxuXG4iKTsKKworCWZvcihpID0gMDsgaSA8IDB4MzA7IGkrPTEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkJcmVncz1pKzB4NDA7IC8qIDB4NDAgdXB3YXJkcyBhcmUgcmVnaXN0ZXJzLiAqLworCQlvdXRsKHJlZ3MsIGVtdS0+cG9ydCArIEFfSU9DRkcpOworCQlvdXRsKHJlZ3MgfCAweDgwLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsgIC8qIEhpZ2ggYml0IGNsb2NrcyB0aGUgdmFsdWUgaW50byB0aGUgZnBnYS4gKi8KKwkJdmFsdWUgPSBpbmwoZW11LT5wb3J0ICsgQV9JT0NGRyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyWDogJTA4bFgsICUwMmxYXG4iLCBpLCB2YWx1ZSwgKHZhbHVlID4+IDgpICYgMHg3Zik7CisJfQorfQorCiBzdGF0aWMgdm9pZCBzbmRfZW11X3Byb2NfaW9fcmVnX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKIAkJCQkgICAgIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikKIHsKQEAgLTM5OCw3ICs0MjIsNyBAQAogCXdoaWxlICghc25kX2luZm9fZ2V0X2xpbmUoYnVmZmVyLCBsaW5lLCBzaXplb2YobGluZSkpKSB7CiAJCWlmIChzc2NhbmYobGluZSwgIiV4ICV4IiwgJnJlZywgJnZhbCkgIT0gMikKIAkJCWNvbnRpbnVlOwotCQlpZiAoKHJlZyA8IDB4NDApICYmIChyZWcgPj0wKSAmJiAodmFsIDw9IDB4ZmZmZmZmZmYpICkgeworCQlpZiAoKHJlZyA8IDB4NDApICYmIChyZWcgPj0gMCkgJiYgKHZhbCA8PSAweGZmZmZmZmZmKSApIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CiAJCQlvdXRsKHZhbCwgZW11LT5wb3J0ICsgKHJlZyAmIDB4ZmZmZmZmZmMpKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKQEAgLTQ3NCw3ICs0OTgsNyBAQAogCXdoaWxlICghc25kX2luZm9fZ2V0X2xpbmUoYnVmZmVyLCBsaW5lLCBzaXplb2YobGluZSkpKSB7CiAJCWlmIChzc2NhbmYobGluZSwgIiV4ICV4ICV4IiwgJnJlZywgJmNoYW5uZWxfaWQsICZ2YWwpICE9IDMpCiAJCQljb250aW51ZTsKLQkJaWYgKChyZWcgPCAweGEwKSAmJiAocmVnID49MCkgJiYgKHZhbCA8PSAweGZmZmZmZmZmKSAmJiAoY2hhbm5lbF9pZCA+PTApICYmIChjaGFubmVsX2lkIDw9IDMpICkKKwkJaWYgKChyZWcgPCAweGEwKSAmJiAocmVnID49IDApICYmICh2YWwgPD0gMHhmZmZmZmZmZikgJiYgKGNoYW5uZWxfaWQgPj0gMCkgJiYgKGNoYW5uZWxfaWQgPD0gMykgKQogCQkJc25kX3B0cl93cml0ZShlbXUsIGlvYmFzZSwgcmVnLCBjaGFubmVsX2lkLCB2YWwpOwogCX0KIH0KQEAgLTUzMSw2ICs1NTUsMTAgQEAKIHsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwlpZiAoKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmVtdTEwMTApICYmCisJICAgICBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJlbXUxMDEwX3JlZ3MiLCAmZW50cnkpKSB7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCBzbmRfZW11X3Byb2NfZW11MTAxMF9yZWdfcmVhZCk7CisJfQogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgImlvX3JlZ3MiLCAmZW50cnkpKSB7CiAJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCBzbmRfZW11X3Byb2NfaW9fcmVnX3JlYWQpOwogCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2VtdV9wcm9jX2lvX3JlZ193cml0ZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2lvLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9pby5jCmluZGV4IDAyOWU3ODUuLjExNmUxYzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2lvLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvaW8uYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJwMTd2LmgiCiAKIHVuc2lnbmVkIGludCBzbmRfZW11MTBrMV9wdHJfcmVhZChzdHJ1Y3Qgc25kX2VtdTEwazEgKiBlbXUsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCBjaG4pCiB7CkBAIC0xNjcsNiArMTY4LDEwOSBAQAogCXJldHVybiAwOwogfQogCisvKiBUaGUgQURDIGRvZXMgbm90IHN1cHBvcnQgaTJjIHJlYWQsIHNvIG9ubHkgd3JpdGUgaXMgaW1wbGVtZW50ZWQgKi8KK2ludCBzbmRfZW11MTBrMV9pMmNfd3JpdGUoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsCisJCQkJdTMyIHJlZywKKwkJCQl1MzIgdmFsdWUpCit7CisJdTMyIHRtcDsKKwlpbnQgdGltZW91dCA9IDA7CisJaW50IHN0YXR1czsKKwlpbnQgcmV0cnk7CisJaWYgKChyZWcgPiAweDdmKSB8fCAodmFsdWUgPiAweDFmZikpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiaTJjX3dyaXRlOiBpbnZhbGlkIHZhbHVlcy5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0bXAgPSByZWcgPDwgMjUgfCB2YWx1ZSA8PCAxNjsKKwkvLyBzbmRfcHJpbnRrKCJJMkMtd3JpdGU6cmVnPTB4JXgsIHZhbHVlPTB4JXhcbiIsIHJlZywgdmFsdWUpOworCS8qIE5vdCBzdXJlIHdoYXQgdGhpcyBJMkMgY2hhbm5lbCBjb250cm9scy4gKi8KKwkvKiBzbmRfZW11MTBrMV9wdHJfd3JpdGUoZW11LCBQMTdWX0kyQ18wLCAwLCB0bXApOyAqLworCisJLyogVGhpcyBjb250cm9scyB0aGUgSTJDIGNvbm5lY3RlZCB0byB0aGUgV004Nzc1IEFEQyBDb2RlYyAqLworCXNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgUDE3Vl9JMkNfMSwgMCwgdG1wKTsKKwl0bXAgPSBzbmRfZW11MTBrMV9wdHIyMF9yZWFkKGVtdSwgUDE3Vl9JMkNfMSwgMCk7IC8qIHdyaXRlIHBvc3QgKi8KKworCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDEwOyByZXRyeSsrKSB7CisJCS8qIFNlbmQgdGhlIGRhdGEgdG8gaTJjICovCisJCS8vdG1wID0gc25kX2VtdTEwazFfcHRyX3JlYWQoZW11LCBQMTdWX0kyQ19BRERSLCAwKTsKKwkJLy90bXAgPSB0bXAgJiB+KEkyQ19BX0FEQ19SRUFEfEkyQ19BX0FEQ19MQVNUfEkyQ19BX0FEQ19TVEFSVHxJMkNfQV9BRENfQUREX01BU0spOworCQl0bXAgPSAwOworCQl0bXAgPSB0bXAgfCAoSTJDX0FfQURDX0xBU1R8STJDX0FfQURDX1NUQVJUfEkyQ19BX0FEQ19BREQpOworCQlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIFAxN1ZfSTJDX0FERFIsIDAsIHRtcCk7CisKKwkJLyogV2FpdCB0aWxsIHRoZSB0cmFuc2FjdGlvbiBlbmRzICovCisJCXdoaWxlICgxKSB7CisJCQl1ZGVsYXkoMTApOworCQkJc3RhdHVzID0gc25kX2VtdTEwazFfcHRyMjBfcmVhZChlbXUsIFAxN1ZfSTJDX0FERFIsIDApOworICAgICAgICAgICAgICAgIAkvLyBzbmRfcHJpbnRrKCJJMkM6c3RhdHVzPTB4JXhcbiIsIHN0YXR1cyk7CisJCQl0aW1lb3V0Kys7CisJCQlpZiAoKHN0YXR1cyAmIEkyQ19BX0FEQ19TVEFSVCkgPT0gMCkKKwkJCQlicmVhazsKKworCQkJaWYgKHRpbWVvdXQgPiAxMDAwKSB7CisgICAgICAgICAgICAgICAgCQlzbmRfcHJpbnRrKCJlbXUxMGsxOkkyQzp0aW1lb3V0IHN0YXR1cz0weCV4XG4iLCBzdGF0dXMpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vUmVhZCBiYWNrIGFuZCBzZWUgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIHN1Y2Nlc3NmdWwKKwkJaWYgKChzdGF0dXMgJiBJMkNfQV9BRENfQUJPUlQpID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAocmV0cnkgPT0gMTApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiV3JpdGluZyB0byBBREMgZmFpbGVkIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyAgICAKKyAgICAJcmV0dXJuIDA7Cit9CisKK2ludCBzbmRfZW11MTAxMF9mcGdhX3dyaXRlKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgaW50IHJlZywgaW50IHZhbHVlKQoreworCWlmIChyZWcgPCAwIHx8IHJlZyA+IDB4M2YpCisJCXJldHVybiAxOworCXJlZyArPSAweDQwOyAvKiAweDQwIHVwd2FyZHMgYXJlIHJlZ2lzdGVycy4gKi8KKwlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMHgzZikgLyogMCB0byAweDNmIGFyZSB2YWx1ZXMgKi8KKwkJcmV0dXJuIDE7CisJb3V0bChyZWcsIGVtdS0+cG9ydCArIEFfSU9DRkcpOworCXVkZWxheSgxMCk7CisJb3V0bChyZWcgfCAweDgwLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsgIC8qIEhpZ2ggYml0IGNsb2NrcyB0aGUgdmFsdWUgaW50byB0aGUgZnBnYS4gKi8KKwl1ZGVsYXkoMTApOworCW91dGwodmFsdWUsIGVtdS0+cG9ydCArIEFfSU9DRkcpOworCXVkZWxheSgxMCk7CisJb3V0bCh2YWx1ZSB8IDB4ODAgLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsgIC8qIEhpZ2ggYml0IGNsb2NrcyB0aGUgdmFsdWUgaW50byB0aGUgZnBnYS4gKi8KKworCXJldHVybiAwOworfQorCitpbnQgc25kX2VtdTEwMTBfZnBnYV9yZWFkKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgaW50IHJlZywgaW50ICp2YWx1ZSkKK3sKKwlpZiAocmVnIDwgMCB8fCByZWcgPiAweDNmKQorCQlyZXR1cm4gMTsKKwlyZWcgKz0gMHg0MDsgLyogMHg0MCB1cHdhcmRzIGFyZSByZWdpc3RlcnMuICovCisJb3V0bChyZWcsIGVtdS0+cG9ydCArIEFfSU9DRkcpOworCXVkZWxheSgxMCk7CisJb3V0bChyZWcgfCAweDgwLCBlbXUtPnBvcnQgKyBBX0lPQ0ZHKTsgIC8qIEhpZ2ggYml0IGNsb2NrcyB0aGUgdmFsdWUgaW50byB0aGUgZnBnYS4gKi8KKwl1ZGVsYXkoMTApOworCSp2YWx1ZSA9ICgoaW5sKGVtdS0+cG9ydCArIEFfSU9DRkcpID4+IDgpICYgMHg3Zik7CisKKwlyZXR1cm4gMDsKK30KKworLyogRWFjaCBEZXN0aW5hdGlvbiBoYXMgb25lIGFuZCBvbmx5IG9uZSBTb3VyY2UsCisgKiBidXQgb25lIFNvdXJjZSBjYW4gZmVlZCBhbnkgbnVtYmVyIG9mIERlc3RpbmF0aW9ucyBzaW11bHRhbmVvdXNseS4KKyAqLworaW50IHNuZF9lbXUxMDEwX2ZwZ2FfbGlua19kc3Rfc3JjX3dyaXRlKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgaW50IGRzdCwgaW50IHNyYykKK3sKKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgMHgwMCwgKChkc3QgPj4gOCkgJiAweDNmKSApOworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCAweDAxLCAoZHN0ICYgMHgzZikgKTsKKwlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgMHgwMiwgKChzcmMgPj4gOCkgJiAweDNmKSApOworCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCAweDAzLCAoc3JjICYgMHgzZikgKTsKKworCXJldHVybiAwOworfQorCiB2b2lkIHNuZF9lbXUxMGsxX2ludHJfZW5hYmxlKHN0cnVjdCBzbmRfZW11MTBrMSAqZW11LCB1bnNpZ25lZCBpbnQgaW50cmVuYikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvcDE2di5jIGIvc291bmQvcGNpL2VtdTEwazEvcDE2di5jCmluZGV4IDRlMGY5NTQuLjQ2NWY4ZDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCS8vc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAkvL3N0cnVjdCBzbmRfZW11MTBrMV9wY20gKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JZW11LT5wMTZ2X3ZvaWNlc1tzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlIC0gZW11LT5wMTZ2X2RldmljZV9vZmZzZXRdLnVzZT0wOworCWVtdS0+cDE2dl92b2ljZXNbc3Vic3RyZWFtLT5wY20tPmRldmljZSAtIGVtdS0+cDE2dl9kZXZpY2Vfb2Zmc2V0XS51c2UgPSAwOwogCS8qIEZJWE1FOiBtYXliZSB6ZXJvIG90aGVycyAqLwogCXJldHVybiAwOwogfQpAQCAtMjY0LDcgKzI2NCw3IEBACiAJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJLy9zdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCS8vc3RydWN0IHNuZF9lbXUxMGsxX3BjbSAqZXBjbSA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQllbXUtPnAxNnZfY2FwdHVyZV92b2ljZS51c2U9MDsKKwllbXUtPnAxNnZfY2FwdHVyZV92b2ljZS51c2UgPSAwOwogCS8qIEZJWE1FOiBtYXliZSB6ZXJvIG90aGVycyAqLwogCXJldHVybiAwOwogfQpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJICBicmVhazsKIAl9CiAJLyogRklYTUU6IENoZWNrIGVtdS0+YnVmZmVyLnNpemUgYmVmb3JlIGFjdHVhbGx5IHdyaXRpbmcgdG8gaXQuICovCi0JZm9yKGk9MDsgaSA8IHJ1bnRpbWUtPnBlcmlvZHM7IGkrKykgeworCWZvcihpID0gMDsgaSA8IHJ1bnRpbWUtPnBlcmlvZHM7IGkrKykgewogCQl0YWJsZV9iYXNlW2kqMl09cnVudGltZS0+ZG1hX2FkZHIrKGkqcGVyaW9kX3NpemVfYnl0ZXMpOwogCQl0YWJsZV9iYXNlWyhpKjIpKzFdPXBlcmlvZF9zaXplX2J5dGVzPDwxNjsKIAl9CkBAIC0zOTQsNyArMzk0LDcgQEAKIAkvKiBGSVhNRTogQ2hlY2sgZW11LT5idWZmZXIuc2l6ZSBiZWZvcmUgYWN0dWFsbHkgd3JpdGluZyB0byBpdC4gKi8KIAlzbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIDB4MTMsIGNoYW5uZWwsIDApOwogCXNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgQ0FQVFVSRV9ETUFfQUREUiwgY2hhbm5lbCwgcnVudGltZS0+ZG1hX2FkZHIpOwotCXNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgQ0FQVFVSRV9CVUZGRVJfU0laRSwgY2hhbm5lbCwgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKTw8MTYpOyAvLyBidWZmZXIgc2l6ZSBpbiBieXRlcworCXNuZF9lbXUxMGsxX3B0cjIwX3dyaXRlKGVtdSwgQ0FQVFVSRV9CVUZGRVJfU0laRSwgY2hhbm5lbCwgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSA8PCAxNik7IC8vIGJ1ZmZlciBzaXplIGluIGJ5dGVzCiAJc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCBDQVBUVVJFX1BPSU5URVIsIGNoYW5uZWwsIDApOwogCS8vc25kX2VtdTEwazFfcHRyMjBfd3JpdGUoZW11LCBDQVBUVVJFX1NPVVJDRSwgMHgwLCAweDMzMzMwMGU0KTsgLyogU2VsZWN0IE1JQyBvciBMaW5lIGluICovCiAJLy9zbmRfZW11MTBrMV9wdHIyMF93cml0ZShlbXUsIEVYVEVOREVEX0lOVF9NQVNLLCAwLCBzbmRfZW11MTBrMV9wdHIyMF9yZWFkKGVtdSwgRVhURU5ERURfSU5UX01BU0ssIDApIHwgKDB4MTEwMDAwPDxjaGFubmVsKSk7CkBAIC00MzcsNyArNDM3LDcgQEAKICAgICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzOwogCXUzMiBiYXNpYyA9IDA7CiAJdTMyIGludGUgPSAwOwotCWludCBydW5uaW5nPTA7CisJaW50IHJ1bm5pbmcgPSAwOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAlkZWZhdWx0OgotCQlydW5uaW5nPTA7CisJCXJ1bm5pbmcgPSAwOwogCQlicmVhazsKIAl9CiAgICAgICAgIHNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKQEAgLTc4NSw3ICs3ODUsNyBAQAogCX0KICAgICAgICAgcmV0dXJuIGNoYW5nZTsKIH0KLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShzbmRfcDE2dl9kYl9zY2FsZTEsIC01MTc1LCAyNSwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoc25kX3AxNnZfZGJfc2NhbGUxLCAtNTE3NSwgMjUsIDEpOwogCiAjZGVmaW5lIFAxNlZfVk9MKHhuYW1lLHhyZWcseGhsKSB7IFwKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvcDE3di5oIGIvc291bmQvcGNpL2VtdTEwazEvcDE3di5oCmluZGV4IDdkZGI1YmUuLjRlZjVmNjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxN3YuaAorKysgYi9zb3VuZC9wY2kvZW11MTBrMS9wMTd2LmgKQEAgLTQzLDYgKzQzLDUzIEBACiAjZGVmaW5lIFAxN1ZfSTJDX0FERFIJCTB4M2QJLyogSTJDIEFkZHJlc3MgKi8KICNkZWZpbmUgUDE3Vl9JMkNfMAkJMHgzZQkvKiBJMkMgRGF0YSAqLwogI2RlZmluZSBQMTdWX0kyQ18xCQkweDNmCS8qIEkyQyBEYXRhICovCisvKiBJMkMgdmFsdWVzICovCisjZGVmaW5lIEkyQ19BX0FEQ19BRERfTUFTSwkweDAwMDAwMGZlCS8qVGhlIGFkZHJlc3MgaXMgYSA3IGJpdCBhZGRyZXNzICovCisjZGVmaW5lIEkyQ19BX0FEQ19SV19NQVNLCTB4MDAwMDAwMDEJLypiaXQgbWFzayBmb3IgUi9XICovCisjZGVmaW5lIEkyQ19BX0FEQ19UUkFOU19NQVNLCTB4MDAwMDAwMTAgIAkvKkJpdCBtYXNrIGZvciBJMmMgYWRkcmVzcyBEQUMgdmFsdWUgICovCisjZGVmaW5lIEkyQ19BX0FEQ19BQk9SVF9NQVNLCTB4MDAwMDAwMjAJLypCaXQgbWFzayBmb3IgSTJDIHRyYW5zYWN0aW9uIGFib3J0IGZsYWcgKi8KKyNkZWZpbmUgSTJDX0FfQURDX0xBU1RfTUFTSwkweDAwMDAwMDQwCS8qQml0IG1hc2sgZm9yIExhc3Qgd29yZCB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBJMkNfQV9BRENfQllURV9NQVNLCTB4MDAwMDAwODAJLypCaXQgbWFzayBmb3IgQnl0ZSBNb2RlICovCisKKyNkZWZpbmUgSTJDX0FfQURDX0FERAkJMHgwMDAwMDAzNAkvKlRoaXMgaXMgdGhlIERldmljZSBhZGRyZXNzIGZvciBBREMgICovCisjZGVmaW5lIEkyQ19BX0FEQ19SRUFECQkweDAwMDAwMDAxCS8qVG8gcGVyZm9ybSBhIHJlYWQgb3BlcmF0aW9uICovCisjZGVmaW5lIEkyQ19BX0FEQ19TVEFSVAkJMHgwMDAwMDEwMAkvKlN0YXJ0IEkyQyB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBJMkNfQV9BRENfQUJPUlQJCTB4MDAwMDAyMDAJLypJMkMgdHJhbnNhY3Rpb24gYWJvcnQgKi8KKyNkZWZpbmUgSTJDX0FfQURDX0xBU1QJCTB4MDAwMDA0MDAJLypJMkMgbGFzdCB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBJMkNfQV9BRENfQllURQkJMHgwMDAwMDgwMAkvKkkyQyBvbmUgYnl0ZSBtb2RlICovCisKKyNkZWZpbmUgSTJDX0RfQURDX1JFR19NQVNLCTB4ZmUwMDAwMDAgIAkvKkFEQyBhZGRyZXNzIHJlZ2lzdGVyICovIAorI2RlZmluZSBJMkNfRF9BRENfREFUX01BU0sJMHgwMWZmMDAwMCAgCS8qQURDIGRhdGEgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBBRENfVElNRU9VVAkJMHgwMDAwMDAwNwkvKkFEQyBUaW1lb3V0IENsb2NrIERpc2FibGUgKi8KKyNkZWZpbmUgQURDX0lGQ19DVFJMCQkweDAwMDAwMDBiCS8qQURDIEludGVyZmFjZSBDb250cm9sICovCisjZGVmaW5lIEFEQ19NQVNURVIJCTB4MDAwMDAwMGMJLypBREMgTWFzdGVyIE1vZGUgQ29udHJvbCAqLworI2RlZmluZSBBRENfUE9XRVIJCTB4MDAwMDAwMGQJLypBREMgUG93ZXJEb3duIENvbnRyb2wgKi8KKyNkZWZpbmUgQURDX0FUVEVOX0FEQ0wJCTB4MDAwMDAwMGUJLypBREMgQXR0ZW51YXRpb24gQURDTCAqLworI2RlZmluZSBBRENfQVRURU5fQURDUgkJMHgwMDAwMDAwZgkvKkFEQyBBdHRlbnVhdGlvbiBBRENSICovCisjZGVmaW5lIEFEQ19BTENfQ1RSTDEJCTB4MDAwMDAwMTAJLypBREMgQUxDIENvbnRyb2wgMSAqLworI2RlZmluZSBBRENfQUxDX0NUUkwyCQkweDAwMDAwMDExCS8qQURDIEFMQyBDb250cm9sIDIgKi8KKyNkZWZpbmUgQURDX0FMQ19DVFJMMwkJMHgwMDAwMDAxMgkvKkFEQyBBTEMgQ29udHJvbCAzICovCisjZGVmaW5lIEFEQ19OT0lTRV9DVFJMCQkweDAwMDAwMDEzCS8qQURDIE5vaXNlIEdhdGUgQ29udHJvbCAqLworI2RlZmluZSBBRENfTElNSVRfQ1RSTAkJMHgwMDAwMDAxNAkvKkFEQyBMaW1pdGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgQURDX01VWAkJCTB4MDAwMDAwMTUgIAkvKkFEQyBNdXggb2Zmc2V0ICovCisjaWYgMAorLyogRklYTUU6IE5vdCB0ZXN0ZWQgeWV0LiAqLworI2RlZmluZSBBRENfR0FJTl9NQVNLCQkweDAwMDAwMGZmCS8vTWFzayBmb3IgQURDIEdhaW4KKyNkZWZpbmUgQURDX1pFUk9EQgkJMHgwMDAwMDBjZgkvL1ZhbHVlIHRvIHNldCBBREMgdG8gMGRCCisjZGVmaW5lIEFEQ19NVVRFX01BU0sJCTB4MDAwMDAwYzAJLy9NYXNrIGZvciBBREMgbXV0ZQorI2RlZmluZSBBRENfTVVURQkJMHgwMDAwMDBjMAkvL1ZhbHVlIHRvIG11dGUgQURDCisjZGVmaW5lIEFEQ19PU1IJCQkweDAwMDAwMDA4CS8vTWFzayBmb3IgQURDIG92ZXJzYW1wbGUgcmF0ZSBzZWxlY3QKKyNkZWZpbmUgQURDX1RJTUVPVVRfRElTQUJMRQkweDAwMDAwMDA4CS8vVmFsdWUgYW5kIG1hc2sgdG8gZGlzYWJsZSBUaW1lb3V0IGNsb2NrCisjZGVmaW5lIEFEQ19IUEZfRElTQUJMRQkJMHgwMDAwMDEwMAkvL1ZhbHVlIGFuZCBtYXNrIHRvIGRpc2FibGUgSGlnaCBwYXNzIGZpbHRlcgorI2RlZmluZSBBRENfVFJBTldJTl9NQVNLCTB4MDAwMDAwNzAJLy9NYXNrIGZvciBMZW5ndGggb2YgVHJhbnNpZW50IFdpbmRvdworI2VuZGlmCisKKyNkZWZpbmUgQURDX01VWF9NQVNLCQkweDAwMDAwMDBmCS8vTWFzayBmb3IgQURDIE11eAorI2RlZmluZSBBRENfTVVYXzAJCTB4MDAwMDAwMDEJLy9WYWx1ZSB0byBzZWxlY3QgVW5rbm93biBhdCBBREMgTXV4IChOb3QgdXNlZCkKKyNkZWZpbmUgQURDX01VWF8xCQkweDAwMDAwMDAyCS8vVmFsdWUgdG8gc2VsZWN0IFVua25vd24gYXQgQURDIE11eCAoTm90IHVzZWQpCisjZGVmaW5lIEFEQ19NVVhfMgkJMHgwMDAwMDAwNAkvL1ZhbHVlIHRvIHNlbGVjdCBNaWMgYXQgQURDIE11eAorI2RlZmluZSBBRENfTVVYXzMJCTB4MDAwMDAwMDgJLy9WYWx1ZSB0byBzZWxlY3QgTGluZS1JbiBhdCBBREMgTXV4CiAKICNkZWZpbmUgUDE3Vl9TVEFSVF9BVURJTwkweDQwCS8qIFN0YXJ0IEF1ZGlvIGJpdCAqLwogLyogNDEgLSA0NzogUmVzZXJ2ZWQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMgYi9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jCmluZGV4IDk0ZWNhODIuLjFkYjUwZmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYwpAQCAtODMsNyArODMsNyBAQAogCWlmIChmaXJzdF92b2ljZSA9PSBsYXN0X3ZvaWNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAkKLQlmb3IgKGk9MDsgaSA8IG51bWJlcjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7CiAJCXZvaWNlID0gJmVtdS0+dm9pY2VzWyhmaXJzdF92b2ljZSArIGkpICUgTlVNX0ddOwogCQkvLyBwcmludGsoInZvaWNlIGFsbG9jIC0gJWksICVpIG9mICVpXG4iLCB2b2ljZS0+bnVtYmVyLCBpZHgtZmlyc3Rfdm9pY2UrMSwgbnVtYmVyKTsKIAkJdm9pY2UtPnVzZSA9IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW5zMTM3MC5jIGIvc291bmQvcGNpL2VuczEzNzAuYwppbmRleCBhODRmNmIyLi40MjViMTY3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW5zMTM3MC5jCisrKyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKQEAgLTQxMyw4ICs0MTMsNiBAQAogCX0gdTsKIAogCXN0cnVjdCBwY2lfZGV2ICpwY2k7Ci0JdW5zaWduZWQgc2hvcnQgc3Vic3lzdGVtX3ZlbmRvcl9pZDsKLQl1bnNpZ25lZCBzaG9ydCBzdWJzeXN0ZW1fZGV2aWNlX2lkOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtMTsJLyogREFDMS9BREMgUENNICovCiAJc3RydWN0IHNuZF9wY20gKnBjbTI7CS8qIERBQzIgUENNICovCkBAIC0xNjA3LDExICsxNjA1LDI2IEBACiAJZW5zb25pcS0+dS5lczEzNzEuYWM5NyA9IE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgeworc3RydWN0IGVzMTM3MV9xdWlyayB7CiAJdW5zaWduZWQgc2hvcnQgdmlkOwkJLyogdmVuZG9yIElEICovCiAJdW5zaWduZWQgc2hvcnQgZGlkOwkJLyogZGV2aWNlIElEICovCiAJdW5zaWduZWQgY2hhciByZXY7CQkvKiByZXZpc2lvbiAqLwotfSBlczEzNzFfc3BkaWZfcHJlc2VudFtdIF9fZGV2aW5pdGRhdGEgPSB7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlczEzNzFfcXVpcmtfbG9va3VwKHN0cnVjdCBlbnNvbmlxICplbnNvbmlxLAorCQkJCQkgc3RydWN0IGVzMTM3MV9xdWlyayAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdC0+dmlkICE9ICh1bnNpZ25lZCBzaG9ydClQQ0lfQU5ZX0lEKSB7CisJCWlmIChlbnNvbmlxLT5wY2ktPnZlbmRvciA9PSBsaXN0LT52aWQgJiYKKwkJICAgIGVuc29uaXEtPnBjaS0+ZGV2aWNlID09IGxpc3QtPmRpZCAmJgorCQkgICAgZW5zb25pcS0+cmV2ID09IGxpc3QtPnJldikKKwkJCXJldHVybiAxOworCQlsaXN0Kys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVzMTM3MV9xdWlyayBlczEzNzFfc3BkaWZfcHJlc2VudFtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyAudmlkID0gUENJX1ZFTkRPUl9JRF9FTlNPTklRLCAuZGlkID0gUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MCwgLnJldiA9IENUNTg4MFJFVl9DVDU4ODBfQyB9LAogCXsgLnZpZCA9IFBDSV9WRU5ET1JfSURfRU5TT05JUSwgLmRpZCA9IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAsIC5yZXYgPSBDVDU4ODBSRVZfQ1Q1ODgwX0QgfSwKIAl7IC52aWQgPSBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIC5kaWQgPSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwLCAucmV2ID0gQ1Q1ODgwUkVWX0NUNTg4MF9FIH0sCkBAIC0xNjIwLDEyICsxNjMzLDE5IEBACiAJeyAudmlkID0gUENJX0FOWV9JRCwgLmRpZCA9IFBDSV9BTllfSUQgfQogfTsKIAotc3RhdGljIGludCBzbmRfZW5zb25pcV8xMzcxX21peGVyKHN0cnVjdCBlbnNvbmlxICogZW5zb25pcSwgaW50IGhhc19zcGRpZiwgaW50IGhhc19saW5lKQorc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGVuczEzNzNfbGluZV9xdWlya1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJU05EX1BDSV9RVUlSS19JRCgweDEyNzQsIDB4MjAwMCksIC8qIEdBLTdEWFIgKi8KKwlTTkRfUENJX1FVSVJLX0lEKDB4MTQ1OCwgMHhhMDAwKSwgLyogR0EtOElFWFAgKi8KKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZW5zb25pcV8xMzcxX21peGVyKHN0cnVjdCBlbnNvbmlxICplbnNvbmlxLAorCQkJCQkgICAgaW50IGhhc19zcGRpZiwgaW50IGhhc19saW5lKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGVuc29uaXEtPmNhcmQ7CiAJc3RydWN0IHNuZF9hYzk3X2J1cyAqcGJ1czsKIAlzdHJ1Y3Qgc25kX2FjOTdfdGVtcGxhdGUgYWM5NzsKLQlpbnQgZXJyLCBpZHg7CisJaW50IGVycjsKIAlzdGF0aWMgc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgb3BzID0gewogCQkud3JpdGUgPSBzbmRfZXMxMzcxX2NvZGVjX3dyaXRlLAogCQkucmVhZCA9IHNuZF9lczEzNzFfY29kZWNfcmVhZCwKQEAgLTE2NDEsMzMgKzE2NjEsMjggQEAKIAlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX0FVRElPOwogCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIocGJ1cywgJmFjOTcsICZlbnNvbmlxLT51LmVzMTM3MS5hYzk3KSkgPCAwKQogCQlyZXR1cm4gZXJyOwotCWZvciAoaWR4ID0gMDsgZXMxMzcxX3NwZGlmX3ByZXNlbnRbaWR4XS52aWQgIT0gKHVuc2lnbmVkIHNob3J0KVBDSV9BTllfSUQ7IGlkeCsrKQotCQlpZiAoKGVuc29uaXEtPnBjaS0+dmVuZG9yID09IGVzMTM3MV9zcGRpZl9wcmVzZW50W2lkeF0udmlkICYmCi0JCSAgICAgZW5zb25pcS0+cGNpLT5kZXZpY2UgPT0gZXMxMzcxX3NwZGlmX3ByZXNlbnRbaWR4XS5kaWQgJiYKLQkJICAgICBlbnNvbmlxLT5yZXYgPT0gZXMxMzcxX3NwZGlmX3ByZXNlbnRbaWR4XS5yZXYpIHx8IGhhc19zcGRpZiA+IDApIHsKLQkJICAgIAlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOwotCQkJaW50IGksIGluZGV4ID0gMDsgCisJaWYgKGhhc19zcGRpZiA+IDAgfHwKKwkgICAgKCFoYXNfc3BkaWYgJiYgZXMxMzcxX3F1aXJrX2xvb2t1cChlbnNvbmlxLCBlczEzNzFfc3BkaWZfcHJlc2VudCkpKSB7CisJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CisJCWludCBpLCBpbmRleCA9IDA7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNfc3BkaWYgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJZW5zb25pcS0+c3BkaWZfZGVmYXVsdCA9IGVuc29uaXEtPnNwZGlmX3N0cmVhbSA9CisJCQlTTkRSVl9QQ01fREVGQVVMVF9DT05fU1BESUY7CisJCW91dGwoZW5zb25pcS0+c3BkaWZfZGVmYXVsdCwgRVNfUkVHKGVuc29uaXEsIENIQU5ORUxfU1RBVFVTKSk7CiAKLQkJCWVuc29uaXEtPnNwZGlmX2RlZmF1bHQgPSBlbnNvbmlxLT5zcGRpZl9zdHJlYW0gPQotCQkJCVNORFJWX1BDTV9ERUZBVUxUX0NPTl9TUERJRjsKLQkJCW91dGwoZW5zb25pcS0+c3BkaWZfZGVmYXVsdCwgRVNfUkVHKGVuc29uaXEsIENIQU5ORUxfU1RBVFVTKSk7CisJCWlmIChlbnNvbmlxLT51LmVzMTM3MS5hYzk3LT5leHRfaWQgJiBBQzk3X0VJX1NQRElGKQorCQkJaW5kZXgrKzsKIAotCQkgICAgCWlmIChlbnNvbmlxLT51LmVzMTM3MS5hYzk3LT5leHRfaWQgJiBBQzk3X0VJX1NQRElGKQotCQkJICAgIAlpbmRleCsrOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgKGludClBUlJBWV9TSVpFKHNuZF9lczEzNzFfbWl4ZXJfc3BkaWYpOyBpKyspIHsKLQkJCQlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfZXMxMzcxX21peGVyX3NwZGlmW2ldLCBlbnNvbmlxKTsKLQkJCQlpZiAoISBrY3RsKQotCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQlrY3RsLT5pZC5pbmRleCA9IGluZGV4OwotCQkJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCkpIDwgMCkKLQkJCQkJcmV0dXJuIGVycjsKLQkJCX0KLQkJCWJyZWFrOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzbmRfZXMxMzcxX21peGVyX3NwZGlmKTsgaSsrKSB7CisJCQlrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfZXMxMzcxX21peGVyX3NwZGlmW2ldLCBlbnNvbmlxKTsKKwkJCWlmICgha2N0bCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWtjdGwtPmlkLmluZGV4ID0gaW5kZXg7CisJCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CiAJCX0KKwl9CiAJaWYgKGVuc29uaXEtPnUuZXMxMzcxLmFjOTctPmV4dF9pZCAmIEFDOTdfRUlfU0RBQykgewogCQkvKiBtaXJyb3IgcmVhciB0byBmcm9udCBzcGVha2VycyAqLwogCQllbnNvbmlxLT5jc3NyICY9IH4oRVNfMTM3M19SRUFSX0JJVDI3fEVTXzEzNzNfUkVBUl9CSVQyNCk7CkBAIC0xNjc2LDEyICsxNjkxLDEwIEBACiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9Ci0JaWYgKCgoZW5zb25pcS0+c3Vic3lzdGVtX3ZlbmRvcl9pZCA9PSAweDEyNzQpICYmCi0JICAgIChlbnNvbmlxLT5zdWJzeXN0ZW1fZGV2aWNlX2lkID09IDB4MjAwMCkpIHx8IC8qIEdBLTdEWFIgKi8KLQkgICAgKChlbnNvbmlxLT5zdWJzeXN0ZW1fdmVuZG9yX2lkID09IDB4MTQ1OCkgJiYKLQkgICAgKGVuc29uaXEtPnN1YnN5c3RlbV9kZXZpY2VfaWQgPT0gMHhhMDAwKSkgfHwgLyogR0EtOElFWFAgKi8KLQkgICAgaGFzX2xpbmUgPiAwKSB7Ci0JCSBlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9lbnMxMzczX2xpbmUsIGVuc29uaXEpKTsKKwlpZiAoaGFzX2xpbmUgPiAwIHx8CisJICAgIHNuZF9wY2lfcXVpcmtfbG9va3VwKGVuc29uaXEtPnBjaSwgZW5zMTM3M19saW5lX3F1aXJrKSkgeworCQkgZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfZW5zMTM3M19saW5lLAorCQkJCQkJICAgICAgZW5zb25pcSkpOwogCQkgaWYgKGVyciA8IDApCiAJCQkgcmV0dXJuIGVycjsKIAl9CkBAIC0xOTU2LDIxICsxOTY5LDE1IEBACiB9CiAKICNpZmRlZiBDSElQMTM3MQotc3RhdGljIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQgc3ZpZDsJCS8qIHN1YnN5c3RlbSB2ZW5kb3IgSUQgKi8KLQl1bnNpZ25lZCBzaG9ydCBzZGlkOwkJLyogc3Vic3lzdGVtIGRldmljZSBJRCAqLwotfSBlczEzNzFfYW1wbGlmaWVyX2hhY2tbXSA9IHsKLQl7IC5zdmlkID0gMHgxMDdiLCAuc2RpZCA9IDB4MjE1MCB9LAkvKiBHYXRld2F5IFNvbG8gMjE1MCAqLwotCXsgLnN2aWQgPSAweDEzYmQsIC5zZGlkID0gMHgxMDBjIH0sCS8qIEVWMTkzOCBvbiBNZWJpdXMgUEMtTUoxMDBWICovCi0JeyAuc3ZpZCA9IDB4MTEwMiwgLnNkaWQgPSAweDU5MzggfSwJLyogVGFyZ2EgWHRlbmRlcjMwMCAqLwotCXsgLnN2aWQgPSAweDExMDIsIC5zZGlkID0gMHg4OTM4IH0sCS8qIElQQyBUb3Bub3RlIEcgbm90ZWJvb2sgKi8KLQl7IC5zdmlkID0gUENJX0FOWV9JRCwgLnNkaWQgPSBQQ0lfQU5ZX0lEIH0KK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBlczEzNzFfYW1wbGlmaWVyX2hhY2tbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUktfSUQoMHgxMDdiLCAweDIxNTApLAkvKiBHYXRld2F5IFNvbG8gMjE1MCAqLworCVNORF9QQ0lfUVVJUktfSUQoMHgxM2JkLCAweDEwMGMpLAkvKiBFVjE5Mzggb24gTWViaXVzIFBDLU1KMTAwViAqLworCVNORF9QQ0lfUVVJUktfSUQoMHgxMTAyLCAweDU5MzgpLAkvKiBUYXJnYSBYdGVuZGVyMzAwICovCisJU05EX1BDSV9RVUlSS19JRCgweDExMDIsIDB4ODkzOCksCS8qIElQQyBUb3Bub3RlIEcgbm90ZWJvb2sgKi8KKwl7IH0gLyogZW5kICovCiB9Owotc3RhdGljIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQgdmlkOwkJLyogdmVuZG9yIElEICovCi0JdW5zaWduZWQgc2hvcnQgZGlkOwkJLyogZGV2aWNlIElEICovCi0JdW5zaWduZWQgY2hhciByZXY7CQkvKiByZXZpc2lvbiAqLwotfSBlczEzNzFfYWM5N19yZXNldF9oYWNrW10gPSB7CisKK3N0YXRpYyBzdHJ1Y3QgZXMxMzcxX3F1aXJrIGVzMTM3MV9hYzk3X3Jlc2V0X2hhY2tbXSA9IHsKIAl7IC52aWQgPSBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIC5kaWQgPSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwLCAucmV2ID0gQ1Q1ODgwUkVWX0NUNTg4MF9DIH0sCiAJeyAudmlkID0gUENJX1ZFTkRPUl9JRF9FTlNPTklRLCAuZGlkID0gUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MCwgLnJldiA9IENUNTg4MFJFVl9DVDU4ODBfRCB9LAogCXsgLnZpZCA9IFBDSV9WRU5ET1JfSURfRU5TT05JUSwgLmRpZCA9IFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAsIC5yZXYgPSBDVDU4ODBSRVZfQ1Q1ODgwX0UgfSwKQEAgLTE5ODQsNyArMTk5MSw2IEBACiB7CiAjaWZkZWYgQ0hJUDEzNzEKIAlpbnQgaWR4OwotCXN0cnVjdCBwY2lfZGV2ICpwY2kgPSBlbnNvbmlxLT5wY2k7CiAjZW5kaWYKIAkvKiB0aGlzIGNvZGUgd2FzIHBhcnQgb2Ygc25kX2Vuc29uaXFfY3JlYXRlIGJlZm9yZSBpbnRydWR1Y3Rpb24KIAkgICogb2Ygc3VzcGVuZC9yZXN1bWUKQEAgLTE5OTksMTYgKzIwMDUsMTIgQEAKIAlvdXRsKGVuc29uaXEtPmN0cmwsIEVTX1JFRyhlbnNvbmlxLCBDT05UUk9MKSk7CiAJb3V0bChlbnNvbmlxLT5zY3RybCwgRVNfUkVHKGVuc29uaXEsIFNFUklBTCkpOwogCW91dGwoMCwgRVNfUkVHKGVuc29uaXEsIDEzNzFfTEVHQUNZKSk7Ci0JZm9yIChpZHggPSAwOyBlczEzNzFfYWM5N19yZXNldF9oYWNrW2lkeF0udmlkICE9ICh1bnNpZ25lZCBzaG9ydClQQ0lfQU5ZX0lEOyBpZHgrKykKLQkJaWYgKHBjaS0+dmVuZG9yID09IGVzMTM3MV9hYzk3X3Jlc2V0X2hhY2tbaWR4XS52aWQgJiYKLQkJICAgIHBjaS0+ZGV2aWNlID09IGVzMTM3MV9hYzk3X3Jlc2V0X2hhY2tbaWR4XS5kaWQgJiYKLQkJICAgIGVuc29uaXEtPnJldiA9PSBlczEzNzFfYWM5N19yZXNldF9oYWNrW2lkeF0ucmV2KSB7Ci0JCQlvdXRsKGVuc29uaXEtPmNzc3IsIEVTX1JFRyhlbnNvbmlxLCBTVEFUVVMpKTsKLQkJCS8qIG5lZWQgdG8gZGVsYXkgYXJvdW5kIDIwbXMoYmxlZWNoKSB0byBnaXZlCi0JCQlzb21lIENPREVDcyBlbm91Z2ggdGltZSB0byB3YWtldXAgKi8KLQkJCW1zbGVlcCgyMCk7Ci0JCQlicmVhazsKLQkJfQorCWlmIChlczEzNzFfcXVpcmtfbG9va3VwKGVuc29uaXEsIGVzMTM3MV9hYzk3X3Jlc2V0X2hhY2spKSB7CisJICAgIG91dGwoZW5zb25pcS0+Y3NzciwgRVNfUkVHKGVuc29uaXEsIFNUQVRVUykpOworCSAgICAvKiBuZWVkIHRvIGRlbGF5IGFyb3VuZCAyMG1zKGJsZWVjaCkgdG8gZ2l2ZQorCSAgICAgICBzb21lIENPREVDcyBlbm91Z2ggdGltZSB0byB3YWtldXAgKi8KKwkgICAgbXNsZWVwKDIwKTsKKwl9CiAJLyogQUMnOTcgd2FybSByZXNldCB0byBzdGFydCB0aGUgYml0Y2xrICovCiAJb3V0bChlbnNvbmlxLT5jdHJsIHwgRVNfMTM3MV9TWU5DX1JFUywgRVNfUkVHKGVuc29uaXEsIENPTlRST0wpKTsKIAlpbmwoRVNfUkVHKGVuc29uaXEsIENPTlRST0wpKTsKQEAgLTIxMTIsMTEgKzIxMTQsNyBAQAogCQkJCSAgICAgc3RydWN0IGVuc29uaXEgKiogcmVuc29uaXEpCiB7CiAJc3RydWN0IGVuc29uaXEgKmVuc29uaXE7Ci0JdW5zaWduZWQgc2hvcnQgY21kdzsKIAl1bnNpZ25lZCBjaGFyIGNtZGI7Ci0jaWZkZWYgQ0hJUDEzNzEKLQlpbnQgaWR4OwotI2VuZGlmCiAJaW50IGVycjsKIAlzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsKIAkJLmRldl9mcmVlID0Jc25kX2Vuc29uaXFfZGV2X2ZyZWUsCkBAIC0yMTU5LDEwICsyMTU3LDYgQEAKIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaSwgUENJX1JFVklTSU9OX0lELCAmY21kYik7CiAJZW5zb25pcS0+cmV2ID0gY21kYjsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmY21kdyk7Ci0JZW5zb25pcS0+c3Vic3lzdGVtX3ZlbmRvcl9pZCA9IGNtZHc7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmY21kdyk7Ci0JZW5zb25pcS0+c3Vic3lzdGVtX2RldmljZV9pZCA9IGNtZHc7CiAjaWZkZWYgQ0hJUDEzNzAKICNpZiAwCiAJZW5zb25pcS0+Y3RybCA9IEVTXzEzNzBfQ0RDX0VOIHwgRVNfMTM3MF9TRVJSX0RJU0FCTEUgfApAQCAtMjE3NSwxOSArMjE2OSwxMSBAQAogCWVuc29uaXEtPmN0cmwgPSAwOwogCWVuc29uaXEtPnNjdHJsID0gMDsKIAllbnNvbmlxLT5jc3NyID0gMDsKLQlmb3IgKGlkeCA9IDA7IGVzMTM3MV9hbXBsaWZpZXJfaGFja1tpZHhdLnN2aWQgIT0gKHVuc2lnbmVkIHNob3J0KVBDSV9BTllfSUQ7IGlkeCsrKQotCQlpZiAoZW5zb25pcS0+c3Vic3lzdGVtX3ZlbmRvcl9pZCA9PSBlczEzNzFfYW1wbGlmaWVyX2hhY2tbaWR4XS5zdmlkICYmCi0JCSAgICBlbnNvbmlxLT5zdWJzeXN0ZW1fZGV2aWNlX2lkID09IGVzMTM3MV9hbXBsaWZpZXJfaGFja1tpZHhdLnNkaWQpIHsKLQkJCWVuc29uaXEtPmN0cmwgfD0gRVNfMTM3MV9HUElPX09VVCgxKTsJLyogdHVybiBhbXBsaWZpZXIgb24gKi8KLQkJCWJyZWFrOwotCQl9Ci0JZm9yIChpZHggPSAwOyBlczEzNzFfYWM5N19yZXNldF9oYWNrW2lkeF0udmlkICE9ICh1bnNpZ25lZCBzaG9ydClQQ0lfQU5ZX0lEOyBpZHgrKykKLQkJaWYgKHBjaS0+dmVuZG9yID09IGVzMTM3MV9hYzk3X3Jlc2V0X2hhY2tbaWR4XS52aWQgJiYKLQkJICAgIHBjaS0+ZGV2aWNlID09IGVzMTM3MV9hYzk3X3Jlc2V0X2hhY2tbaWR4XS5kaWQgJiYKLQkJICAgIGVuc29uaXEtPnJldiA9PSBlczEzNzFfYWM5N19yZXNldF9oYWNrW2lkeF0ucmV2KSB7Ci0JCQllbnNvbmlxLT5jc3NyIHw9IEVTXzEzNzFfU1RfQUM5N19SU1Q7Ci0JCQlicmVhazsKLQkJfQorCWlmIChzbmRfcGNpX3F1aXJrX2xvb2t1cChwY2ksIGVzMTM3MV9hbXBsaWZpZXJfaGFjaykpCisJCWVuc29uaXEtPmN0cmwgfD0gRVNfMTM3MV9HUElPX09VVCgxKTsJLyogdHVybiBhbXBsaWZpZXIgb24gKi8KKworCWlmIChlczEzNzFfcXVpcmtfbG9va3VwKGVuc29uaXEsIGVzMTM3MV9hYzk3X3Jlc2V0X2hhY2spKQorCQllbnNvbmlxLT5jc3NyIHw9IEVTXzEzNzFfU1RfQUM5N19SU1Q7CiAjZW5kaWYKIAogCXNuZF9lbnNvbmlxX2NoaXBfaW5pdChlbnNvbmlxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lczE5MzguYyBiL3NvdW5kL3BjaS9lczE5MzguYwppbmRleCA2NmFjMjZjLi5mZWMyOWExIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTM4LmMKKysrIGIvc291bmQvcGNpL2VzMTkzOC5jCkBAIC0xMzQ0LDcgKzEzNDQsNyBAQAogCTgsIDE1LCBUTFZfREJfU0NBTEVfSVRFTSgtNzUwLCAxNTAsIDApLAogfTsKIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2NhcHR1cmUsIDAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfY2FwdHVyZSwgMCwgMTUwLCAwKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9lczE5MzhfY29udHJvbHNbXSA9IHsKIEVTMTkzOF9ET1VCTEVfVExWKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMCwgMHg2MCwgMHg2MiwgMCwgMCwgNjMsIDAsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZm04MDEuYyBiL3NvdW5kL3BjaS9mbTgwMS5jCmluZGV4IGI3YjM2MWMuLjZkYzU3OGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9mbTgwMS5jCisrKyBiL3NvdW5kL3BjaS9mbTgwMS5jCkBAIC0xMTU3LDcgKzExNTcsNyBAQAogCXJldHVybiBzbmRfZm04MDFfdXBkYXRlX2JpdHMoY2hpcCwgRk04MDFfUkVDX1NSQywgNywgdmFsKTsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RzcCwgLTM0NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfZHNwLCAtMzQ1MCwgMTUwLCAwKTsKIAogI2RlZmluZSBGTTgwMV9DT05UUk9MUyBBUlJBWV9TSVpFKHNuZF9mbTgwMV9jb250cm9scykKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZSBiL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKaW5kZXggZGJhY2JhNi4uNjBkN2IwNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZQorKysgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCkBAIC0xLDUgKzEsMTQgQEAKIHNuZC1oZGEtaW50ZWwtb2JqcyA6PSBoZGFfaW50ZWwubwotc25kLWhkYS1jb2RlYy1vYmpzIDo9IGhkYV9jb2RlYy5vIGhkYV9nZW5lcmljLm8gcGF0Y2hfcmVhbHRlay5vIHBhdGNoX2NtZWRpYS5vIHBhdGNoX2FuYWxvZy5vIHBhdGNoX3NpZ21hdGVsLm8gcGF0Y2hfc2kzMDU0Lm8gcGF0Y2hfYXRpaGRtaS5vCitzbmQtaGRhLWNvZGVjLW9ianMgOj0gaGRhX2NvZGVjLm8gXAorCWhkYV9nZW5lcmljLm8gXAorCXBhdGNoX3JlYWx0ZWsubyBcCisJcGF0Y2hfY21lZGlhLm8gXAorCXBhdGNoX2FuYWxvZy5vIFwKKwlwYXRjaF9zaWdtYXRlbC5vIFwKKwlwYXRjaF9zaTMwNTQubyBcCisJcGF0Y2hfYXRpaGRtaS5vIFwKKwlwYXRjaF9jb25leGFudC5vIFwKKwlwYXRjaF92aWEubwogaWZkZWYgQ09ORklHX1BST0NfRlMKIHNuZC1oZGEtY29kZWMtb2JqcyArPSBoZGFfcHJvYy5vCiBlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKaW5kZXggMThiYmM4Ny4uOGYzNGZiNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCkBAIC01Miw2ICs1Miw3IEBACiBzdGF0aWMgc3RydWN0IGhkYV92ZW5kb3JfaWQgaGRhX3ZlbmRvcl9pZHNbXSA9IHsKIAl7IDB4MTBlYywgIlJlYWx0ZWsiIH0sCiAJeyAweDEwNTcsICJNb3Rvcm9sYSIgfSwKKwl7IDB4MTEwNiwgIlZJQSIgfSwKIAl7IDB4MTFkNCwgIkFuYWxvZyBEZXZpY2VzIiB9LAogCXsgMHgxM2Y2LCAiQy1NZWRpYSIgfSwKIAl7IDB4MTRmMSwgIkNvbmV4YW50IiB9LApAQCAtMjYyLDcgKzI2Myw3IEBACiAJdW5zb2wtPnF1ZXVlW3dwXSA9IHJlczsKIAl1bnNvbC0+cXVldWVbd3AgKyAxXSA9IHJlc19leDsKIAotCXF1ZXVlX3dvcmsodW5zb2wtPndvcmtxLCAmdW5zb2wtPndvcmspOworCXNjaGVkdWxlX3dvcmsoJnVuc29sLT53b3JrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzA5LDEyICszMTAsNiBAQAogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6IGNhbid0IGFsbG9jYXRlIHVuc29saWNpdGVkIHF1ZXVlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXVuc29sLT53b3JrcSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJoZGFfY29kZWMiKTsKLQlpZiAoISB1bnNvbC0+d29ya3EpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW4ndCBjcmVhdGUgd29ya3F1ZXVlXG4iKTsKLQkJa2ZyZWUodW5zb2wpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJSU5JVF9XT1JLKCZ1bnNvbC0+d29yaywgcHJvY2Vzc191bnNvbF9ldmVudHMpOwogCXVuc29sLT5idXMgPSBidXM7CiAJYnVzLT51bnNvbCA9IHVuc29sOwpAQCAtMzMzLDcgKzMyOCw3IEBACiAJaWYgKCEgYnVzKQogCQlyZXR1cm4gMDsKIAlpZiAoYnVzLT51bnNvbCkgewotCQlkZXN0cm95X3dvcmtxdWV1ZShidXMtPnVuc29sLT53b3JrcSk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAJCWtmcmVlKGJ1cy0+dW5zb2wpOwogCX0KIAlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJmJ1cy0+Y29kZWNfbGlzdCkgewpAQCAtMTcxNCw2ICsxNzA5LDggQEAKIC8qKgogICogc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcgLSBjb21wYXJlIHRoZSBjdXJyZW50IGNvZGVjIHdpdGggdGhlIGNvbmZpZyB0YWJsZQogICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCisgKiBAbnVtX2NvbmZpZ3M6IG51bWJlciBvZiBjb25maWcgZW51bXMKKyAqIEBtb2RlbHM6IGFycmF5IG9mIG1vZGVsIG5hbWUgc3RyaW5ncwogICogQHRibDogY29uZmlndXJhdGlvbiB0YWJsZSwgdGVybWluYXRlZCBieSBudWxsIGVudHJpZXMKICAqCiAgKiBDb21wYXJlcyB0aGUgbW9kZWxuYW1lIG9yIFBDSSBzdWJzeXN0ZW0gaWQgb2YgdGhlIGN1cnJlbnQgY29kZWMgd2l0aCB0aGUKQEAgLTE3MjIsMzMgKzE3MTksNDQgQEAKICAqCiAgKiBJZiBubyBlbnRyaWVzIGFyZSBtYXRjaGluZywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KICAqLwotaW50IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyAqdGJsKQoraW50IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJICAgICAgIGludCBudW1fY29uZmlncywgY29uc3QgY2hhciAqKm1vZGVscywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqdGJsKQogewotCWNvbnN0IHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnICpjOwotCi0JaWYgKGNvZGVjLT5idXMtPm1vZGVsbmFtZSkgewotCQlmb3IgKGMgPSB0Ymw7IGMtPm1vZGVsbmFtZSB8fCBjLT5wY2lfc3VidmVuZG9yOyBjKyspIHsKLQkJCWlmIChjLT5tb2RlbG5hbWUgJiYKLQkJCSAgICAhIHN0cmNtcChjb2RlYy0+YnVzLT5tb2RlbG5hbWUsIGMtPm1vZGVsbmFtZSkpIHsKLQkJCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBtb2RlbCAnJXMnIGlzIHNlbGVjdGVkXG4iLCBjLT5tb2RlbG5hbWUpOwotCQkJCXJldHVybiBjLT5jb25maWc7CisJaWYgKGNvZGVjLT5idXMtPm1vZGVsbmFtZSAmJiBtb2RlbHMpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fY29uZmlnczsgaSsrKSB7CisJCQlpZiAobW9kZWxzW2ldICYmCisJCQkgICAgIXN0cmNtcChjb2RlYy0+YnVzLT5tb2RlbG5hbWUsIG1vZGVsc1tpXSkpIHsKKwkJCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBtb2RlbCAnJXMnIGlzICIKKwkJCQkJICAgInNlbGVjdGVkXG4iLCBtb2RlbHNbaV0pOworCQkJCXJldHVybiBpOwogCQkJfQogCQl9CiAJfQogCi0JaWYgKGNvZGVjLT5idXMtPnBjaSkgewotCQl1MTYgc3Vic3lzdGVtX3ZlbmRvciwgc3Vic3lzdGVtX2RldmljZTsKLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoY29kZWMtPmJ1cy0+cGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnN5c3RlbV92ZW5kb3IpOwotCQlwY2lfcmVhZF9jb25maWdfd29yZChjb2RlYy0+YnVzLT5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZzdWJzeXN0ZW1fZGV2aWNlKTsKLQkJZm9yIChjID0gdGJsOyBjLT5tb2RlbG5hbWUgfHwgYy0+cGNpX3N1YnZlbmRvcjsgYysrKSB7Ci0JCQlpZiAoYy0+cGNpX3N1YnZlbmRvciA9PSBzdWJzeXN0ZW1fdmVuZG9yICYmCi0JCQkgICAgKCEgYy0+cGNpX3N1YmRldmljZSAvKiBhbGwgbWF0Y2ggKi98fAotCQkJICAgICAoYy0+cGNpX3N1YmRldmljZSA9PSBzdWJzeXN0ZW1fZGV2aWNlKSkpIHsKLQkJCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogUENJICV4OiV4LCBjb2RlYyBjb25maWcgJWQgaXMgc2VsZWN0ZWRcbiIsCi0JCQkJCSAgICBzdWJzeXN0ZW1fdmVuZG9yLCBzdWJzeXN0ZW1fZGV2aWNlLCBjLT5jb25maWcpOwotCQkJCXJldHVybiBjLT5jb25maWc7Ci0JCQl9CisJaWYgKCFjb2RlYy0+YnVzLT5wY2kgfHwgIXRibCkKKwkJcmV0dXJuIC0xOworCisJdGJsID0gc25kX3BjaV9xdWlya19sb29rdXAoY29kZWMtPmJ1cy0+cGNpLCB0YmwpOworCWlmICghdGJsKQorCQlyZXR1cm4gLTE7CisJaWYgKHRibC0+dmFsdWUgPj0gMCAmJiB0YmwtPnZhbHVlIDwgbnVtX2NvbmZpZ3MpIHsKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHX0RFVEVDVAorCQljaGFyIHRtcFsxMF07CisJCWNvbnN0IGNoYXIgKm1vZGVsID0gTlVMTDsKKwkJaWYgKG1vZGVscykKKwkJCW1vZGVsID0gbW9kZWxzW3RibC0+dmFsdWVdOworCQlpZiAoIW1vZGVsKSB7CisJCQlzcHJpbnRmKHRtcCwgIiMlZCIsIHRibC0+dmFsdWUpOworCQkJbW9kZWwgPSB0bXA7CiAJCX0KKwkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IG1vZGVsICclcycgaXMgc2VsZWN0ZWQgIgorCQkJICAgICJmb3IgY29uZmlnICV4OiV4ICglcylcbiIsCisJCQkgICAgbW9kZWwsIHRibC0+c3VidmVuZG9yLCB0YmwtPnN1YmRldmljZSwKKwkJCSAgICAodGJsLT5uYW1lID8gdGJsLT5uYW1lIDogIlVua25vd24gZGV2aWNlIikpOworI2VuZGlmCisJCXJldHVybiB0YmwtPnZhbHVlOwogCX0KIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwppbmRleCAxYTdlODIxLi5iOWE4ZTIzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKQEAgLTE5OSw3ICsxOTksNyBAQAogCiAvKiBTVEFURVNUUyBpbnQgbWFzazogU0QyLFNEMSxTRDAgKi8KICNkZWZpbmUgU1RBVEVTVFNfSU5UX01BU0sJMHgwNwotI2RlZmluZSBBWlhfTUFYX0NPREVDUwkJNAorI2RlZmluZSBBWlhfTUFYX0NPREVDUwkJMwogCiAvKiBTRF9DVEwgYml0cyAqLwogI2RlZmluZSBTRF9DVExfU1RSRUFNX1JFU0VUCTB4MDEJLyogc3RyZWFtIHJlc2V0IGJpdCAqLwpAQCAtMTI4NSw3ICsxMjg1LDcgQEAKIAkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmYXp4X3BjbV9vcHMpOwogCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCiAJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY2hpcC0+cGNpKSwKLQkJCQkJICAgICAgMTAyNCAqIDY0LCAxMDI0ICogMTI4KTsKKwkJCQkJICAgICAgMTAyNCAqIDY0LCAxMDI0ICogMTAyNCk7CiAJY2hpcC0+cGNtW3BjbV9kZXZdID0gcGNtOwogCWlmIChjaGlwLT5wY21fZGV2cyA8IHBjbV9kZXYgKyAxKQogCQljaGlwLT5wY21fZGV2cyA9IHBjbV9kZXYgKyAxOwpAQCAtMTM5MSw2ICsxMzkxLDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAljaGlwLT5pcnEgPSBjaGlwLT5wY2ktPmlycTsKKwlwY2lfaW50eChjaGlwLT5wY2ksICFjaGlwLT5tc2kpOwogCXJldHVybiAwOwogfQogCkBAIC0xNTAyLDYgKzE1MDMsMzEgQEAKIH0KIAogLyoKKyAqIHdoaXRlL2JsYWNrLWxpc3RpbmcgZm9yIHBvc2l0aW9uX2ZpeAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgcG9zaXRpb25fZml4X2xpc3RbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAxY2MsICJEZWxsIEQ4MjAiLCBQT1NfRklYX05PTkUpLAorCXt9Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjaGVja19wb3NpdGlvbl9maXgoc3RydWN0IGF6eCAqY2hpcCwgaW50IGZpeCkKK3sKKwljb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqcTsKKworCWlmIChmaXggPT0gUE9TX0ZJWF9BVVRPKSB7CisJCXEgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChjaGlwLT5wY2ksIHBvc2l0aW9uX2ZpeF9saXN0KTsKKwkJaWYgKHEpIHsKKwkJCXNuZF9wcmludGRkKEtFUk5fSU5GTworCQkJCSAgICAiaGRhX2ludGVsOiBwb3NpdGlvbl9maXggc2V0IHRvICVkICIKKwkJCQkgICAgImZvciBkZXZpY2UgJTA0eDolMDR4XG4iLAorCQkJCSAgICBxLT52YWx1ZSwgcS0+c3VidmVuZG9yLCBxLT5zdWJkZXZpY2UpOworCQkJcmV0dXJuIHEtPnZhbHVlOworCQl9CisJfQorCXJldHVybiBmaXg7Cit9CisKKy8qCiAgKiBjb25zdHJ1Y3RvcgogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhenhfY3JlYXRlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHBjaV9kZXYgKnBjaSwKQEAgLTE1MzUsNyArMTU2MSw4IEBACiAJY2hpcC0+ZHJpdmVyX3R5cGUgPSBkcml2ZXJfdHlwZTsKIAljaGlwLT5tc2kgPSBlbmFibGVfbXNpOwogCi0JY2hpcC0+cG9zaXRpb25fZml4ID0gcG9zaXRpb25fZml4OworCWNoaXAtPnBvc2l0aW9uX2ZpeCA9IGNoZWNrX3Bvc2l0aW9uX2ZpeChjaGlwLCBwb3NpdGlvbl9maXgpOworCiAJY2hpcC0+c2luZ2xlX2NtZCA9IHNpbmdsZV9jbWQ7CiAKICNpZiBCSVRTX1BFUl9MT05HICE9IDY0CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oIGIvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAppbmRleCA5Y2ExYmFmLi4zOTcxOGQ2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKQEAgLTE3MywxNCArMTczLDkgQEAKIC8qCiAgKiBNaXNjCiAgKi8KLXN0cnVjdCBoZGFfYm9hcmRfY29uZmlnIHsKLQljb25zdCBjaGFyICptb2RlbG5hbWU7Ci0JaW50IGNvbmZpZzsKLQl1bnNpZ25lZCBzaG9ydCBwY2lfc3VidmVuZG9yOwotCXVuc2lnbmVkIHNob3J0IHBjaV9zdWJkZXZpY2U7Ci19OwotCi1pbnQgc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnICp0YmwpOworaW50IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgbnVtX2NvbmZpZ3MsCisJCQkgICAgICAgY29uc3QgY2hhciAqKm1vZGVsbmFtZXMsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnBjaV9saXN0KTsKIGludCBzbmRfaGRhX2FkZF9uZXdfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtuZXcpOwogCiAvKgpAQCAtMjA0LDcgKzE5OSw2IEBACiAJdW5zaWduZWQgaW50IHJwLCB3cDsKIAogCS8qIHdvcmtxdWV1ZSAqLwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3QgaGRhX2J1cyAqYnVzOwogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX3BhdGNoLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9wYXRjaC5oCmluZGV4IDBiNjY4NzkuLjlmOWU5YWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX3BhdGNoLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfcGF0Y2guaApAQCAtMTQsNiArMTQsMTAgQEAKIGV4dGVybiBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF9zaTMwNTRbXTsKIC8qIEFUSSBIRE1JIGNvZGVjcyAqLwogZXh0ZXJuIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X2F0aWhkbWlbXTsKKy8qIENvbmV4YW50IGF1ZGlvIGNvZGVjICovCitleHRlcm4gc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfY29uZXhhbnRbXTsKKy8qIFZJQSBjb2RlY3MgKi8KK2V4dGVybiBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF92aWFbXTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0ICpoZGFfcHJlc2V0X3RhYmxlc1tdID0gewogCXNuZF9oZGFfcHJlc2V0X3JlYWx0ZWssCkBAIC0yMiw1ICsyNiw3IEBACiAJc25kX2hkYV9wcmVzZXRfc2lnbWF0ZWwsCiAJc25kX2hkYV9wcmVzZXRfc2kzMDU0LAogCXNuZF9oZGFfcHJlc2V0X2F0aWhkbWksCisJc25kX2hkYV9wcmVzZXRfY29uZXhhbnQsCisJc25kX2hkYV9wcmVzZXRfdmlhLAogCU5VTEwKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwppbmRleCAwNzYzNjViLi4zODk3N2JjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKQEAgLTc4Miw1NCArNzgyLDYzIEBACiAKIC8qIGVhcGQgaW5pdGlhbGl6YXRpb24gKi8KIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWQxOTg2YV9lYXBkX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxYiwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4MDB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMHgwMCB9LAogCXt9CiB9OwogCi0vKiBtb2RlbHMgKi8KLWVudW0geyBBRDE5ODZBXzZTVEFDSywgQUQxOTg2QV8zU1RBQ0ssIEFEMTk4NkFfTEFQVE9QLCBBRDE5ODZBX0xBUFRPUF9FQVBEIH07CisvKiBVbHRyYSBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhZDE5ODZhX3VsdHJhX2luaXRbXSA9IHsKKwkvKiBlYXBkIGluaXRpYWxpemF0aW9uICovCisJeyAweDFiLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMHgwMCB9LAorCS8qIENMRkUgLT4gTWljIGluICovCisJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgyIH0sCisJeyAweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKKwl7IDB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MCB9LAorCXsgfSAvKiBlbmQgKi8KK307CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBhZDE5ODZhX2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAiNnN0YWNrIiwJLmNvbmZpZyA9IEFEMTk4NkFfNlNUQUNLIH0sCi0JeyAubW9kZWxuYW1lID0gIjNzdGFjayIsCS5jb25maWcgPSBBRDE5ODZBXzNTVEFDSyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwZGUsIC5wY2lfc3ViZGV2aWNlID0gMHhjYjg0LAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfM1NUQUNLIH0sIC8qIEFTVVMgQThOLVZNIENTTSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHg4MTdmLAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfM1NUQUNLIH0sIC8qIEFTVVMgUDVQLUwyICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDgxYjMsCi0JICAuY29uZmlnID0gQUQxOTg2QV8zU1RBQ0sgfSwgLyogQVNVUyBQNVJEMi1WTSAvIFA1R1BMLVggU0UgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4ODFjYiwKLQkgIC5jb25maWcgPSBBRDE5ODZBXzNTVEFDSyB9LCAvKiBBU1VTIE0yTlBWLVZNICovCi0JeyAubW9kZWxuYW1lID0gImxhcHRvcCIsCS5jb25maWcgPSBBRDE5ODZBX0xBUFRPUCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE0NGQsIC5wY2lfc3ViZGV2aWNlID0gMHhjMDFlLAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QIH0sIC8qIEZTQyBWMjA2MCAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE3YzAsIC5wY2lfc3ViZGV2aWNlID0gMHgyMDE3LAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QIH0sIC8qIFNhbXN1bmcgTTUwICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDgxOGYsCi0JICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1AgfSwgLyogQVNVUyBQNUdWLU1YICovCi0JeyAubW9kZWxuYW1lID0gImxhcHRvcC1lYXBkIiwJLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNDRkLCAucGNpX3N1YmRldmljZSA9IDB4YzAyMywKLQkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sIC8qIFNhbXN1bmcgWDYwIENoYW5lICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTQ0ZCwgLnBjaV9zdWJkZXZpY2UgPSAweGMwMjQsCi0JICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBTYW1zdW5nIFI2NS1UMjMwMCBDaGFyaXMgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNDRkLCAucGNpX3N1YmRldmljZSA9IDB4YzAyNiwKLQkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sIC8qIFNhbXN1bmcgWDExLVQyMzAwIEN1bGVzYSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMTUzLAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogQVNVUyBNOSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMjEzLAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogQVNVUyBBNkogKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTFmNywKLQkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sIC8qIEFTVVMgVTVBICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDEyNjMsCi0JICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBBU1VTIFU1RiAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMjk3LAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogQVNVUyBaNjJGICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDEyYjMsCi0JICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBBU1VTIFYxaiAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgzMGFmLAotCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogSFAgQ29tcGFxIFByZXNhcmlvIEIyODAwICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTdhYSwgLnBjaV9zdWJkZXZpY2UgPSAweDIwNjYsCi0JICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBMZW5vdm8gMzAwMCBOMTAwLTA3Njg0SlUgKi8KKy8qIG1vZGVscyAqLworZW51bSB7CisJQUQxOTg2QV82U1RBQ0ssCisJQUQxOTg2QV8zU1RBQ0ssCisJQUQxOTg2QV9MQVBUT1AsCisJQUQxOTg2QV9MQVBUT1BfRUFQRCwKKwlBRDE5ODZBX1VMVFJBLAorCUFEMTk4NkFfTU9ERUxTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYWQxOTg2YV9tb2RlbHNbQUQxOTg2QV9NT0RFTFNdID0geworCVtBRDE5ODZBXzZTVEFDS10JPSAiNnN0YWNrIiwKKwlbQUQxOTg2QV8zU1RBQ0tdCT0gIjNzdGFjayIsCisJW0FEMTk4NkFfTEFQVE9QXQk9ICJsYXB0b3AiLAorCVtBRDE5ODZBX0xBUFRPUF9FQVBEXQk9ICJsYXB0b3AtZWFwZCIsCisJW0FEMTk4NkFfVUxUUkFdCQk9ICJ1bHRyYSIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWQxOTg2YV9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzBhZiwgIkhQIEIyODAwIiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDEwZGUsIDB4Y2I4NCwgIkFTVVMgQThOLVZNIiwgQUQxOTg2QV8zU1RBQ0spLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExNTMsICJBU1VTIE05IiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTIxMywgIkFTVVMgQTZKIiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFmNywgIkFTVVMgVTVBIiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTI2MywgIkFTVVMgVTVGIiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTI5NywgIkFTVVMgWjYyRiIsIEFEMTk4NkFfTEFQVE9QX0VBUEQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyYjMsICJBU1VTIFYxaiIsIEFEMTk4NkFfTEFQVE9QX0VBUEQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMDIsICJBU1VTIFczaiIsIEFEMTk4NkFfTEFQVE9QX0VBUEQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxN2YsICJBU1VTIFA1IiwgQUQxOTg2QV8zU1RBQ0spLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxOGYsICJBU1VTIFA1IiwgQUQxOTg2QV9MQVBUT1ApLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxYjMsICJBU1VTIFA1IiwgQUQxOTg2QV8zU1RBQ0spLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxY2IsICJBU1VTIE0yTiIsIEFEMTk4NkFfM1NUQUNLKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MjM0LCAiQVNVUyBNMk4iLCBBRDE5ODZBXzNTVEFDSyksCisJU05EX1BDSV9RVUlSSygweDE0NGQsIDB4YzAxZSwgIkZTQyBWMjA2MCIsIEFEMTk4NkFfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjMDIzLCAiU2Ftc3VuZyBYNjAiLCBBRDE5ODZBX0xBUFRPUF9FQVBEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjMDI0LCAiU2Ftc3VuZyBSNjUiLCBBRDE5ODZBX0xBUFRPUF9FQVBEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjMDI2LCAiU2Ftc3VuZyBYMTEiLCBBRDE5ODZBX0xBUFRPUF9FQVBEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjNTA0LCAiU2Ftc3VuZyBRMzUiLCBBRDE5ODZBXzNTVEFDSyksCisJU05EX1BDSV9RVUlSSygweDE0NGQsIDB4YzAyNywgIlNhbXN1bmcgUTEiLCBBRDE5ODZBX1VMVFJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgxMDE3LCAiTGVub3ZvIEE2MCIsIEFEMTk4NkFfM1NUQUNLKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMDY2LCAiTGVub3ZvIE4xMDAiLCBBRDE5ODZBX0xBUFRPUF9FQVBEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdjMCwgMHgyMDE3LCAiU2Ftc3VuZyBNNTAiLCBBRDE5ODZBX0xBUFRPUCksCiAJe30KIH07CiAKQEAgLTg2MSw3ICs4NzAsOSBAQAogCWNvZGVjLT5wYXRjaF9vcHMgPSBhZDE5OHhfcGF0Y2hfb3BzOwogCiAJLyogb3ZlcnJpZGUgc29tZSBwYXJhbWV0ZXJzICovCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIGFkMTk4NmFfY2ZnX3RibCk7CisJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFEMTk4NkFfTU9ERUxTLAorCQkJCQkJICBhZDE5ODZhX21vZGVscywKKwkJCQkJCSAgYWQxOTg2YV9jZmdfdGJsKTsKIAlzd2l0Y2ggKGJvYXJkX2NvbmZpZykgewogCWNhc2UgQUQxOTg2QV8zU1RBQ0s6CiAJCXNwZWMtPm51bV9taXhlcnMgPSAyOwpAQCAtODkxLDYgKzkwMiwxNSBAQAogCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IDA7CiAJCXNwZWMtPmlucHV0X211eCA9ICZhZDE5ODZhX2xhcHRvcF9lYXBkX2NhcHR1cmVfc291cmNlOwogCQlicmVhazsKKwljYXNlIEFEMTk4NkFfVUxUUkE6CisJCXNwZWMtPm1peGVyc1swXSA9IGFkMTk4NmFfbGFwdG9wX2VhcGRfbWl4ZXJzOworCQlzcGVjLT5udW1faW5pdF92ZXJicyA9IDI7CisJCXNwZWMtPmluaXRfdmVyYnNbMV0gPSBhZDE5ODZhX3VsdHJhX2luaXQ7CisJCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IDI7CisJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gMTsKKwkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBhZDE5ODZhX2xhcHRvcF9kYWNfbmlkczsKKwkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSAwOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEzOTEsMjAgKzE0MTEsMjcgQEAKIH07CiAKIC8qIG1vZGVscyAqLwotZW51bSB7IEFEMTk4MV9CQVNJQywgQUQxOTgxX0hQLCBBRDE5ODFfVEhJTktQQUQgfTsKK2VudW0geworCUFEMTk4MV9CQVNJQywKKwlBRDE5ODFfSFAsCisJQUQxOTgxX1RISU5LUEFELAorCUFEMTk4MV9NT0RFTFMKK307CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBhZDE5ODFfY2ZnX3RibFtdID0gewotCXsgLm1vZGVsbmFtZSA9ICJocCIsIC5jb25maWcgPSBBRDE5ODFfSFAgfSwKK3N0YXRpYyBjb25zdCBjaGFyICphZDE5ODFfbW9kZWxzW0FEMTk4MV9NT0RFTFNdID0geworCVtBRDE5ODFfSFBdCQk9ICJocCIsCisJW0FEMTk4MV9USElOS1BBRF0JPSAidGhpbmtwYWQiLAorCVtBRDE5ODFfQkFTSUNdCQk9ICJiYXNpYyIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWQxOTgxX2NmZ190YmxbXSA9IHsKIAkvKiBBbGwgSFAgbW9kZWxzICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLmNvbmZpZyA9IEFEMTk4MV9IUCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDMwYjAsIC5wY2lfc3ViZGV2aWNlID0gMHgxMDNjLAotCSAgLmNvbmZpZyA9IEFEMTk4MV9IUCB9LCAvKiBIUCBueDYzMjAgKHJldmVyc2VkIFNTSUQsIEgvVyBidWcpICovCi0JeyAubW9kZWxuYW1lID0gInRoaW5rcGFkIiwgLmNvbmZpZyA9IEFEMTk4MV9USElOS1BBRCB9LAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAwLCAiSFAgbngiLCBBRDE5ODFfSFApLAorCS8qIEhQIG54NjMyMCAocmV2ZXJzZWQgU1NJRCwgSC9XIGJ1ZykgKi8KKwlTTkRfUENJX1FVSVJLKDB4MzBiMCwgMHgxMDNjLCAiSFAgbng2MzIwIiwgQUQxOTgxX0hQKSwKIAkvKiBMZW5vdm8gVGhpbmtwYWQgVDYwL1g2MC9aNnh4ICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTdhYSwgLmNvbmZpZyA9IEFEMTk4MV9USElOS1BBRCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMTQsIC5wY2lfc3ViZGV2aWNlID0gMHgwNTk3LAotCSAgLmNvbmZpZyA9IEFEMTk4MV9USElOS1BBRCB9LCAvKiBaNjBtL3QgKi8KLQl7IC5tb2RlbG5hbWUgPSAiYmFzaWMiLCAuY29uZmlnID0gQUQxOTgxX0JBU0lDIH0sCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDAsICJMZW5vdm8gVGhpbmtwYWQiLCBBRDE5ODFfVEhJTktQQUQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDE0LCAweDA1OTcsICJMZW5vdm8gWjYwIiwgQUQxOTgxX1RISU5LUEFEKSwKIAl7fQogfTsKIApAQCAtMTQzNyw3ICsxNDY0LDkgQEAKIAljb2RlYy0+cGF0Y2hfb3BzID0gYWQxOTh4X3BhdGNoX29wczsKIAogCS8qIG92ZXJyaWRlIHNvbWUgcGFyYW1ldGVycyAqLwotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBhZDE5ODFfY2ZnX3RibCk7CisJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFEMTk4MV9NT0RFTFMsCisJCQkJCQkgIGFkMTk4MV9tb2RlbHMsCisJCQkJCQkgIGFkMTk4MV9jZmdfdGJsKTsKIAlzd2l0Y2ggKGJvYXJkX2NvbmZpZykgewogCWNhc2UgQUQxOTgxX0hQOgogCQlzcGVjLT5taXhlcnNbMF0gPSBhZDE5ODFfaHBfbWl4ZXJzOwpAQCAtMjU2NSwxNSArMjU5NCwxNCBAQAogLyoKICAqLwogCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgYWQxOTg4X2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAiNnN0YWNrIiwJLmNvbmZpZyA9IEFEMTk4OF82U1RBQ0sgfSwKLQl7IC5tb2RlbG5hbWUgPSAiNnN0YWNrLWRpZyIsCS5jb25maWcgPSBBRDE5ODhfNlNUQUNLX0RJRyB9LAotCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2siLAkuY29uZmlnID0gQUQxOTg4XzNTVEFDSyB9LAotCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2stZGlnIiwJLmNvbmZpZyA9IEFEMTk4OF8zU1RBQ0tfRElHIH0sCi0JeyAubW9kZWxuYW1lID0gImxhcHRvcCIsCS5jb25maWcgPSBBRDE5ODhfTEFQVE9QIH0sCi0JeyAubW9kZWxuYW1lID0gImxhcHRvcC1kaWciLAkuY29uZmlnID0gQUQxOTg4X0xBUFRPUF9ESUcgfSwKLQl7IC5tb2RlbG5hbWUgPSAiYXV0byIsCQkuY29uZmlnID0gQUQxOTg4X0FVVE8gfSwKLQl7fQorc3RhdGljIGNvbnN0IGNoYXIgKmFkMTk4OF9tb2RlbHNbQUQxOTg4X01PREVMX0xBU1RdID0geworCVtBRDE5ODhfNlNUQUNLXQkJPSAiNnN0YWNrIiwKKwlbQUQxOTg4XzZTVEFDS19ESUddCT0gIjZzdGFjay1kaWciLAorCVtBRDE5ODhfM1NUQUNLXQkJPSAiM3N0YWNrIiwKKwlbQUQxOTg4XzNTVEFDS19ESUddCT0gIjNzdGFjay1kaWciLAorCVtBRDE5ODhfTEFQVE9QXQkJPSAibGFwdG9wIiwKKwlbQUQxOTg4X0xBUFRPUF9ESUddCT0gImxhcHRvcC1kaWciLAorCVtBRDE5ODhfQVVUT10JCT0gImF1dG8iLAogfTsKIAogc3RhdGljIGludCBwYXRjaF9hZDE5ODgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0yNTkxLDggKzI2MTksOSBAQAogCWlmIChpc19yZXYyKGNvZGVjKSkKIAkJc25kX3ByaW50ayhLRVJOX0lORk8gInBhdGNoX2FuYWxvZzogQUQxOTg4QSByZXYuMiBpcyBkZXRlY3RlZCwgZW5hYmxlIHdvcmthcm91bmRzXG4iKTsKIAotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBhZDE5ODhfY2ZnX3RibCk7Ci0JaWYgKGJvYXJkX2NvbmZpZyA8IDAgfHwgYm9hcmRfY29uZmlnID49IEFEMTk4OF9NT0RFTF9MQVNUKSB7CisJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFEMTk4OF9NT0RFTF9MQVNULAorCQkJCQkJICBhZDE5ODhfbW9kZWxzLCBOVUxMKTsKKwlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewogCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIEFEMTk4OCwgdHJ5aW5nIGF1dG8tcHJvYmUgZnJvbSBCSU9TLi4uXG4iKTsKIAkJYm9hcmRfY29uZmlnID0gQUQxOTg4X0FVVE87CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKaW5kZXggZDM4Y2UyMi4uNWI5ZDNhMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCkBAIC00MCw2ICs0MCw3IEBACiAJQ01JX0ZVTExfRElHLAkvKiBiYWNrIDYtamFjayArIGZyb250LXBhbmVsIDItamFjayArIGRpZ2l0YWwgSS9PICovCiAJQ01JX0FMTE9VVCwJLyogYmFjayA1LWphY2sgKyBmcm9udC1wYW5lbCAyLWphY2sgKyBkaWdpdGFsIG91dCAqLwogCUNNSV9BVVRPLAkvKiBsZXQgZHJpdmVyIGd1ZXNzIGl0ICovCisJQ01JX01PREVMUwogfTsKIAogc3RydWN0IGNtaV9zcGVjIHsKQEAgLTYwMywxNCArNjA0LDE3IEBACiAvKgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBjbWk5ODgwX2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAibWluaW1hbCIsIC5jb25maWcgPSBDTUlfTUlOSU1BTCB9LAotCXsgLm1vZGVsbmFtZSA9ICJtaW5fZnAiLCAuY29uZmlnID0gQ01JX01JTl9GUCB9LAotCXsgLm1vZGVsbmFtZSA9ICJmdWxsIiwgLmNvbmZpZyA9IENNSV9GVUxMIH0sCi0JeyAubW9kZWxuYW1lID0gImZ1bGxfZGlnIiwgLmNvbmZpZyA9IENNSV9GVUxMX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHg4MTNkLCAuY29uZmlnID0gQ01JX0ZVTExfRElHIH0sIC8qIEFTVVMgUDVBRDIgKi8KLQl7IC5tb2RlbG5hbWUgPSAiYWxsb3V0IiwgLmNvbmZpZyA9IENNSV9BTExPVVQgfSwKLQl7IC5tb2RlbG5hbWUgPSAiYXV0byIsIC5jb25maWcgPSBDTUlfQVVUTyB9LAorc3RhdGljIGNvbnN0IGNoYXIgKmNtaTk4ODBfbW9kZWxzW0NNSV9NT0RFTFNdID0geworCVtDTUlfTUlOSU1BTF0JPSAibWluaW1hbCIsCisJW0NNSV9NSU5fRlBdCT0gIm1pbl9mcCIsCisJW0NNSV9GVUxMXQk9ICJmdWxsIiwKKwlbQ01JX0ZVTExfRElHXQk9ICJmdWxsX2RpZyIsCisJW0NNSV9BTExPVVRdCT0gImFsbG91dCIsCisJW0NNSV9BVVRPXQk9ICJhdXRvIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjbWk5ODgwX2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MTNkLCAiQVNVUyBQNUFEMiIsIENNSV9GVUxMX0RJRyksCiAJe30gLyogdGVybWluYXRvciAqLwogfTsKIApAQCAtNjMzLDcgKzYzNyw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJY29kZWMtPnNwZWMgPSBzcGVjOwotCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBjbWk5ODgwX2NmZ190YmwpOworCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBDTUlfTU9ERUxTLAorCQkJCQkJCWNtaTk4ODBfbW9kZWxzLAorCQkJCQkJCWNtaTk4ODBfY2ZnX3RibCk7CiAJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA8IDApIHsKIAkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIENNSTk4ODBcbiIpOwogCQlzcGVjLT5ib2FyZF9jb25maWcgPSBDTUlfQVVUTzsgLyogdHJ5IGV2ZXJ5dGhpbmcgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2Y0NjY4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCkBAIC0wLDAgKzEsMTMxMSBAQAorLyoKKyAqIEhEIGF1ZGlvIGludGVyZmFjZSBwYXRjaCBmb3IgQ29uZXhhbnQgSERBIGF1ZGlvIGNvZGVjCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFBvdG90c2tpeSBBa2V4IDxhbGV4LnBvdG90c2tpeUBnbWFpbC5jb20+CisgKiAJCSAgICAgIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIAkJICAgICAgVG9iaW4gRGF2aXMgIDx0ZGF2aXNAZHNsLW9ubHkubmV0PgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgImhkYV9jb2RlYy5oIgorI2luY2x1ZGUgImhkYV9sb2NhbC5oIgorCisjZGVmaW5lIENYVF9QSU5fRElSX0lOICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIENYVF9QSU5fRElSX09VVCAgICAgICAgICAgICAweDAxCisjZGVmaW5lIENYVF9QSU5fRElSX0lOT1VUICAgICAgICAgICAweDAyCisjZGVmaW5lIENYVF9QSU5fRElSX0lOX05PTUlDQklBUyAgICAweDAzCisjZGVmaW5lIENYVF9QSU5fRElSX0lOT1VUX05PTUlDQklBUyAweDA0CisKKyNkZWZpbmUgQ09ORVhBTlRfSFBfRVZFTlQJMHgzNworI2RlZmluZSBDT05FWEFOVF9NSUNfRVZFTlQJMHgzOAorCisKKworc3RydWN0IGNvbmV4YW50X3NwZWMgeworCisJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm1peGVyc1s1XTsKKwlpbnQgbnVtX21peGVyczsKKworCWNvbnN0IHN0cnVjdCBoZGFfdmVyYiAqaW5pdF92ZXJic1s1XTsJLyogaW5pdGlhbGl6YXRpb24gdmVyYnMKKwkJCQkJCSAqIGRvbid0IGZvcmdldCBOVUxMCisJCQkJCQkgKiB0ZXJtaW5hdGlvbiEKKwkJCQkJCSAqLworCXVuc2lnbmVkIGludCBudW1faW5pdF92ZXJiczsKKworCS8qIHBsYXliYWNrICovCisJc3RydWN0IGhkYV9tdWx0aV9vdXQgbXVsdGlvdXQ7CS8qIHBsYXliYWNrIHNldC11cAorCQkJCQkgKiBtYXhfY2hhbm5lbHMsIGRhY3MgbXVzdCBiZSBzZXQKKwkJCQkJICogZGlnX291dF9uaWQgYW5kIGhwX25pZCBhcmUgb3B0aW9uYWwKKwkJCQkJICovCisJdW5zaWduZWQgaW50IGN1cl9lYXBkOworCXVuc2lnbmVkIGludCBuZWVkX2RhY19maXg7CisKKwkvKiBjYXB0dXJlICovCisJdW5zaWduZWQgaW50IG51bV9hZGNfbmlkczsKKwloZGFfbmlkX3QgKmFkY19uaWRzOworCWhkYV9uaWRfdCBkaWdfaW5fbmlkOwkJLyogZGlnaXRhbC1pbiBOSUQ7IG9wdGlvbmFsICovCisKKwkvKiBjYXB0dXJlIHNvdXJjZSAqLworCWNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbnB1dF9tdXg7CisJaGRhX25pZF90ICpjYXBzcmNfbmlkczsKKwl1bnNpZ25lZCBpbnQgY3VyX211eFszXTsKKworCS8qIGNoYW5uZWwgbW9kZWwgKi8KKwljb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSAqY2hhbm5lbF9tb2RlOworCWludCBudW1fY2hhbm5lbF9tb2RlOworCisJLyogUENNIGluZm9ybWF0aW9uICovCisJc3RydWN0IGhkYV9wY20gcGNtX3JlY1syXTsJLyogdXNlZCBpbiBidWlsZF9wY21zKCkgKi8KKworCXN0cnVjdCBtdXRleCBhbXBfbXV0ZXg7CS8qIFBDTSB2b2x1bWUvbXV0ZSBjb250cm9sIG11dGV4ICovCisJdW5zaWduZWQgaW50IHNwZGlmX3JvdXRlOworCisJLyogZHluYW1pYyBjb250cm9scywgaW5pdF92ZXJicyBhbmQgaW5wdXRfbXV4ICovCisJc3RydWN0IGF1dG9fcGluX2NmZyBhdXRvY2ZnOworCXVuc2lnbmVkIGludCBudW1fa2N0bF9hbGxvYywgbnVtX2tjdGxfdXNlZDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2N0bF9hbGxvYzsKKwlzdHJ1Y3QgaGRhX2lucHV0X211eCBwcml2YXRlX2ltdXg7CisJaGRhX25pZF90IHByaXZhdGVfZGFjX25pZHNbNF07CisKK307CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfcGxheWJhY2tfcGNtX29wZW4oc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfb3Blbihjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IGNvbmV4YW50X3BsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJCSBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJCQkgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQkJIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19wcmVwYXJlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsCisJCQkJCQlzdHJlYW1fdGFnLAorCQkJCQkJZm9ybWF0LCBzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IGNvbmV4YW50X3BsYXliYWNrX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJCSBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19jbGVhbnVwKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOworfQorCisvKgorICogRGlnaXRhbCBvdXQKKyAqLworc3RhdGljIGludCBjb25leGFudF9kaWdfcGxheWJhY2tfcGNtX29wZW4oc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfb3Blbihjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKK30KKworc3RhdGljIGludCBjb25leGFudF9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJCSBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19jbG9zZShjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKK30KKworLyoKKyAqIEFuYWxvZyBjYXB0dXJlCisgKi8KK3N0YXRpYyBpbnQgY29uZXhhbnRfY2FwdHVyZV9wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgc3BlYy0+YWRjX25pZHNbc3Vic3RyZWFtLT5udW1iZXJdLAorCQkJCSAgIHN0cmVhbV90YWcsIDAsIGZvcm1hdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfY2FwdHVyZV9wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIHNwZWMtPmFkY19uaWRzW3N1YnN0cmVhbS0+bnVtYmVyXSwKKwkJCQkgICAwLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY29uZXhhbnRfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLm5pZCA9IDAsIC8qIGZpbGwgbGF0ZXIgKi8KKwkub3BzID0geworCQkub3BlbiA9IGNvbmV4YW50X3BsYXliYWNrX3BjbV9vcGVuLAorCQkucHJlcGFyZSA9IGNvbmV4YW50X3BsYXliYWNrX3BjbV9wcmVwYXJlLAorCQkuY2xlYW51cCA9IGNvbmV4YW50X3BsYXliYWNrX3BjbV9jbGVhbnVwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY29uZXhhbnRfcGNtX2FuYWxvZ19jYXB0dXJlID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkubmlkID0gMCwgLyogZmlsbCBsYXRlciAqLworCS5vcHMgPSB7CisJCS5wcmVwYXJlID0gY29uZXhhbnRfY2FwdHVyZV9wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSBjb25leGFudF9jYXB0dXJlX3BjbV9jbGVhbnVwCisJfSwKK307CisKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjb25leGFudF9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLm5pZCA9IDAsIC8qIGZpbGwgbGF0ZXIgKi8KKwkub3BzID0geworCQkub3BlbiA9IGNvbmV4YW50X2RpZ19wbGF5YmFja19wY21fb3BlbiwKKwkJLmNsb3NlID0gY29uZXhhbnRfZGlnX3BsYXliYWNrX3BjbV9jbG9zZQorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNvbmV4YW50X3BjbV9kaWdpdGFsX2NhcHR1cmUgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS8qIE5JRCBpcyBzZXQgaW4gYWxjX2J1aWxkX3BjbXMgKi8KK307CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfYnVpbGRfcGNtcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfcGNtICppbmZvID0gc3BlYy0+cGNtX3JlYzsKKworCWNvZGVjLT5udW1fcGNtcyA9IDE7CisJY29kZWMtPnBjbV9pbmZvID0gaW5mbzsKKworCWluZm8tPm5hbWUgPSAiQ09ORVhBTlQgQW5hbG9nIjsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSBjb25leGFudF9wY21fYW5hbG9nX3BsYXliYWNrOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5jaGFubmVsc19tYXggPQorCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHM7CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLm5pZCA9CisJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gY29uZXhhbnRfcGNtX2FuYWxvZ19jYXB0dXJlOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbXMgPSBzcGVjLT5udW1fYWRjX25pZHM7CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0gc3BlYy0+YWRjX25pZHNbMF07CisKKwlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpIHsKKwkJaW5mbysrOworCQljb2RlYy0+bnVtX3BjbXMrKzsKKwkJaW5mby0+bmFtZSA9ICJDb25leGFudCBEaWdpdGFsIjsKKwkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0KKwkJCWNvbmV4YW50X3BjbV9kaWdpdGFsX3BsYXliYWNrOworCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10ubmlkID0KKwkJCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkOworCQlpZiAoc3BlYy0+ZGlnX2luX25pZCkgeworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPQorCQkJCWNvbmV4YW50X3BjbV9kaWdpdGFsX2NhcHR1cmU7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPQorCQkJCXNwZWMtPmRpZ19pbl9uaWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25leGFudF9tdXhfZW51bV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCSAgICAgICAJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKworCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9pbmZvKHNwZWMtPmlucHV0X211eCwgdWluZm8pOworfQorCitzdGF0aWMgaW50IGNvbmV4YW50X211eF9lbnVtX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCBpbnQgYWRjX2lkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPmN1cl9tdXhbYWRjX2lkeF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfbXV4X2VudW1fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGludCBhZGNfaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisKKwlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfcHV0KGNvZGVjLCBzcGVjLT5pbnB1dF9tdXgsIHVjb250cm9sLAorCQkJCSAgICAgc3BlYy0+Y2Fwc3JjX25pZHNbYWRjX2lkeF0sCisJCQkJICAgICAmc3BlYy0+Y3VyX211eFthZGNfaWR4XSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZXhhbnRfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9pbml0X3ZlcmJzOyBpKyspCisJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIHNwZWMtPmluaXRfdmVyYnNbaV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb25leGFudF9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworICAgICAgICBzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICBpZiAoc3BlYy0+a2N0bF9hbGxvYykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fa2N0bF91c2VkOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShzcGVjLT5rY3RsX2FsbG9jW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIGtmcmVlKHNwZWMtPmtjdGxfYWxsb2MpOworICAgICAgICB9CisKKwlrZnJlZShjb2RlYy0+c3BlYyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgY29uZXhhbnRfcmVzdW1lKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwljb2RlYy0+cGF0Y2hfb3BzLmluaXQoY29kZWMpOworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fbWl4ZXJzOyBpKyspCisJCXNuZF9oZGFfcmVzdW1lX2N0bHMoY29kZWMsIHNwZWMtPm1peGVyc1tpXSk7CisJaWYgKHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKQorCQlzbmRfaGRhX3Jlc3VtZV9zcGRpZl9vdXQoY29kZWMpOworCWlmIChzcGVjLT5kaWdfaW5fbmlkKQorCQlzbmRfaGRhX3Jlc3VtZV9zcGRpZl9pbihjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBjb25leGFudF9idWlsZF9jb250cm9scyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX21peGVyczsgaSsrKSB7CisJCWVyciA9IHNuZF9oZGFfYWRkX25ld19jdGxzKGNvZGVjLCBzcGVjLT5taXhlcnNbaV0pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkgeworCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywKKwkJCQkJCSAgICBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9IAorCWlmIChzcGVjLT5kaWdfaW5fbmlkKSB7CisJCWVyciA9IHNuZF9oZGFfY3JlYXRlX3NwZGlmX2luX2N0bHMoY29kZWMsc3BlYy0+ZGlnX2luX25pZCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX29wcyBjb25leGFudF9wYXRjaF9vcHMgPSB7CisJLmJ1aWxkX2NvbnRyb2xzID0gY29uZXhhbnRfYnVpbGRfY29udHJvbHMsCisJLmJ1aWxkX3BjbXMgPSBjb25leGFudF9idWlsZF9wY21zLAorCS5pbml0ID0gY29uZXhhbnRfaW5pdCwKKwkuZnJlZSA9IGNvbmV4YW50X2ZyZWUsCisjaWZkZWYgQ09ORklHX1BNCisJLnJlc3VtZSA9IGNvbmV4YW50X3Jlc3VtZSwKKyNlbmRpZgorfTsKKworLyoKKyAqIEVBUEQgY29udHJvbAorICogdGhlIHByaXZhdGUgdmFsdWUgPSBuaWQgfCAoaW52ZXJ0IDw8IDgpCisgKi8KKworc3RhdGljIGludCBjb25leGFudF9lYXBkX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmV4YW50X2VhcGRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpbnZlcnQgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gOCkgJiAxOworCWlmIChpbnZlcnQpCisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gIXNwZWMtPmN1cl9lYXBkOworCWVsc2UKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzcGVjLT5jdXJfZWFwZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25leGFudF9lYXBkX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMTsKKwloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCXVuc2lnbmVkIGludCBlYXBkOworCWVhcGQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlpZiAoaW52ZXJ0KQorCQllYXBkID0gIWVhcGQ7CisJaWYgKGVhcGQgPT0gc3BlYy0+Y3VyX2VhcGQgJiYgIWNvZGVjLT5pbl9yZXN1bWUpCisJCXJldHVybiAwOworCXNwZWMtPmN1cl9lYXBkID0gZWFwZDsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsCisJCQkgICAgMCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsCisJCQkgICAgZWFwZCA/IDB4MDIgOiAweDAwKTsKKwlyZXR1cm4gMTsKK30KKworLyogY29udHJvbHMgZm9yIHRlc3QgbW9kZSAqLworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKworc3RhdGljIGludCBjb25leGFudF9jaF9tb2RlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9jaF9tb2RlX2luZm8oY29kZWMsIHVpbmZvLCBzcGVjLT5jaGFubmVsX21vZGUsCisJCQkJICAgIHNwZWMtPm51bV9jaGFubmVsX21vZGUpOworfQorCitzdGF0aWMgaW50IGNvbmV4YW50X2NoX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfY2hfbW9kZV9nZXQoY29kZWMsIHVjb250cm9sLCBzcGVjLT5jaGFubmVsX21vZGUsCisJCQkJICAgc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSwKKwkJCQkgICBzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMpOworfQorCitzdGF0aWMgaW50IGNvbmV4YW50X2NoX21vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGVyciA9IHNuZF9oZGFfY2hfbW9kZV9wdXQoY29kZWMsIHVjb250cm9sLCBzcGVjLT5jaGFubmVsX21vZGUsCisJCQkJICAgICAgc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSwKKwkJCQkgICAgICAmc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzKTsKKwlpZiAoZXJyID49IDAgJiYgc3BlYy0+bmVlZF9kYWNfZml4KQorCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IHNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyAvIDI7CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBDWFRfUElOX01PREUoeG5hbWUsIG5pZCwgZGlyKSBcCisJeyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZGV4ID0gMCwgIFwKKwkgIC5pbmZvID0gY29uZXhhbnRfY2hfbW9kZV9pbmZvLCBcCisJICAuZ2V0ID0gY29uZXhhbnRfY2hfbW9kZV9nZXQsIFwKKwkgIC5wdXQgPSBjb25leGFudF9jaF9tb2RlX3B1dCwgXAorCSAgLnByaXZhdGVfdmFsdWUgPSBuaWQgfCAoZGlyPDwxNikgfQorCitzdGF0aWMgaW50IGN4dF9ncGlvX2RhdGFfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworc3RhdGljIGludCBjeHRfZ3Bpb19kYXRhX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOworCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWxvbmcgKnZhbHAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJCSAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMHgwMCk7CisKKwkqdmFscCA9ICh2YWwgJiBtYXNrKSAhPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4dF9ncGlvX2RhdGFfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7CisJdW5zaWduZWQgY2hhciBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJbG9uZyB2YWwgPSAqdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWU7CisJdW5zaWduZWQgaW50IGdwaW9fZGF0YSA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAorCQkJCQkJICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwKKwkJCQkJCSAgICAweDAwKTsKKwl1bnNpZ25lZCBpbnQgb2xkX2RhdGEgPSBncGlvX2RhdGE7CisKKwkvKiBTZXQvdW5zZXQgdGhlIG1hc2tlZCBHUElPIGJpdChzKSBhcyBuZWVkZWQgKi8KKwlpZiAodmFsID09IDApCisJCWdwaW9fZGF0YSAmPSB+bWFzazsKKwllbHNlCisJCWdwaW9fZGF0YSB8PSBtYXNrOworCWlmIChncGlvX2RhdGEgPT0gb2xkX2RhdGEgJiYgIWNvZGVjLT5pbl9yZXN1bWUpCisJCXJldHVybiAwOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCBncGlvX2RhdGEpOworCXJldHVybiAxOworfQorCisjZGVmaW5lIENYVF9HUElPX0RBVEFfU1dJVENIKHhuYW1lLCBuaWQsIG1hc2spIFwKKwl7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSAwLCAgXAorCSAgLmluZm8gPSBjeHRfZ3Bpb19kYXRhX2luZm8sIFwKKwkgIC5nZXQgPSBjeHRfZ3Bpb19kYXRhX2dldCwgXAorCSAgLnB1dCA9IGN4dF9ncGlvX2RhdGFfcHV0LCBcCisJICAucHJpdmF0ZV92YWx1ZSA9IG5pZCB8IChtYXNrPDwxNikgfQorCitzdGF0aWMgaW50IGN4dF9zcGRpZl9jdHJsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitzdGF0aWMgaW50IGN4dF9zcGRpZl9jdHJsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmZmZjsKKwl1bnNpZ25lZCBjaGFyIG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlsb25nICp2YWxwID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWU7CisJdW5zaWduZWQgaW50IHZhbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAorCQkJCQkgICAgICBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlQsIDB4MDApOworCisJKnZhbHAgPSAodmFsICYgbWFzaykgIT0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeHRfc3BkaWZfY3RybF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7CisJdW5zaWduZWQgY2hhciBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJbG9uZyB2YWwgPSAqdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWU7CisJdW5zaWduZWQgaW50IGN0cmxfZGF0YSA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAorCQkJCQkJICAgIEFDX1ZFUkJfR0VUX0RJR0lfQ09OVkVSVCwKKwkJCQkJCSAgICAweDAwKTsKKwl1bnNpZ25lZCBpbnQgb2xkX2RhdGEgPSBjdHJsX2RhdGE7CisKKwkvKiBTZXQvdW5zZXQgdGhlIG1hc2tlZCBjb250cm9sIGJpdChzKSBhcyBuZWVkZWQgKi8KKwlpZiAodmFsID09IDApCisJCWN0cmxfZGF0YSAmPSB+bWFzazsKKwllbHNlCisJCWN0cmxfZGF0YSB8PSBtYXNrOworCWlmIChjdHJsX2RhdGEgPT0gb2xkX2RhdGEgJiYgIWNvZGVjLT5pbl9yZXN1bWUpCisJCXJldHVybiAwOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsCisJCQkgICAgY3RybF9kYXRhKTsKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBDWFRfU1BESUZfQ1RSTF9TV0lUQ0goeG5hbWUsIG5pZCwgbWFzaykgXAorCXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IDAsICBcCisJICAuaW5mbyA9IGN4dF9zcGRpZl9jdHJsX2luZm8sIFwKKwkgIC5nZXQgPSBjeHRfc3BkaWZfY3RybF9nZXQsIFwKKwkgIC5wdXQgPSBjeHRfc3BkaWZfY3RybF9wdXQsIFwKKwkgIC5wcml2YXRlX3ZhbHVlID0gbmlkIHwgKG1hc2s8PDE2KSB9CisKKyNlbmRpZiAvKiBDT05GSUdfU05EX0RFQlVHICovCisKKy8qIENvbmV4YW50IDUwNDUgc3BlY2lmaWMgKi8KKworc3RhdGljIGhkYV9uaWRfdCBjeHQ1MDQ1X2RhY19uaWRzWzFdID0geyAweDE5IH07CitzdGF0aWMgaGRhX25pZF90IGN4dDUwNDVfYWRjX25pZHNbMV0gPSB7IDB4MWEgfTsKK3N0YXRpYyBoZGFfbmlkX3QgY3h0NTA0NV9jYXBzcmNfbmlkc1sxXSA9IHsgMHgxYSB9OworI2RlZmluZSBDWFQ1MDQ1X1NQRElGX09VVAkweDEzCisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBjeHQ1MDQ1X21vZGVzWzFdID0geworCXsgMiwgTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGN4dDUwNDVfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDIsCisJLml0ZW1zID0geworCQl7ICJFeHRNaWMiLCAweDEgfSwKKwkJeyAiTGluZUluIiwgMHgyIH0sCisJfQorfTsKKworLyogdHVybiBvbi9vZmYgRUFQRCAoKyBtdXRlIEhQKSBhcyBhIG1hc3RlciBzd2l0Y2ggKi8KK3N0YXRpYyBpbnQgY3h0NTA0NV9ocF9tYXN0ZXJfc3dfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJaWYgKCFjb25leGFudF9lYXBkX3B1dChrY29udHJvbCwgdWNvbnRyb2wpKQorCQlyZXR1cm4gMDsKKworCS8qIHRvZ2dsZSBIUCBtdXRlIGFwcHJvcHJpYXRlbHkgKi8KKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTEsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIHNwZWMtPmN1cl9lYXBkID8gMCA6IDB4ODApOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMSwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgc3BlYy0+Y3VyX2VhcGQgPyAwIDogMHg4MCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIGJpbmQgdm9sdW1lcyBvZiBib3RoIE5JRCAweDEwIGFuZCAweDExICovCitzdGF0aWMgaW50IGN4dDUwNDVfaHBfbWFzdGVyX3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlsb25nICp2YWxwID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWU7CisJaW50IGNoYW5nZTsKKworCWNoYW5nZSA9IHNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMCwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkJICAweDdmLCB2YWxwWzBdICYgMHg3Zik7CisJY2hhbmdlIHw9IHNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMCwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkJICAgMHg3ZiwgdmFscFsxXSAmIDB4N2YpOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMSwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg3ZiwgdmFscFswXSAmIDB4N2YpOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMSwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg3ZiwgdmFscFsxXSAmIDB4N2YpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKworLyogbXV0ZSBpbnRlcm5hbCBzcGVha2VyIGlmIEhQIGlzIHBsdWdnZWQgKi8KK3N0YXRpYyB2b2lkIGN4dDUwNDVfaHBfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDExLCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDEwLCAwLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMCwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKK30KKworLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgc2Vuc2luZyAqLworc3RhdGljIHZvaWQgY3h0NTA0NV9ocF91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCXJlcyA+Pj0gMjY7CisJc3dpdGNoIChyZXMpIHsKKwljYXNlIENPTkVYQU5UX0hQX0VWRU5UOgorCQljeHQ1MDQ1X2hwX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA0NV9taXhlcnNbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsCisJCS5pbmZvID0gY29uZXhhbnRfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IGNvbmV4YW50X211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGNvbmV4YW50X211eF9lbnVtX3B1dAorCX0sCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJ5cGFzcyBDYXB0dXJlIFZvbHVtZSIsIDB4MTcsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBCeXBhc3MgQ2FwdHVyZSBTd2l0Y2giLCAweDE3LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxYSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDFhLCAweDAyLCBIREFfSU5QVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAorCQkuaW5mbyA9IHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9pbmZvLAorCQkuZ2V0ID0gc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2dldCwKKwkJLnB1dCA9IGN4dDUwNDVfaHBfbWFzdGVyX3ZvbF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gSERBX0NPTVBPU0VfQU1QX1ZBTCgweDExLCAzLCAwLCBIREFfT1VUUFVUKSwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAorCQkuaW5mbyA9IGNvbmV4YW50X2VhcGRfaW5mbywKKwkJLmdldCA9IGNvbmV4YW50X2VhcGRfZ2V0LAorCQkucHV0ID0gY3h0NTA0NV9ocF9tYXN0ZXJfc3dfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IDB4MTEsCisJfSwKKworCXt9Cit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGN4dDUwNDVfaW5pdF92ZXJic1tdID0geworCS8qIExpbmUgaW4sIE1pYyAqLworCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTnxBQ19QSU5DVExfVlJFRl81MCB9LAorCS8qIEhQLCBBbXAgICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsweDFBLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwweDAxfSwKKwl7MHgxQSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkgQUNfQU1QX1NFVF9PVVRQVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgwMH0sCisJezB4MUEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJIEFDX0FNUF9TRVRfT1VUUFVUfEFDX0FNUF9TRVRfUklHSFR8QUNfQU1QX1NFVF9MRUZUfDB4MDN9LAorCS8qIFJlY29yZCBzZWxlY3RvcjogRnJvbnQgbWljICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MDN9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCSBBQ19BTVBfU0VUX0lOUFVUfEFDX0FNUF9TRVRfUklHSFR8QUNfQU1QX1NFVF9MRUZUfDB4MTd9LAorCS8qIFNQRElGIHJvdXRlOiBQQ00gKi8KKwl7IDB4MTMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAgfSwKKwkvKiBwaW4gc2Vuc2luZyBvbiBIUCBhbmQgTWljIGphY2tzICovCisJezB4MTEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBDT05FWEFOVF9IUF9FVkVOVH0sCisJLyogRUFQRCAqLworCXsweDEwLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMHgwIH0sIC8qIGRlZmF1bHQgb24gKi8KKwl7IH0gLyogZW5kICovCit9OworCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworLyogVGVzdCBjb25maWd1cmF0aW9uIGZvciBkZWJ1Z2dpbmcsIG1vZGVsbGVkIGFmdGVyIHRoZSBBTEMyNjAgdGVzdAorICogY29uZmlndXJhdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGN4dDUwNDVfdGVzdF9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gNSwKKwkuaXRlbXMgPSB7CisJCXsgIk1JWEVSIiwgMHgwIH0sCisJCXsgIk1JQzEgcGluIiwgMHgxIH0sCisJCXsgIkxJTkUxIHBpbiIsIDB4MiB9LAorCQl7ICJIUC1PVVQgcGluIiwgMHgzIH0sCisJCXsgIkNEIHBpbiIsIDB4NCB9LAorICAgICAgICB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGN4dDUwNDVfdGVzdF9taXhlcltdID0geworCisJLyogT3V0cHV0IGNvbnRyb2xzICovCisJSERBX0NPREVDX1ZPTFVNRSgiT3V0QW1wLTEgVm9sdW1lIiwgMHgxOSwgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIk91dEFtcC0xIFN3aXRjaCIsIDB4MTksMHgwMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDEwLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MCwgSERBX09VVFBVVCksCisJCisJLyogTW9kZXMgZm9yIHJldGFza2luZyBwaW4gd2lkZ2V0cyAqLworCUNYVF9QSU5fTU9ERSgiSFAtT1VUIHBpbiBtb2RlIiwgMHgxMSwgQ1hUX1BJTl9ESVJfSU5PVVQpLAorCUNYVF9QSU5fTU9ERSgiTElORTEgcGluIG1vZGUiLCAweDEyLCBDWFRfUElOX0RJUl9JTk9VVCksCisKKwkvKiBMb29wYmFjayBtaXhlciBjb250cm9scyAqLworCUhEQV9DT0RFQ19WT0xVTUUoIk1JQzEgUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTUlDMSBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxJTkUgbG9vcGJhY2sgUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTElORSBsb29wYmFjayBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhQLU9VVCBsb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLCAweDE3LCAweDAzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIUC1PVVQgbG9vcGJhY2sgUGxheWJhY2sgU3dpdGNoIiwgMHgxNywgMHgwMywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE3LCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDA0LCBIREFfSU5QVVQpLAorCisJLyogQ29udHJvbHMgZm9yIEdQSU8gcGlucywgYXNzdW1pbmcgdGhleSBleGlzdCBhbmQgYXJlIGNvbmZpZ3VyZWQgYXMgb3V0cHV0cyAqLworCUNYVF9HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAwIiwgMHgwMSwgMHgwMSksCisjaWYgMCAgIC8qIGxpbWl0IHRoaXMgdG8gb25lIEdQSU8gcGluIGZvciBub3cgKi8JCisJQ1hUX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDEiLCAweDAxLCAweDAyKSwKKwlDWFRfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMiIsIDB4MDEsIDB4MDQpLAorCUNYVF9HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAzIiwgMHgwMSwgMHgwOCksCisjZW5kaWYKKwlDWFRfU1BESUZfQ1RSTF9TV0lUQ0goIlNQRElGIFBsYXliYWNrIFN3aXRjaCIsIDB4MTMsIDB4MDEpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDE3LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTcsIDB4MCwgSERBX09VVFBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkJLmluZm8gPSBjb25leGFudF9tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gY29uZXhhbnRfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gY29uZXhhbnRfbXV4X2VudW1fcHV0LAorCX0sCisKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGN4dDUwNDVfdGVzdF9pbml0X3ZlcmJzW10gPSB7CisJLyogRW5hYmxlIGFsbCBHUElPcyBhcyBvdXRwdXRzIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiAwICovCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDBmfSwKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAweDAwfSwKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19NQVNLLCAweDBmfSwKKworCS8qIEVuYWJsZSByZXRhc2tpbmcgcGlucyBhcyBvdXRwdXQsIGluaXRpYWxseSB3aXRob3V0IHBvd2VyIGFtcCAqLworCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCisJLyogRGlzYWJsZSBkaWdpdGFsIChTUERJRikgcGlucyBpbml0aWFsbHksIGJ1dCB1c2VycyBjYW4gZW5hYmxlCisJICogdGhlbSB2aWEgYSBtaXhlciBzd2l0Y2guICBJbiB0aGUgY2FzZSBvZiBTUERJRi1vdXQsIHRoaXMgaW5pdHZlcmIKKwkgKiBwYXlsb2FkIGFsc28gc2V0cyB0aGUgZ2VuZXJhdGlvbiB0byAwLCBvdXRwdXQgdG8gYmUgaW4gImNvbnN1bWVyIgorCSAqIFBDTSBmb3JtYXQsIGNvcHlyaWdodCBhc3NlcnRlZCwgbm8gcHJlLWVtcGhhc2lzIGFuZCBubyB2YWxpZGl0eQorCSAqIGNvbnRyb2wuCisJICovCisJezB4MTMsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCAwfSwKKworCS8qIFN0YXJ0IHdpdGggb3V0cHV0IHN1bSB3aWRnZXRzIG11dGVkIGFuZCB0aGVpciBvdXRwdXQgZ2FpbnMgYXQgbWluICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCisJLyogVW5tdXRlIHJldGFza2luZyBwaW4gd2lkZ2V0IG91dHB1dCBidWZmZXJzIHNpbmNlIHRoZSBkZWZhdWx0CisJICogc3RhdGUgYXBwZWFycyB0byBiZSBvdXRwdXQuICBBcyB0aGUgcGluIG1vZGUgaXMgY2hhbmdlZCBieSB0aGUKKwkgKiB1c2VyIHRoZSBwaW4gbW9kZSBjb250cm9sIHdpbGwgdGFrZSBjYXJlIG9mIGVuYWJsaW5nIHRoZSBwaW4ncworCSAqIGlucHV0L291dHB1dCBidWZmZXJzIGFzIG5lZWRlZC4KKwkgKi8KKwl7MHgxMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisKKwkvKiBNdXRlIGNhcHR1cmUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKworCS8qIFNldCBBREMgY29ubmVjdGlvbiBzZWxlY3QgdG8gbWF0Y2ggZGVmYXVsdCBtaXhlciBzZXR0aW5nIChtaWMxCisJICogcGluKQorCSAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwkvKiBNdXRlIGFsbCBpbnB1dHMgdG8gbWl4ZXIgd2lkZ2V0IChldmVuIHVuY29ubmVjdGVkIG9uZXMpICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwgLyogTWl4ZXIgcGluICovCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwgLyogTWljMSBwaW4gKi8KKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LCAvKiBMaW5lIHBpbiAqLworCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sIC8qIEhQIHBpbiAqLworCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sIC8qIENEIHBpbiAqLworCisJeyB9Cit9OworI2VuZGlmCisKKworLyogaW5pdGlhbGl6ZSBqYWNrLXNlbnNpbmcsIHRvbyAqLworc3RhdGljIGludCBjeHQ1MDQ1X2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJY29uZXhhbnRfaW5pdChjb2RlYyk7CisJY3h0NTA0NV9ocF9hdXRvbXV0ZShjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKKworZW51bSB7CisJQ1hUNTA0NV9MQVBUT1AsCS8qIExhcHRvcHMgdy8gRUFQRCBzdXBwb3J0ICovCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCUNYVDUwNDVfVEVTVCwKKyNlbmRpZgorCUNYVDUwNDVfTU9ERUxTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3h0NTA0NV9tb2RlbHNbQ1hUNTA0NV9NT0RFTFNdID0geworCVtDWFQ1MDQ1X0xBUFRPUF0JPSAibGFwdG9wIiwKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJW0NYVDUwNDVfVEVTVF0JCT0gInRlc3QiLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgY3h0NTA0NV9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzBiNywgIkhQIERWNjAwMFoiLCBDWFQ1MDQ1X0xBUFRPUCksCisJe30KK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfY3h0NTA0NShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYzsKKwlpbnQgYm9hcmRfY29uZmlnOworCisJc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzcGVjKQorCQlyZXR1cm4gLUVOT01FTTsKKwltdXRleF9pbml0KCZzcGVjLT5hbXBfbXV0ZXgpOworCWNvZGVjLT5zcGVjID0gc3BlYzsKKworCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IDI7CisJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGN4dDUwNDVfZGFjX25pZHMpOworCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gY3h0NTA0NV9kYWNfbmlkczsKKwlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IENYVDUwNDVfU1BESUZfT1VUOworCXNwZWMtPm51bV9hZGNfbmlkcyA9IDE7CisJc3BlYy0+YWRjX25pZHMgPSBjeHQ1MDQ1X2FkY19uaWRzOworCXNwZWMtPmNhcHNyY19uaWRzID0gY3h0NTA0NV9jYXBzcmNfbmlkczsKKwlzcGVjLT5pbnB1dF9tdXggPSAmY3h0NTA0NV9jYXB0dXJlX3NvdXJjZTsKKwlzcGVjLT5udW1fbWl4ZXJzID0gMTsKKwlzcGVjLT5taXhlcnNbMF0gPSBjeHQ1MDQ1X21peGVyczsKKwlzcGVjLT5udW1faW5pdF92ZXJicyA9IDE7CisJc3BlYy0+aW5pdF92ZXJic1swXSA9IGN4dDUwNDVfaW5pdF92ZXJiczsKKwlzcGVjLT5zcGRpZl9yb3V0ZSA9IDA7CisJc3BlYy0+bnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoY3h0NTA0NV9tb2RlcyksCisJc3BlYy0+Y2hhbm5lbF9tb2RlID0gY3h0NTA0NV9tb2RlcywKKworCisJY29kZWMtPnBhdGNoX29wcyA9IGNvbmV4YW50X3BhdGNoX29wczsKKwljb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50ID0gY3h0NTA0NV9ocF91bnNvbF9ldmVudDsKKworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBDWFQ1MDQ1X01PREVMUywKKwkJCQkJCSAgY3h0NTA0NV9tb2RlbHMsCisJCQkJCQkgIGN4dDUwNDVfY2ZnX3RibCk7CisJc3dpdGNoIChib2FyZF9jb25maWcpIHsKKwljYXNlIENYVDUwNDVfTEFQVE9QOgorCQlzcGVjLT5pbnB1dF9tdXggPSAmY3h0NTA0NV9jYXB0dXJlX3NvdXJjZTsKKwkJc3BlYy0+bnVtX2luaXRfdmVyYnMgPSAyOworCQlzcGVjLT5pbml0X3ZlcmJzWzFdID0gY3h0NTA0NV9pbml0X3ZlcmJzOworCQlzcGVjLT5taXhlcnNbMF0gPSBjeHQ1MDQ1X21peGVyczsKKwkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gY3h0NTA0NV9pbml0OworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJY2FzZSBDWFQ1MDQ1X1RFU1Q6CisJCXNwZWMtPmlucHV0X211eCA9ICZjeHQ1MDQ1X3Rlc3RfY2FwdHVyZV9zb3VyY2U7CisJCXNwZWMtPm1peGVyc1swXSA9IGN4dDUwNDVfdGVzdF9taXhlcjsKKwkJc3BlYy0+aW5pdF92ZXJic1swXSA9IGN4dDUwNDVfdGVzdF9pbml0X3ZlcmJzOworI2VuZGlmCQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBDb25leGFudCA1MDQ3IHNwZWNpZmljICovCisKK3N0YXRpYyBoZGFfbmlkX3QgY3h0NTA0N19kYWNfbmlkc1sxXSA9IHsgMHgxMCB9Oworc3RhdGljIGhkYV9uaWRfdCBjeHQ1MDQ3X2FkY19uaWRzWzFdID0geyAweDEyIH07CitzdGF0aWMgaGRhX25pZF90IGN4dDUwNDdfY2Fwc3JjX25pZHNbMV0gPSB7IDB4MWEgfTsKKyNkZWZpbmUgQ1hUNTA0N19TUERJRl9PVVQJMHgxMQorCitzdGF0aWMgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgY3h0NTA0N19tb2Rlc1sxXSA9IHsKKwl7IDIsIE5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBjeHQ1MDQ3X2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAyLAorCS5pdGVtcyA9IHsKKwkJeyAiRXh0TWljIiwgMHgxIH0sCisJCXsgIkludE1pYyIsIDB4MiB9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBjeHQ1MDQ3X2hwX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSAxLAorCS5pdGVtcyA9IHsKKwkJeyAiRXh0TWljIiwgMHgxIH0sCisJfQorfTsKKworLyogdHVybiBvbi9vZmYgRUFQRCAoKyBtdXRlIEhQKSBhcyBhIG1hc3RlciBzd2l0Y2ggKi8KK3N0YXRpYyBpbnQgY3h0NTA0N19ocF9tYXN0ZXJfc3dfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJaWYgKCFjb25leGFudF9lYXBkX3B1dChrY29udHJvbCwgdWNvbnRyb2wpKQorCQlyZXR1cm4gMDsKKworCS8qIHRvZ2dsZSBIUCBtdXRlIGFwcHJvcHJpYXRlbHkgKi8KKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTMsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIHNwZWMtPmN1cl9lYXBkID8gMCA6IDB4ODApOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMywgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgc3BlYy0+Y3VyX2VhcGQgPyAwIDogMHg4MCk7CisJcmV0dXJuIDE7Cit9CisKKyNpZiAwCisvKiBiaW5kIHZvbHVtZXMgb2YgYm90aCBOSUQgMHgxMyBhbmQgMHgxZCAqLworc3RhdGljIGludCBjeHQ1MDQ3X2hwX21hc3Rlcl92b2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCWludCBjaGFuZ2U7CisKKwljaGFuZ2UgPSBzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MWMsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJCSAgMHg3ZiwgdmFscFswXSAmIDB4N2YpOworCWNoYW5nZSB8PSBzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MWMsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJCSAgIDB4N2YsIHZhbHBbMV0gJiAweDdmKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTMsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4N2YsIHZhbHBbMF0gJiAweDdmKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTMsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4N2YsIHZhbHBbMV0gJiAweDdmKTsKKwlyZXR1cm4gY2hhbmdlOworfQorI2VuZGlmCisKKy8qIG11dGUgaW50ZXJuYWwgc3BlYWtlciBpZiBIUCBpcyBwbHVnZ2VkICovCitzdGF0aWMgdm9pZCBjeHQ1MDQ3X2hwX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxMywgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxYywgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MWMsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7Cit9CisKKy8qIHRvZ2dsZSBpbnB1dCBvZiBidWlsdC1pbiBhbmQgbWljIGphY2sgYXBwcm9wcmlhdGVseSAqLworc3RhdGljIHZvaWQgY3h0NTA0N19ocF9hdXRvbWljKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgbWljX2phY2tfb25bXSA9IHsKKwkJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAorCQl7fQorCX07CisJc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBtaWNfamFja19vZmZbXSA9IHsKKwkJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAorCQl7fQorCX07CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDA4LCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJaWYgKHByZXNlbnQpCisJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIG1pY19qYWNrX29uKTsKKwllbHNlCisJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIG1pY19qYWNrX29mZik7Cit9CisKKy8qIHVuc29saWNpdGVkIGV2ZW50IGZvciBIUCBqYWNrIHNlbnNpbmcgKi8KK3N0YXRpYyB2b2lkIGN4dDUwNDdfaHBfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICB1bnNpZ25lZCBpbnQgcmVzKQoreworCXJlcyA+Pj0gMjY7CisJc3dpdGNoIChyZXMpIHsKKwljYXNlIENPTkVYQU5UX0hQX0VWRU5UOgorCQljeHQ1MDQ3X2hwX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSBDT05FWEFOVF9NSUNfRVZFTlQ6CisJCWN4dDUwNDdfaHBfYXV0b21pYyhjb2RlYyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGN4dDUwNDdfbWl4ZXJzW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCQkuaW5mbyA9IGNvbmV4YW50X211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBjb25leGFudF9tdXhfZW51bV9nZXQsCisJCS5wdXQgPSBjb25leGFudF9tdXhfZW51bV9wdXQKKwl9LAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCeXBhc3MgQ2FwdHVyZSBWb2x1bWUiLCAweDE5LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgQnlwYXNzIENhcHR1cmUgU3dpdGNoIiwgMHgxOSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MTIsIDB4MDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxMiwgMHgwMywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJQQ00gVm9sdW1lIiwgMHgxMCwgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIlBDTSBTd2l0Y2giLCAweDEwLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgxMywgMHgwMCwgSERBX09VVFBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCisJCS5pbmZvID0gY29uZXhhbnRfZWFwZF9pbmZvLAorCQkuZ2V0ID0gY29uZXhhbnRfZWFwZF9nZXQsCisJCS5wdXQgPSBjeHQ1MDQ3X2hwX21hc3Rlcl9zd19wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gMHgxMywKKwl9LAorCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHQ1MDQ3X2hwX21peGVyc1tdID0geworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwKKwkJLmluZm8gPSBjb25leGFudF9tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gY29uZXhhbnRfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gY29uZXhhbnRfbXV4X2VudW1fcHV0CisJfSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQnlwYXNzIENhcHR1cmUgVm9sdW1lIiwgMHgxOSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIEJ5cGFzcyBDYXB0dXJlIFN3aXRjaCIsIDB4MTksMHgwMixIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxMiwgMHgwMywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDEyLCAweDAzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlBDTSBWb2x1bWUiLCAweDEwLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUENNIFN3aXRjaCIsIDB4MTAsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDEzLCAweDAwLCBIREFfT1VUUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJLmluZm8gPSBjb25leGFudF9lYXBkX2luZm8sCisJCS5nZXQgPSBjb25leGFudF9lYXBkX2dldCwKKwkJLnB1dCA9IGN4dDUwNDdfaHBfbWFzdGVyX3N3X3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSAweDEzLAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBjeHQ1MDQ3X2luaXRfdmVyYnNbXSA9IHsKKwkvKiBMaW5lIGluLCBNaWMsIEJ1aWx0LWluIE1pYyAqLworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTnxBQ19QSU5DVExfVlJFRl81MCB9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTnxBQ19QSU5DVExfVlJFRl81MCB9LAorCS8qIEhQLCBBbXAgICovCisJezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsweDFBLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwweDAzfSwKKwl7MHgxQSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkgQUNfQU1QX1NFVF9PVVRQVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgwMH0sCisJezB4MUEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJIEFDX0FNUF9TRVRfT1VUUFVUfEFDX0FNUF9TRVRfUklHSFR8QUNfQU1QX1NFVF9MRUZUfDB4MDN9LAorCS8qIFJlY29yZCBzZWxlY3RvcjogRnJvbnQgbWljICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MDN9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCSBBQ19BTVBfU0VUX0lOUFVUfEFDX0FNUF9TRVRfUklHSFR8QUNfQU1QX1NFVF9MRUZUfDB4MTd9LAorCS8qIFNQRElGIHJvdXRlOiBQQ00gKi8KKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAgfSwKKwl7IH0gLyogZW5kICovCit9OworCisvKiBjb25maWd1cmF0aW9uIGZvciBUb3NoaWJhIExhcHRvcHMgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA0N190b3NoaWJhX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgxMywgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4MCB9LCAvKiBkZWZhdWx0IG9uICovCisJLyogcGluIHNlbnNpbmcgb24gSFAgYW5kIE1pYyBqYWNrcyAqLworCXsweDEzLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQ09ORVhBTlRfSFBfRVZFTlR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQ09ORVhBTlRfTUlDX0VWRU5UfSwKKwl7fQorfTsKKworLyogY29uZmlndXJhdGlvbiBmb3IgSFAgTGFwdG9wcyAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBjeHQ1MDQ3X2hwX2luaXRfdmVyYnNbXSA9IHsKKwkvKiBwaW4gc2Vuc2luZyBvbiBIUCBhbmQgTWljIGphY2tzICovCisJezB4MTMsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBDT05FWEFOVF9IUF9FVkVOVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBDT05FWEFOVF9NSUNfRVZFTlR9LAorCXt9Cit9OworCisvKiBUZXN0IGNvbmZpZ3VyYXRpb24gZm9yIGRlYnVnZ2luZywgbW9kZWxsZWQgYWZ0ZXIgdGhlIEFMQzI2MCB0ZXN0CisgKiBjb25maWd1cmF0aW9uLgorICovCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGN4dDUwNDdfdGVzdF9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gNSwKKwkuaXRlbXMgPSB7CisJCXsgIk1JWEVSIiwgMHgwIH0sCisJCXsgIkxJTkUxIHBpbiIsIDB4MSB9LAorCQl7ICJNSUMxIHBpbiIsIDB4MiB9LAorCQl7ICJNSUMyIHBpbiIsIDB4MyB9LAorCQl7ICJDRCBwaW4iLCAweDQgfSwKKyAgICAgICAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHQ1MDQ3X3Rlc3RfbWl4ZXJbXSA9IHsKKworCS8qIE91dHB1dCBvbmx5IGNvbnRyb2xzICovCisJSERBX0NPREVDX1ZPTFVNRSgiT3V0QW1wLTEgVm9sdW1lIiwgMHgxMCwgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIk91dEFtcC0xIFN3aXRjaCIsIDB4MTAsMHgwMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiT3V0QW1wLTIgVm9sdW1lIiwgMHgxYywgMHgwMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIk91dEFtcC0yIFN3aXRjaCIsIDB4MWMsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgxZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDFkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRQaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDEzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkUGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxMywgMHgwLCBIREFfT1VUUFVUKSwKKworCS8qIE1vZGVzIGZvciByZXRhc2tpbmcgcGluIHdpZGdldHMgKi8KKwlDWFRfUElOX01PREUoIkxJTkUxIHBpbiBtb2RlIiwgMHgxNCwgQ1hUX1BJTl9ESVJfSU5PVVQpLAorCUNYVF9QSU5fTU9ERSgiTUlDMSBwaW4gbW9kZSIsIDB4MTUsIENYVF9QSU5fRElSX0lOT1VUKSwKKworCS8qIExvb3BiYWNrIG1peGVyIGNvbnRyb2xzICovCisJSERBX0NPREVDX1ZPTFVNRSgiTUlDMSBQbGF5YmFjayBWb2x1bWUiLCAweDE5LCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNSUMxIFBsYXliYWNrIFN3aXRjaCIsIDB4MTksIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTUlDMiBQbGF5YmFjayBWb2x1bWUiLCAweDE5LCAweDAzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNSUMyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTksIDB4MDMsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTElORSBQbGF5YmFjayBWb2x1bWUiLCAweDE5LCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMSU5FIFBsYXliYWNrIFN3aXRjaCIsIDB4MTksIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxOSwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxOSwgMHgwNCwgSERBX0lOUFVUKSwKKworI2lmIDAgICAKKwkvKiBDb250cm9scyBmb3IgR1BJTyBwaW5zLCBhc3N1bWluZyB0aGV5IGV4aXN0IGFuZCBhcmUgY29uZmlndXJlZCBhcyBvdXRwdXRzICovCisJQ1hUX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDAiLCAweDAxLCAweDAxKSwKKwlDWFRfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMSIsIDB4MDEsIDB4MDIpLAorCUNYVF9HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAyIiwgMHgwMSwgMHgwNCksCisJQ1hUX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDMiLCAweDAxLCAweDA4KSwKKyNlbmRpZgorCUNYVF9TUERJRl9DVFJMX1NXSVRDSCgiU1BESUYgUGxheWJhY2sgU3dpdGNoIiwgMHgxOCwgMHgwMSksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MTksIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxOSwgMHgwLCBIREFfT1VUUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuaW5mbyA9IGNvbmV4YW50X211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBjb25leGFudF9tdXhfZW51bV9nZXQsCisJCS5wdXQgPSBjb25leGFudF9tdXhfZW51bV9wdXQsCisJfSwKKworCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA0N190ZXN0X2luaXRfdmVyYnNbXSA9IHsKKwkvKiBFbmFibGUgYWxsIEdQSU9zIGFzIG91dHB1dHMgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIDAgKi8KKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MGZ9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDB9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MGZ9LAorCisJLyogRW5hYmxlIHJldGFza2luZyBwaW5zIGFzIG91dHB1dCwgaW5pdGlhbGx5IHdpdGhvdXQgcG93ZXIgYW1wICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisKKwkvKiBEaXNhYmxlIGRpZ2l0YWwgKFNQRElGKSBwaW5zIGluaXRpYWxseSwgYnV0IHVzZXJzIGNhbiBlbmFibGUKKwkgKiB0aGVtIHZpYSBhIG1peGVyIHN3aXRjaC4gIEluIHRoZSBjYXNlIG9mIFNQRElGLW91dCwgdGhpcyBpbml0dmVyYgorCSAqIHBheWxvYWQgYWxzbyBzZXRzIHRoZSBnZW5lcmF0aW9uIHRvIDAsIG91dHB1dCB0byBiZSBpbiAiY29uc3VtZXIiCisJICogUENNIGZvcm1hdCwgY29weXJpZ2h0IGFzc2VydGVkLCBubyBwcmUtZW1waGFzaXMgYW5kIG5vIHZhbGlkaXR5CisJICogY29udHJvbC4KKwkgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIDB9LAorCisJLyogRW5zdXJlIG1pYzEsIG1pYzIsIGxpbmUxIHBpbiB3aWRnZXRzIHRha2UgaW5wdXQgZnJvbSB0aGUgCisJICogT1VUMSBzdW0gYnVzIHdoZW4gYWN0aW5nIGFzIGFuIG91dHB1dC4KKwkgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMH0sCisKKwkvKiBTdGFydCB3aXRoIG91dHB1dCBzdW0gd2lkZ2V0cyBtdXRlZCBhbmQgdGhlaXIgb3V0cHV0IGdhaW5zIGF0IG1pbiAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKworCS8qIFVubXV0ZSByZXRhc2tpbmcgcGluIHdpZGdldCBvdXRwdXQgYnVmZmVycyBzaW5jZSB0aGUgZGVmYXVsdAorCSAqIHN0YXRlIGFwcGVhcnMgdG8gYmUgb3V0cHV0LiAgQXMgdGhlIHBpbiBtb2RlIGlzIGNoYW5nZWQgYnkgdGhlCisJICogdXNlciB0aGUgcGluIG1vZGUgY29udHJvbCB3aWxsIHRha2UgY2FyZSBvZiBlbmFibGluZyB0aGUgcGluJ3MKKwkgKiBpbnB1dC9vdXRwdXQgYnVmZmVycyBhcyBuZWVkZWQuCisJICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDEzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisKKwkvKiBNdXRlIGNhcHR1cmUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKworCS8qIFNldCBBREMgY29ubmVjdGlvbiBzZWxlY3QgdG8gbWF0Y2ggZGVmYXVsdCBtaXhlciBzZXR0aW5nIChtaWMxCisJICogcGluKQorCSAqLworCXsweDEyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwkvKiBNdXRlIGFsbCBpbnB1dHMgdG8gbWl4ZXIgd2lkZ2V0IChldmVuIHVuY29ubmVjdGVkIG9uZXMpICovCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwgLyogbWljMSBwaW4gKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LCAvKiBtaWMyIHBpbiAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sIC8qIGxpbmUxIHBpbiAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sIC8qIGxpbmUyIHBpbiAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sIC8qIENEIHBpbiAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg1KX0sIC8qIEJlZXAtZ2VuIHBpbiAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg2KX0sIC8qIExpbmUtb3V0IHBpbiAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg3KX0sIC8qIEhQLXBpbiBwaW4gKi8KKworCXsgfQorfTsKKyNlbmRpZgorCisKKy8qIGluaXRpYWxpemUgamFjay1zZW5zaW5nLCB0b28gKi8KK3N0YXRpYyBpbnQgY3h0NTA0N19ocF9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWNvbmV4YW50X2luaXQoY29kZWMpOworCWN4dDUwNDdfaHBfYXV0b211dGUoY29kZWMpOworCWN4dDUwNDdfaHBfYXV0b21pYyhjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKKworZW51bSB7CisJQ1hUNTA0N19MQVBUT1AsCQkvKiBMYXB0b3BzIHcvbyBFQVBEIHN1cHBvcnQgKi8KKwlDWFQ1MDQ3X0xBUFRPUF9IUCwJLyogU29tZSBIUCBsYXB0b3BzICovCisJQ1hUNTA0N19MQVBUT1BfRUFQRCwJLyogTGFwdG9wcyB3aXRoIEVBUEQgc3VwcG9ydCAqLworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKKwlDWFQ1MDQ3X1RFU1QsCisjZW5kaWYKKwlDWFQ1MDQ3X01PREVMUworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmN4dDUwNDdfbW9kZWxzW0NYVDUwNDdfTU9ERUxTXSA9IHsKKwlbQ1hUNTA0N19MQVBUT1BdCT0gImxhcHRvcCIsCisJW0NYVDUwNDdfTEFQVE9QX0hQXQk9ICJsYXB0b3AtaHAiLAorCVtDWFQ1MDQ3X0xBUFRPUF9FQVBEXQk9ICJsYXB0b3AtZWFwZCIsCisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCVtDWFQ1MDQ3X1RFU1RdCQk9ICJ0ZXN0IiwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGN4dDUwNDdfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwYTAsICJIUCBEVjEwMDAiLCBDWFQ1MDQ3X0xBUFRPUCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzBiMiwgIkhQIERWMjAwMFQvRFYzMDAwVCIsIENYVDUwNDdfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGE1LCAiSFAgRFY1MjAwVC9EVjgwMDBUIiwgQ1hUNTA0N19MQVBUT1BfSFApLAorCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMzEsICJUb3NoaWJhIFAxMDAiLCBDWFQ1MDQ3X0xBUFRPUF9FQVBEKSwKKwl7fQorfTsKKworc3RhdGljIGludCBwYXRjaF9jeHQ1MDQ3KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjOworCWludCBib2FyZF9jb25maWc7CisKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNwZWMpCisJCXJldHVybiAtRU5PTUVNOworCW11dGV4X2luaXQoJnNwZWMtPmFtcF9tdXRleCk7CisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKKwlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IEFSUkFZX1NJWkUoY3h0NTA0N19kYWNfbmlkcyk7CisJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBjeHQ1MDQ3X2RhY19uaWRzOworCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gQ1hUNTA0N19TUERJRl9PVVQ7CisJc3BlYy0+bnVtX2FkY19uaWRzID0gMTsKKwlzcGVjLT5hZGNfbmlkcyA9IGN4dDUwNDdfYWRjX25pZHM7CisJc3BlYy0+Y2Fwc3JjX25pZHMgPSBjeHQ1MDQ3X2NhcHNyY19uaWRzOworCXNwZWMtPmlucHV0X211eCA9ICZjeHQ1MDQ3X2NhcHR1cmVfc291cmNlOworCXNwZWMtPm51bV9taXhlcnMgPSAxOworCXNwZWMtPm1peGVyc1swXSA9IGN4dDUwNDdfbWl4ZXJzOworCXNwZWMtPm51bV9pbml0X3ZlcmJzID0gMTsKKwlzcGVjLT5pbml0X3ZlcmJzWzBdID0gY3h0NTA0N19pbml0X3ZlcmJzOworCXNwZWMtPnNwZGlmX3JvdXRlID0gMDsKKwlzcGVjLT5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShjeHQ1MDQ3X21vZGVzKSwKKwlzcGVjLT5jaGFubmVsX21vZGUgPSBjeHQ1MDQ3X21vZGVzLAorCisJY29kZWMtPnBhdGNoX29wcyA9IGNvbmV4YW50X3BhdGNoX29wczsKKwljb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50ID0gY3h0NTA0N19ocF91bnNvbF9ldmVudDsKKworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBDWFQ1MDQ3X01PREVMUywKKwkJCQkJCSAgY3h0NTA0N19tb2RlbHMsCisJCQkJCQkgIGN4dDUwNDdfY2ZnX3RibCk7CisJc3dpdGNoIChib2FyZF9jb25maWcpIHsKKwljYXNlIENYVDUwNDdfTEFQVE9QOgorCQlicmVhazsKKwljYXNlIENYVDUwNDdfTEFQVE9QX0hQOgorCQlzcGVjLT5pbnB1dF9tdXggPSAmY3h0NTA0N19ocF9jYXB0dXJlX3NvdXJjZTsKKwkJc3BlYy0+bnVtX2luaXRfdmVyYnMgPSAyOworCQlzcGVjLT5pbml0X3ZlcmJzWzFdID0gY3h0NTA0N19ocF9pbml0X3ZlcmJzOworCQlzcGVjLT5taXhlcnNbMF0gPSBjeHQ1MDQ3X2hwX21peGVyczsKKwkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gY3h0NTA0N19ocF9pbml0OworCQlicmVhazsKKwljYXNlIENYVDUwNDdfTEFQVE9QX0VBUEQ6CisJCXNwZWMtPm51bV9pbml0X3ZlcmJzID0gMjsKKwkJc3BlYy0+aW5pdF92ZXJic1sxXSA9IGN4dDUwNDdfdG9zaGliYV9pbml0X3ZlcmJzOworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfU05EX0RFQlVHCisJY2FzZSBDWFQ1MDQ3X1RFU1Q6CisJCXNwZWMtPmlucHV0X211eCA9ICZjeHQ1MDQ3X3Rlc3RfY2FwdHVyZV9zb3VyY2U7CisJCXNwZWMtPm1peGVyc1swXSA9IGN4dDUwNDdfdGVzdF9taXhlcjsKKwkJc3BlYy0+aW5pdF92ZXJic1swXSA9IGN4dDUwNDdfdGVzdF9pbml0X3ZlcmJzOworI2VuZGlmCQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfY29uZXhhbnRbXSA9IHsKKwl7IC5pZCA9IDB4MTRmMTUwNDUsIC5uYW1lID0gIkNYVDUwNDUiLCAucGF0Y2ggPSBwYXRjaF9jeHQ1MDQ1IH0sCisJeyAuaWQgPSAweDE0ZjE1MDQ3LCAubmFtZSA9ICJDWFQ1MDQ3IiwgLnBhdGNoID0gcGF0Y2hfY3h0NTA0NyB9LAorCXt9IC8qIHRlcm1pbmF0b3IgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCmluZGV4IDRlMGMzYzEuLjE0NTY4MmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCkBAIC0zMiw2ICszMiwxMCBAQAogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgogI2luY2x1ZGUgImhkYV9sb2NhbC5oIgogCisjZGVmaW5lIEFMQzg4MF9GUk9OVF9FVkVOVAkJMHgwMQorI2RlZmluZSBBTEM4ODBfRENWT0xfRVZFTlQJCTB4MDIKKyNkZWZpbmUgQUxDODgwX0hQX0VWRU5UCQkJMHgwNAorI2RlZmluZSBBTEM4ODBfTUlDX0VWRU5UCQkweDA4CiAKIC8qIEFMQzg4MCBib2FyZCBjb25maWcgdHlwZSAqLwogZW51bSB7CkBAIC00OCw3ICs1MiwxMCBAQAogCUFMQzg4MF9BU1VTX0RJRywKIAlBTEM4ODBfQVNVU19XMVYsCiAJQUxDODgwX0FTVVNfRElHMiwKKwlBTEM4ODBfRlVKSVRTVSwKIAlBTEM4ODBfVU5JV0lMTF9ESUcsCisJQUxDODgwX1VOSVdJTEwsCisJQUxDODgwX1VOSVdJTExfUDUzLAogCUFMQzg4MF9DTEVWTywKIAlBTEM4ODBfVENMX1M3MDAsCiAJQUxDODgwX0xHLApAQCAtNzcsOCArODQsMTIgQEAKIC8qIEFMQzI2MiBtb2RlbHMgKi8KIGVudW0gewogCUFMQzI2Ml9CQVNJQywKKwlBTEMyNjJfSElQUE8sCisJQUxDMjYyX0hJUFBPXzEsCiAJQUxDMjYyX0ZVSklUU1UsCiAJQUxDMjYyX0hQX0JQQywKKwlBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMLAorCUFMQzI2Ml9IUF9CUENfRDcwMDBfV0YsCiAJQUxDMjYyX0JFTlFfRUQ4LAogCUFMQzI2Ml9BVVRPLAogCUFMQzI2Ml9NT0RFTF9MQVNUIC8qIGxhc3QgdGFnICovCkBAIC05MSwxNiArMTAyLDMwIEBACiAJQUxDODYxXzNTVF9ESUcsCiAJQUxDODYxXzZTVF9ESUcsCiAJQUxDODYxX1VOSVdJTExfTTMxLAorCUFMQzg2MV9UT1NISUJBLAorCUFMQzg2MV9BU1VTLAorCUFMQzg2MV9BU1VTX0xBUFRPUCwKIAlBTEM4NjFfQVVUTywKIAlBTEM4NjFfTU9ERUxfTEFTVCwKIH07CiAKKy8qIEFMQzg2MS1WRCBtb2RlbHMgKi8KK2VudW0geworCUFMQzY2MFZEXzNTVCwKKwlBTEM4NjFWRF8zU1QsCisJQUxDODYxVkRfM1NUX0RJRywKKwlBTEM4NjFWRF82U1RfRElHLAorCUFMQzg2MVZEX0FVVE8sCisJQUxDODYxVkRfTU9ERUxfTEFTVCwKK307CisKIC8qIEFMQzg4MiBtb2RlbHMgKi8KIGVudW0gewogCUFMQzg4Ml8zU1RfRElHLAogCUFMQzg4Ml82U1RfRElHLAogCUFMQzg4Ml9BUklNQSwKIAlBTEM4ODJfQVVUTywKKwlBTEM4ODVfTUFDUFJPLAogCUFMQzg4Ml9NT0RFTF9MQVNULAogfTsKIApAQCAtMTEwLDggKzEzNSwxMiBAQAogCUFMQzg4M18zU1RfNmNoX0RJRywKIAlBTEM4ODNfM1NUXzZjaCwKIAlBTEM4ODNfNlNUX0RJRywKKwlBTEM4ODNfVEFSR0FfRElHLAorCUFMQzg4M19UQVJHQV8yY2hfRElHLAogCUFMQzg4OF9ERU1PX0JPQVJELAogCUFMQzg4M19BQ0VSLAorCUFMQzg4M19NRURJT04sCisJQUxDODgzX0xBUFRPUF9FQVBELAogCUFMQzg4M19BVVRPLAogCUFMQzg4M19NT0RFTF9MQVNULAogfTsKQEAgLTEwMTUsNiArMTA0NCw2MCBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKKy8qIFVuaXdpbGwgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfdW5pd2lsbF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkhQaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkhQaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoImlTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiaVNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCisJCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKKwkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKKwkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfZnVqaXRzdV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJFeHQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRXh0IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODBfdW5pd2lsbF9wNTNfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJIUGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJIUGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJpU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoImlTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCiAvKgogICogYnVpbGQgY29udHJvbCBlbGVtZW50cwogICovCkBAIC0xMjQ4LDYgKzEzMzEsMTU5IEBACiAJeyB9CiB9OwogCisvKgorICogVW5pd2lsbCBwaW4gY29uZmlndXJhdGlvbjoKKyAqIEhQID0gMHgxNCwgSW50ZXJuYWxTcGVha2VyID0gMHgxNSwgbWljID0gMHgxOCwgaW50ZXJuYWwgbWljID0gMHgxOSwKKyAqIGxpbmUgPSAweDFhCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3VuaXdpbGxfaW5pdF92ZXJic1tdID0geworCXsweDEzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiB7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LCAqLworCS8qIHsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sICovCisJezB4MWMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9NSUNfRVZFTlR9LAorCisJeyB9Cit9OworCisvKgorKiBVbml3aWxsIFA1MworKiBIUCA9IDB4MTQsIEludGVybmFsU3BlYWtlciA9IDB4MTUsIG1pYyA9IDB4MTksIAorICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF91bml3aWxsX3A1M19pbml0X3ZlcmJzW10gPSB7CisJezB4MTMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogSFAgKi8KKworCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAorCisJezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKworCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9EQ1ZPTF9FVkVOVH0sCisKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX2JlZXBfaW5pdF92ZXJic1tdID0geworCXsgMHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg1KSB9LAorCXsgfQorfTsKKworLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLworc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisgCXVuc2lnbmVkIGludCBwcmVzZW50OworCisgCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTQsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTUsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE1LCAxLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNiwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTYsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE4LCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwYiwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCSAgICAweDcwMDAgfCAoMHgwMSA8PCA4KSB8IChwcmVzZW50ID8gMHg4MCA6IDApKTsKK30KKworc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCByZXMpCit7CisJLyogTG9va3MgbGlrZSB0aGUgdW5zb2wgZXZlbnQgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHN0YW5kYXJkCisJICogZGVmaW5pdGlvbi4gIDRiaXQgdGFnIGlzIHBsYWNlZCBhdCAyOCBiaXQhCisJICovCisJaWYgKChyZXMgPj4gMjgpID09IEFMQzg4MF9IUF9FVkVOVCB8fAorCSAgICAocmVzID4+IDI4KSA9PSBBTEM4ODBfTUlDX0VWRU5UKQorCQlhbGM4ODBfdW5pd2lsbF9hdXRvbXV0ZShjb2RlYyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX3A1M19ocF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKyAJdW5zaWduZWQgaW50IHByZXNlbnQ7CisKKyAJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNCwgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE1LCAwLCBIREFfSU5QVVQsIDAsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE1LCAxLCBIREFfSU5QVVQsIDAsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX3A1M19kY3ZvbF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKwkKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDIxLCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfVk9MVU1FX0tOT0JfQ09OVFJPTCwgMCkgJiAweDdmOworCisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDBjLCAwLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDdmLCBwcmVzZW50KTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MGMsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4N2YsICBwcmVzZW50KTsKKworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgwZCwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg3ZiwgIHByZXNlbnQpOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgwZCwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg3ZiwgcHJlc2VudCk7CisKK30KK3N0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX3A1M191bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwkvKiBMb29rcyBsaWtlIHRoZSB1bnNvbCBldmVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKKwkgKiBkZWZpbml0aW9uLiAgNGJpdCB0YWcgaXMgcGxhY2VkIGF0IDI4IGJpdCEKKwkgKi8KKwlpZiAoKHJlcyA+PiAyOCkgPT0gQUxDODgwX0hQX0VWRU5UKQorCQlhbGM4ODBfdW5pd2lsbF9wNTNfaHBfYXV0b211dGUoY29kZWMpOworCWlmICgocmVzID4+IDI4KSA9PSBBTEM4ODBfRENWT0xfRVZFTlQpIAorCQlhbGM4ODBfdW5pd2lsbF9wNTNfZGN2b2xfYXV0b211dGUoY29kZWMpOworfQorCiAvKiBGSVhNRSEgKi8KIC8qCiAgKiBGMTczNCBwaW4gY29uZmlndXJhdGlvbjoKQEAgLTIxMjUsMTU5ICsyMzYxLDExMiBAQAogLyoKICAqLwogCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgYWxjODgwX2NmZ190YmxbXSA9IHsKLQkvKiBCYWNrIDMgamFjaywgZnJvbnQgMiBqYWNrICovCi0JeyAubW9kZWxuYW1lID0gIjNzdGFjayIsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMDAsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMDEsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMDIsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMDMsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMDQsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMDUsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMDYsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMDcsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMDgsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMDksIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMGEsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMGIsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMGMsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMGQsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMGUsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMGYsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMTAsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMTEsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMTIsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMTMsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMTQsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMzQsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUzMDIsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUzMDMsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUzMDQsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUzMDYsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUzMDcsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGU0MDQsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGExMDEsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA3YiwgLnBjaV9zdWJkZXZpY2UgPSAweDMwMzEsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA3YiwgLnBjaV9zdWJkZXZpY2UgPSAweDQwMzYsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA3YiwgLnBjaV9zdWJkZXZpY2UgPSAweDQwMzcsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA3YiwgLnBjaV9zdWJkZXZpY2UgPSAweDQwMzgsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA3YiwgLnBjaV9zdWJkZXZpY2UgPSAweDQwNDAsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA3YiwgLnBjaV9zdWJkZXZpY2UgPSAweDQwNDEsIC5jb25maWcgPSBBTEM4ODBfM1NUIH0sCi0JLyogVENMIFM3MDAgKi8KLQl7IC5tb2RlbG5hbWUgPSAidGNsIiwgLmNvbmZpZyA9IEFMQzg4MF9UQ0xfUzcwMCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE5ZGIsIC5wY2lfc3ViZGV2aWNlID0gMHg0MTg4LCAuY29uZmlnID0gQUxDODgwX1RDTF9TNzAwIH0sCi0KLQkvKiBCYWNrIDMgamFjaywgZnJvbnQgMiBqYWNrIChJbnRlcm5hbCBhZGQgQXV4LUluKSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMjUsIC5wY2lfc3ViZGV2aWNlID0gMHhlMzEwLCAuY29uZmlnID0gQUxDODgwXzNTVCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNGQsIC5wY2lfc3ViZGV2aWNlID0gMHg4MWQ2LCAuY29uZmlnID0gQUxDODgwXzNTVCB9LCAKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDRkLCAucGNpX3N1YmRldmljZSA9IDB4ODFhMCwgLmNvbmZpZyA9IEFMQzg4MF8zU1QgfSwKLQotCS8qIEJhY2sgMyBqYWNrIHBsdXMgMSBTUERJRiBvdXQgamFjaywgZnJvbnQgMiBqYWNrICovCi0JeyAubW9kZWxuYW1lID0gIjNzdGFjay1kaWdvdXQiLCAuY29uZmlnID0gQUxDODgwXzNTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTMwOCwgLmNvbmZpZyA9IEFMQzg4MF8zU1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAyNSwgLnBjaV9zdWJkZXZpY2UgPSAweDAwNzAsIC5jb25maWcgPSBBTEM4ODBfM1NUX0RJRyB9LAotCi0JLyogQ2xldm8gbGFwdG9wcyAqLwotCXsgLm1vZGVsbmFtZSA9ICJjbGV2byIsIC5jb25maWcgPSBBTEM4ODBfQ0xFVk8gfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNTU4LCAucGNpX3N1YmRldmljZSA9IDB4MDUyMCwKLQkgIC5jb25maWcgPSBBTEM4ODBfQ0xFVk8gfSwgLyogQ2xldm8gbTUyMEcgTkIgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNTU4LCAucGNpX3N1YmRldmljZSA9IDB4MDY2MCwKLQkgIC5jb25maWcgPSBBTEM4ODBfQ0xFVk8gfSwgLyogQ2xldm8gbTY2NW4gKi8KLQotCS8qIEJhY2sgMyBqYWNrIHBsdXMgMSBTUERJRiBvdXQgamFjaywgZnJvbnQgMiBqYWNrIChJbnRlcm5hbCBhZGQgQXV4LUluKSovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUzMDUsIC5jb25maWcgPSBBTEM4ODBfM1NUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDgwODYsIC5wY2lfc3ViZGV2aWNlID0gMHhkNDAyLCAuY29uZmlnID0gQUxDODgwXzNTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDI1LCAucGNpX3N1YmRldmljZSA9IDB4ZTMwOSwgLmNvbmZpZyA9IEFMQzg4MF8zU1RfRElHIH0sCi0KLQkvKiBCYWNrIDUgamFjaywgZnJvbnQgMiBqYWNrICovCi0JeyAubW9kZWxuYW1lID0gIjVzdGFjayIsIC5jb25maWcgPSBBTEM4ODBfNVNUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA3YiwgLnBjaV9zdWJkZXZpY2UgPSAweDMwMzMsIC5jb25maWcgPSBBTEM4ODBfNVNUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA3YiwgLnBjaV9zdWJkZXZpY2UgPSAweDQwMzksIC5jb25maWcgPSBBTEM4ODBfNVNUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA3YiwgLnBjaV9zdWJkZXZpY2UgPSAweDMwMzIsIC5jb25maWcgPSBBTEM4ODBfNVNUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDJhMDksIC5jb25maWcgPSBBTEM4ODBfNVNUIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDgxNGUsIC5jb25maWcgPSBBTEM4ODBfNVNUIH0sCi0KLQkvKiBCYWNrIDUgamFjayBwbHVzIDEgU1BESUYgb3V0IGphY2ssIGZyb250IDIgamFjayAqLwotCXsgLm1vZGVsbmFtZSA9ICI1c3RhY2stZGlnb3V0IiwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGUyMjQsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDgwODYsIC5wY2lfc3ViZGV2aWNlID0gMHhlNDAwLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZTQwMSwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGU0MDIsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDgwODYsIC5wY2lfc3ViZGV2aWNlID0gMHhkNDAwLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZDQwMSwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODA4NiwgLnBjaV9zdWJkZXZpY2UgPSAweGExMDAsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE1NjUsIC5wY2lfc3ViZGV2aWNlID0gMHg4MjAyLCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDE5LCAucGNpX3N1YmRldmljZSA9IDB4YTg4MCwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4YTBhMCwgLnBjaV9zdWJkZXZpY2UgPSAweDA1NjAsCi0JICAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwgLyogQW9wZW4gaTkxNUdNbS1IRlMgKi8KLQkvKiB7IC5wY2lfc3VidmVuZG9yID0gMHgxMDE5LCAucGNpX3N1YmRldmljZSA9IDB4YTg4NCwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sICovIC8qIGNvbmZsaWN0IHdpdGggNnN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTY5NSwgLnBjaV9zdWJkZXZpY2UgPSAweDQwMGQsIC5jb25maWcgPSBBTEM4ODBfNVNUX0RJRyB9LAotCS8qIG5vdGUgc3VidmVuZG9yID0gMCBiZWxvdyAqLwotCS8qIHsgLnBjaV9zdWJ2ZW5kb3IgPSAweDAwMDAsIC5wY2lfc3ViZGV2aWNlID0gMHg4MDg2LCAuY29uZmlnID0gQUxDODgwXzVTVF9ESUcgfSwgKi8KLQotCXsgLm1vZGVsbmFtZSA9ICJ3ODEwIiwgLmNvbmZpZyA9IEFMQzg4MF9XODEwIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTYxZiwgLnBjaV9zdWJkZXZpY2UgPSAweDIwM2QsIC5jb25maWcgPSBBTEM4ODBfVzgxMCB9LAotCi0JeyAubW9kZWxuYW1lID0gIno3MXYiLCAuY29uZmlnID0gQUxDODgwX1o3MVYgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTk2NCwgLmNvbmZpZyA9IEFMQzg4MF9aNzFWIH0sCi0KLQl7IC5tb2RlbG5hbWUgPSAiNnN0YWNrIiwgLmNvbmZpZyA9IEFMQzg4MF82U1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4ODE5NiwgLmNvbmZpZyA9IEFMQzg4MF82U1QgfSwgLyogQVNVUyBQNUdEMS1IVk0gKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4ODFiNCwgLmNvbmZpZyA9IEFMQzg4MF82U1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDE5LCAucGNpX3N1YmRldmljZSA9IDB4YTg4NCwgLmNvbmZpZyA9IEFMQzg4MF82U1QgfSwgLyogQWNlciBBUEZWICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTQ1OCwgLnBjaV9zdWJkZXZpY2UgPSAweGExMDIsIC5jb25maWcgPSBBTEM4ODBfNlNUIH0sIC8qIEdpZ2FieXRlIEs4TjUxICovCi0KLQl7IC5tb2RlbG5hbWUgPSAiNnN0YWNrLWRpZ291dCIsIC5jb25maWcgPSBBTEM4ODBfNlNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDI2NjgsIC5wY2lfc3ViZGV2aWNlID0gMHg4MDg2LCAuY29uZmlnID0gQUxDODgwXzZTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4MjY2OCwgLmNvbmZpZyA9IEFMQzg4MF82U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTQ2MiwgLnBjaV9zdWJkZXZpY2UgPSAweDExNTAsIC5jb25maWcgPSBBTEM4ODBfNlNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweGU4MDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMDE5LCAuY29uZmlnID0gQUxDODgwXzZTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDM5LCAucGNpX3N1YmRldmljZSA9IDB4MTIzNCwgLmNvbmZpZyA9IEFMQzg4MF82U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAyNSwgLnBjaV9zdWJkZXZpY2UgPSAweDAwNzcsIC5jb25maWcgPSBBTEM4ODBfNlNUX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMjUsIC5wY2lfc3ViZGV2aWNlID0gMHgwMDc4LCAuY29uZmlnID0gQUxDODgwXzZTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDI1LCAucGNpX3N1YmRldmljZSA9IDB4MDA4NywgLmNvbmZpZyA9IEFMQzg4MF82U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTI5NywgLnBjaV9zdWJkZXZpY2UgPSAweGM3OTAsIC5jb25maWcgPSBBTEM4ODBfNlNUX0RJRyB9LCAvKiBTaHV0dGxlIFNUMjBHNSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE1MDksIC5wY2lfc3ViZGV2aWNlID0gMHg5MjVkLCAuY29uZmlnID0gQUxDODgwXzZTVF9ESUcgfSwgLyogRklDIFA0TS05MTVHRDEgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNjk1LCAucGNpX3N1YmRldmljZSA9IDB4NDAxMiwgLmNvbmZpZyA9IEFMQzg4MF81U1RfRElHIH0sIC8qIEVwb3ggRVAtNUxEQSsgR0xpICovCi0KLQl7IC5tb2RlbG5hbWUgPSAiYXN1cyIsIC5jb25maWcgPSBBTEM4ODBfQVNVUyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxOTY0LCAuY29uZmlnID0gQUxDODgwX0FTVVNfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDE5NzMsIC5jb25maWcgPSBBTEM4ODBfQVNVU19ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTliMywgLmNvbmZpZyA9IEFMQzg4MF9BU1VTX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMTEzLCAuY29uZmlnID0gQUxDODgwX0FTVVNfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDExNzMsIC5jb25maWcgPSBBTEM4ODBfQVNVU19ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTk5MywgLmNvbmZpZyA9IEFMQzg4MF9BU1VTIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDEwYzIsIC5jb25maWcgPSBBTEM4ODBfQVNVU19ESUcgfSwgLyogQXN1cyBXNkEgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTBjMywgLmNvbmZpZyA9IEFMQzg4MF9BU1VTX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMTMzLCAuY29uZmlnID0gQUxDODgwX0FTVVMgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTEyMywgLmNvbmZpZyA9IEFMQzg4MF9BU1VTX0RJRyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMTQzLCAuY29uZmlnID0gQUxDODgwX0FTVVMgfSwKLQl7IC5tb2RlbG5hbWUgPSAiYXN1cy13MXYiLCAuY29uZmlnID0gQUxDODgwX0FTVVNfVzFWIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDEwYjMsIC5jb25maWcgPSBBTEM4ODBfQVNVU19XMVYgfSwKLQl7IC5tb2RlbG5hbWUgPSAiYXN1cy1kaWciLCAuY29uZmlnID0gQUxDODgwX0FTVVNfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDgxODEsIC5jb25maWcgPSBBTEM4ODBfQVNVU19ESUcgfSwgLyogQVNVUyBQNEdQTC1YICovCi0JeyAubW9kZWxuYW1lID0gImFzdXMtZGlnMiIsIC5jb25maWcgPSBBTEM4ODBfQVNVU19ESUcyIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTU1OCwgLnBjaV9zdWJkZXZpY2UgPSAweDU0MDEsIC5jb25maWcgPSBBTEM4ODBfQVNVU19ESUcyIH0sCi0KLQl7IC5tb2RlbG5hbWUgPSAidW5pd2lsbCIsIC5jb25maWcgPSBBTEM4ODBfVU5JV0lMTF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNTg0LCAucGNpX3N1YmRldmljZSA9IDB4OTA1MCwgLmNvbmZpZyA9IEFMQzg4MF9VTklXSUxMX0RJRyB9LAkKLQotCXsgLm1vZGVsbmFtZSA9ICJGMTczNCIsIC5jb25maWcgPSBBTEM4ODBfRjE3MzQgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNzM0LCAucGNpX3N1YmRldmljZSA9IDB4MTA3YywgLmNvbmZpZyA9IEFMQzg4MF9GMTczNCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE1ODQsIC5wY2lfc3ViZGV2aWNlID0gMHg5MDU0LCAuY29uZmlnID0gQUxDODgwX0YxNzM0IH0sCi0KLQl7IC5tb2RlbG5hbWUgPSAibGciLCAuY29uZmlnID0gQUxDODgwX0xHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTg1NCwgLnBjaV9zdWJkZXZpY2UgPSAweDAwM2IsIC5jb25maWcgPSBBTEM4ODBfTEcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxODU0LCAucGNpX3N1YmRldmljZSA9IDB4MDA2OCwgLmNvbmZpZyA9IEFMQzg4MF9MRyB9LAotCi0JeyAubW9kZWxuYW1lID0gImxnLWx3IiwgLmNvbmZpZyA9IEFMQzg4MF9MR19MVyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE4NTQsIC5wY2lfc3ViZGV2aWNlID0gMHgwMDE4LCAuY29uZmlnID0gQUxDODgwX0xHX0xXIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTg1NCwgLnBjaV9zdWJkZXZpY2UgPSAweDAwNzcsIC5jb25maWcgPSBBTEM4ODBfTEdfTFcgfSwKLQorc3RhdGljIGNvbnN0IGNoYXIgKmFsYzg4MF9tb2RlbHNbQUxDODgwX01PREVMX0xBU1RdID0geworCVtBTEM4ODBfM1NUXQkJPSAiM3N0YWNrIiwKKwlbQUxDODgwX1RDTF9TNzAwXQk9ICJ0Y2wiLAorCVtBTEM4ODBfM1NUX0RJR10JPSAiM3N0YWNrLWRpZ291dCIsCisJW0FMQzg4MF9DTEVWT10JCT0gImNsZXZvIiwKKwlbQUxDODgwXzVTVF0JCT0gIjVzdGFjayIsCisJW0FMQzg4MF81U1RfRElHXQk9ICI1c3RhY2stZGlnb3V0IiwKKwlbQUxDODgwX1c4MTBdCQk9ICJ3ODEwIiwKKwlbQUxDODgwX1o3MVZdCQk9ICJ6NzF2IiwKKwlbQUxDODgwXzZTVF0JCT0gIjZzdGFjayIsCisJW0FMQzg4MF82U1RfRElHXQk9ICI2c3RhY2stZGlnb3V0IiwKKwlbQUxDODgwX0FTVVNdCQk9ICJhc3VzIiwKKwlbQUxDODgwX0FTVVNfVzFWXQk9ICJhc3VzLXcxdiIsCisJW0FMQzg4MF9BU1VTX0RJR10JPSAiYXN1cy1kaWciLAorCVtBTEM4ODBfQVNVU19ESUcyXQk9ICJhc3VzLWRpZzIiLAorCVtBTEM4ODBfVU5JV0lMTF9ESUddCT0gInVuaXdpbGwiLAorCVtBTEM4ODBfVU5JV0lMTF9QNTNdCT0gInVuaXdpbGwtcDUzIiwKKwlbQUxDODgwX0ZVSklUU1VdCT0gImZ1aml0c3UiLAorCVtBTEM4ODBfRjE3MzRdCQk9ICJGMTczNCIsCisJW0FMQzg4MF9MR10JCT0gImxnIiwKKwlbQUxDODgwX0xHX0xXXQkJPSAibGctbHciLAogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLQl7IC5tb2RlbG5hbWUgPSAidGVzdCIsIC5jb25maWcgPSBBTEM4ODBfVEVTVCB9LAorCVtBTEM4ODBfVEVTVF0JCT0gInRlc3QiLAogI2VuZGlmCi0JeyAubW9kZWxuYW1lID0gImF1dG8iLCAuY29uZmlnID0gQUxDODgwX0FVVE8gfSwKKwlbQUxDODgwX0FVVE9dCQk9ICJhdXRvIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4ODBfY2ZnX3RibFtdID0geworCS8qIEJyb2tlbiBCSU9TIGNvbmZpZ3VyYXRpb24gKi8KKwlTTkRfUENJX1FVSVJLKDB4MjY2OCwgMHg4MDg2LCBOVUxMLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4MjY2OCwgTlVMTCwgQUxDODgwXzZTVF9ESUcpLAorCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4YTg4MCwgIkVDUyIsIEFMQzg4MF81U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHhhODg0LCAiQWNlciBBUEZWIiwgQUxDODgwXzZTVCksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MGY2OSwgIkNvZXVzIEc2MTBQIiwgQUxDODgwX1c4MTApLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwNzAsICJVTEkiLCBBTEM4ODBfM1NUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA3NywgIlVMSSIsIEFMQzg4MF82U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMDc4LCAiVUxJIiwgQUxDODgwXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwODcsICJVTEkiLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4ZTMwOSwgIlVMSSIsIEFMQzg4MF8zU1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHhlMzEwLCAiVUxJIiwgQUxDODgwXzNTVCksCisKKwlTTkRfUENJX1FVSVJLKDB4MTAzOSwgMHgxMjM0LCBOVUxMLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmEwOSwgIkhQIiwgQUxDODgwXzVTVCksCisKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMGIzLCAiQVNVUyBXMVYiLCBBTEM4ODBfQVNVU19XMVYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwYzIsICJBU1VTIFc2QSIsIEFMQzg4MF9BU1VTX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTBjMywgIkFTVVMgV3h4IiwgQUxDODgwX0FTVVNfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTEzLCAiQVNVUyIsIEFMQzg4MF9BU1VTX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTEyMywgIkFTVVMiLCBBTEM4ODBfQVNVU19ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExNzMsICJBU1VTIiwgQUxDODgwX0FTVVNfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTY0LCAiQVNVUyBaNzFWIiwgQUxDODgwX1o3MVYpLAorCS8qIFNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5NjQsICJBU1VTIiwgQUxDODgwX0FTVVNfRElHKSwgKi8KKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTczLCAiQVNVUyIsIEFMQzg4MF9BU1VTX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTliMywgIkFTVVMiLCBBTEM4ODBfQVNVU19ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxNGUsICJBU1VTIiwgQUxDODgwX0FTVVMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxODEsICJBU1VTIFA0R1BMIiwgQUxDODgwX0FTVVNfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MTk2LCAiQVNVUyBQNUdEMSIsIEFMQzg4MF82U1QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxYjQsICJBU1VTIiwgQUxDODgwXzZTVCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDAsICJBU1VTIiwgQUxDODgwX0FTVVMpLAorCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODFkNiwgIlNvbnkiLCBBTEM4ODBfM1NUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWEwLCAiU29ueSIsIEFMQzg4MF8zU1QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDMwMzMsICJHYXRld2F5IiwgQUxDODgwXzVTVCksCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4NDAzOSwgIkdhdGV3YXkiLCBBTEM4ODBfNVNUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3YiwgMHgzMDMyLCAiR2F0ZXdheSIsIEFMQzg4MF81U1QpLAorCVNORF9QQ0lfUVVJUksoMHgxNTU4LCAweDA1MjAsICJDbGV2byBtNTIwRyIsIEFMQzg4MF9DTEVWTyksCisJU05EX1BDSV9RVUlSSygweDE1NTgsIDB4MDY2MCwgIkNsZXZvIG02NTVuIiwgQUxDODgwX0NMRVZPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU2NSwgMHg4MjAyLCAiQmlvc3RhciIsIEFMQzg4MF81U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTYxZiwgMHgyMDNkLCAiVzgxMCIsIEFMQzg4MF9XODEwKSwKKwlTTkRfUENJX1FVSVJLKDB4MTY5NSwgMHg0MDBkLCAiRVBvWCIsIEFMQzg4MF81U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTlkYiwgMHg0MTg4LCAiVENMIFM3MDAiLCBBTEM4ODBfVENMX1M3MDApLAorCVNORF9QQ0lfUVVJUksoMHhhMGEwLCAweDA1NjAsICJBT3BlbiBpOTE1R01tLUhGUyIsIEFMQzg4MF81U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4ZTgwMywgMHgxMDE5LCBOVUxMLCBBTEM4ODBfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEyOTcsIDB4Yzc5MCwgIlNodXR0bGUgU1QyMEc1IiwgQUxDODgwXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDU4LCAweGExMDIsICJHaWdhYnl0ZSBLOCIsIEFMQzg4MF82U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgxMTUwLCAiTVNJIiwgQUxDODgwXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNTA5LCAweDkyNWQsICJGSUMgUDRNIiwgQUxDODgwXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNTU4LCAweDU0MDEsICJBU1VTIiwgQUxDODgwX0FTVVNfRElHMiksCisKKwlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHg5MDUwLCAiVW5pd2lsbCIsIEFMQzg4MF9VTklXSUxMX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE1ODQsIDB4OTA3MCwgIlVuaXdpbGwiLCBBTEM4ODBfVU5JV0lMTCksCisJU05EX1BDSV9RVUlSSygweDE1ODQsIDB4OTA3NywgIlVuaXdpbGwgUDUzIiwgQUxDODgwX1VOSVdJTExfUDUzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHg5MDU0LCAiVW5pd2xsbCIsIEFMQzg4MF9GMTczNCksCisKKwlTTkRfUENJX1FVSVJLKDB4MTY5NSwgMHg0MDEyLCAiRVBveCBFUC01TERBIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDEwYWMsICJGU0MiLCBBTEM4ODBfVU5JV0lMTCksCisJU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTA3YywgIkZTQyBGMTczNCIsIEFMQzg4MF9GMTczNCksCisJU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTBiMCwgIkZ1aml0c3UiLCBBTEM4ODBfRlVKSVRTVSksCisKKwlTTkRfUENJX1FVSVJLKDB4MTg1NCwgMHgwMDNiLCAiTEciLCBBTEM4ODBfTEcpLAorCVNORF9QQ0lfUVVJUksoMHgxODU0LCAweDAwNjgsICJMRyB3MSIsIEFMQzg4MF9MRyksCisJU05EX1BDSV9RVUlSSygweDE4NTQsIDB4MDAxOCwgIkxHIExXMjAiLCBBTEM4ODBfTEdfTFcpLAorCVNORF9QQ0lfUVVJUksoMHgxODU0LCAweDAwNzcsICJMRyBMVzI1IiwgQUxDODgwX0xHX0xXKSwKKworCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGUzMDgsICJJbnRlbCBtb2JvIiwgQUxDODgwXzNTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGUzMDUsICJJbnRlbCBtb2JvIiwgQUxDODgwXzNTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGQ0MDIsICJJbnRlbCBtb2JvIiwgQUxDODgwXzNTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGQ0MDAsICJJbnRlbCBtb2JvIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGQ0MDEsICJJbnRlbCBtb2JvIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGUyMjQsICJJbnRlbCBtb2JvIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGU0MDAsICJJbnRlbCBtb2JvIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGU0MDEsICJJbnRlbCBtb2JvIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGU0MDIsICJJbnRlbCBtb2JvIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGExMDAsICJJbnRlbCBtb2JvIiwgQUxDODgwXzVTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAwLCAiSW50ZWwgbW9ibyIsIEFMQzg4MF8zU1QpLAogCiAJe30KIH07CkBAIC0yNDM4LDcgKzI2MjcsOCBAQAogCX0sCiAJW0FMQzg4MF9VTklXSUxMX0RJR10gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzg4MF9hc3VzX21peGVyLCBhbGM4ODBfcGNiZWVwX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsIGFsYzg4MF9waW5fYXN1c19pbml0X3ZlcmJzIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl9hc3VzX2luaXRfdmVyYnMgfSwKIAkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4MF9hc3VzX2RhY19uaWRzLAogCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKQEAgLTI0NDcsNiArMjYzNyw0NiBAQAogCQkubmVlZF9kYWNfZml4ID0gMSwKIAkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCiAJfSwKKwlbQUxDODgwX1VOSVdJTExdID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfdW5pd2lsbF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF91bml3aWxsX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF9hc3VzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF90aHJlZXN0YWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF90aHJlZXN0YWNrX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4MF91bml3aWxsX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjODgwX3VuaXdpbGxfYXV0b211dGUsCisJfSwKKwlbQUxDODgwX1VOSVdJTExfUDUzXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgwX3VuaXdpbGxfcDUzX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3VuaXdpbGxfcDUzX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF9hc3VzX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3c4MTBfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwX3RocmVlc3RhY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM4ODBfdW5pd2lsbF9wNTNfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM4ODBfdW5pd2lsbF9wNTNfaHBfYXV0b211dGUsCisJfSwKKwlbQUxDODgwX0ZVSklUU1VdID0geworCQkubWl4ZXJzID0geyBhbGM4ODBfZnVqaXRzdV9taXhlciwgCisJCQkgICAgYWxjODgwX3BjYmVlcF9taXhlciwgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfdW5pd2lsbF9wNTNfaW5pdF92ZXJicywKKwkgICAgICAgCQkJYWxjODgwX2JlZXBfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4MF9kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF8yX2phY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgwXzJfamFja19tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4MF91bml3aWxsX3A1M191bnNvbF9ldmVudCwKKwkJLmluaXRfaG9vayA9IGFsYzg4MF91bml3aWxsX3A1M19ocF9hdXRvbXV0ZSwKKwl9LAogCVtBTEM4ODBfQ0xFVk9dID0gewogCQkubWl4ZXJzID0geyBhbGM4ODBfdGhyZWVfc3RhY2tfbWl4ZXIgfSwKIAkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKQEAgLTI4NDEsOCArMzA3MSwxMCBAQAogCiAJY29kZWMtPnNwZWMgPSBzcGVjOwogCi0JYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIGFsYzg4MF9jZmdfdGJsKTsKLQlpZiAoYm9hcmRfY29uZmlnIDwgMCB8fCBib2FyZF9jb25maWcgPj0gQUxDODgwX01PREVMX0xBU1QpIHsKKwlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODgwX01PREVMX0xBU1QsCisJCQkJCQkgIGFsYzg4MF9tb2RlbHMsCisJCQkJCQkgIGFsYzg4MF9jZmdfdGJsKTsKKwlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewogCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIEFMQzg4MCwgIgogCQkgICAgICAgInRyeWluZyBhdXRvLXByb2JlIGZyb20gQklPUy4uLlxuIik7CiAJCWJvYXJkX2NvbmZpZyA9IEFMQzg4MF9BVVRPOwpAQCAtMzA5MCwxMSArMzMyMiwyMCBAQAogICogYW5kIHRoZSBvdXRwdXQgamFjay4gIElmIHRoaXMgdHVybnMgb3V0IHRvIGJlIHRoZSBjYXNlIGZvciBhbGwgc3VjaAogICogbW9kZWxzIHRoZSAiTGluZSBKYWNrIE1vZGUiIG1vZGUgY291bGQgYmUgY2hhbmdlZCBmcm9tIEFMQ19QSU5fRElSX0lOT1VUCiAgKiB0byBBTENfUElOX0RJUl9JTk9VVF9OT01JQ0JJQVMuCisgKgorICogVGhlIEMyMHggVGFibGV0IHNlcmllcyBoYXZlIGEgbW9ubyBpbnRlcm5hbCBzcGVha2VyIHdoaWNoIGlzIGNvbnRyb2xsZWQKKyAqIHZpYSB0aGUgY2hpcCdzIE1vbm8gc3VtIHdpZGdldCBhbmQgcGluIGNvbXBsZXgsIHNvIGluY2x1ZGUgdGhlIG5lY2Vzc2FyeQorICogY29udHJvbHMgZm9yIHN1Y2ggbW9kZWxzLiAgT24gbW9kZWxzIHdpdGhvdXQgYSAibW9ubyBzcGVha2VyIiB0aGUgY29udHJvbAorICogd29uJ3QgZG8gYW55dGhpbmcuCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfYWNlcl9taXhlcltdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9CSU5EX01VVEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAweDA4LCAyLCBIREFfSU5QVVQpLAogCUFMQ19QSU5fTU9ERSgiSGVhZHBob25lIEphY2sgTW9kZSIsIDB4MGYsIEFMQ19QSU5fRElSX0lOT1VUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIk1vbm8gU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBhLCAxLCAweDAsCisJCQkgICAgICBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIk1vbm8gU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBhLCAxLCAyLAorCQkJICAgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDA0LCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDA0LCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCkBAIC0zNDA5LDExICszNjUwLDExIEBACiAJezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCiAJLyogTGluZSBJbiBqYWNrIGlzIGNvbm5lY3RlZCB0byBMaW5lMSBwaW4gKi8KIAl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCS8qIFNvbWUgQWNlcnMgKGVnOiBDMjB4IFRhYmxldHMpIHVzZSBNb25vIHBpbiBmb3IgaW50ZXJuYWwgc3BlYWtlciAqLworCXsweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCiAJLyogRW5zdXJlIGFsbCBvdGhlciB1bnVzZWQgcGlucyBhcmUgZGlzYWJsZWQgYW5kIG11dGVkLiAqLwogCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LAogCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMH0sCi0JezB4MTEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKIAl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAwfSwKIAl7MHgxMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAogCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB9LApAQCAtMzQ0MSw2ICszNjgyLDggQEAKIAogCS8qIFVubXV0ZSBMaW5lLW91dCBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZXF1aXYgbWl4ZXIgY3RybCkgKi8KIAl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCS8qIFVubXV0ZSBtb25vIHBpbiB3aWRnZXQgYW1wIG91dHB1dCAobm8gZXF1aXYgbWl4ZXIgY3RybCkgKi8KKwl7MHgxMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAogCS8qIFVubXV0ZSBNaWMxIGFuZCBMaW5lMSBwaW4gd2lkZ2V0IGlucHV0IGJ1ZmZlcnMgc2luY2UgdGhleSBzdGFydCBhcwogCSAqIGlucHV0cy4gSWYgdGhlIHBpbiBtb2RlIGlzIGNoYW5nZWQgYnkgdGhlIHVzZXIgdGhlIHBpbiBtb2RlIGNvbnRyb2wKIAkgKiB3aWxsIHRha2UgY2FyZSBvZiBlbmFibGluZyB0aGUgcGluJ3MgaW5wdXQvb3V0cHV0IGJ1ZmZlcnMgYXMgbmVlZGVkLgpAQCAtMzkyOCwzMyArNDE3MSwzMyBAQAogLyoKICAqIEFMQzI2MCBjb25maWd1cmF0aW9ucwogICovCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgYWxjMjYwX2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAiYmFzaWMiLCAuY29uZmlnID0gQUxDMjYwX0JBU0lDIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0ZCwgLnBjaV9zdWJkZXZpY2UgPSAweDgxYmIsCi0JICAuY29uZmlnID0gQUxDMjYwX0JBU0lDIH0sIC8qIFNvbnkgVkFJTyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNGQsIC5wY2lfc3ViZGV2aWNlID0gMHg4MWNjLAotCSAgLmNvbmZpZyA9IEFMQzI2MF9CQVNJQyB9LCAvKiBTb255IFZBSU8gVkdOLVMzSFAgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDRkLCAucGNpX3N1YmRldmljZSA9IDB4ODFjZCwKLQkgIC5jb25maWcgPSBBTEMyNjBfQkFTSUMgfSwgLyogU29ueSBWQUlPICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTUyZCwgLnBjaV9zdWJkZXZpY2UgPSAweDA3MjksCi0JICAuY29uZmlnID0gQUxDMjYwX0JBU0lDIH0sIC8qIENUTCBUcmF2ZWwgTWFzdGVyIFU1NTNXICovCi0JeyAubW9kZWxuYW1lID0gImhwIiwgLmNvbmZpZyA9IEFMQzI2MF9IUCB9LAotCXsgLm1vZGVsbmFtZSA9ICJocC0zMDEzIiwgLmNvbmZpZyA9IEFMQzI2MF9IUF8zMDEzIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTAsIC5jb25maWcgPSBBTEMyNjBfSFBfMzAxMyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgzMDExLCAuY29uZmlnID0gQUxDMjYwX0hQIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTIsIC5jb25maWcgPSBBTEMyNjBfSFBfMzAxMyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgzMDEzLCAuY29uZmlnID0gQUxDMjYwX0hQXzMwMTMgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MzAxNCwgLmNvbmZpZyA9IEFMQzI2MF9IUCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgzMDE1LCAuY29uZmlnID0gQUxDMjYwX0hQIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTYsIC5jb25maWcgPSBBTEMyNjBfSFAgfSwKLQl7IC5tb2RlbG5hbWUgPSAiZnVqaXRzdSIsIC5jb25maWcgPSBBTEMyNjBfRlVKSVRTVV9TNzAyWCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwY2YsIC5wY2lfc3ViZGV2aWNlID0gMHgxMzI2LCAuY29uZmlnID0gQUxDMjYwX0ZVSklUU1VfUzcwMlggfSwKLQl7IC5tb2RlbG5hbWUgPSAiYWNlciIsIC5jb25maWcgPSBBTEMyNjBfQUNFUiB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMjUsIC5wY2lfc3ViZGV2aWNlID0gMHgwMDhmLCAuY29uZmlnID0gQUxDMjYwX0FDRVIgfSwKK3N0YXRpYyBjb25zdCBjaGFyICphbGMyNjBfbW9kZWxzW0FMQzI2MF9NT0RFTF9MQVNUXSA9IHsKKwlbQUxDMjYwX0JBU0lDXQkJPSAiYmFzaWMiLAorCVtBTEMyNjBfSFBdCQk9ICJocCIsCisJW0FMQzI2MF9IUF8zMDEzXQk9ICJocC0zMDEzIiwKKwlbQUxDMjYwX0ZVSklUU1VfUzcwMlhdCT0gImZ1aml0c3UiLAorCVtBTEMyNjBfQUNFUl0JCT0gImFjZXIiLAogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLQl7IC5tb2RlbG5hbWUgPSAidGVzdCIsIC5jb25maWcgPSBBTEMyNjBfVEVTVCB9LAorCVtBTEMyNjBfVEVTVF0JCT0gInRlc3QiLAogI2VuZGlmCi0JeyAubW9kZWxuYW1lID0gImF1dG8iLCAuY29uZmlnID0gQUxDMjYwX0FVVE8gfSwKKwlbQUxDMjYwX0FVVE9dCQk9ICJhdXRvIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjBfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwN2IsICJBY2VyIEMyMHgiLCBBTEMyNjBfQUNFUiksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA4ZiwgIkFjZXIiLCBBTEMyNjBfQUNFUiksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMCwgIkhQIiwgQUxDMjYwX0hQXzMwMTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTEsICJIUCIsIEFMQzI2MF9IUCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMiwgIkhQIiwgQUxDMjYwX0hQXzMwMTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTMsICJIUCIsIEFMQzI2MF9IUF8zMDEzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDE0LCAiSFAiLCBBTEMyNjBfSFApLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTUsICJIUCIsIEFMQzI2MF9IUCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNiwgIkhQIiwgQUxDMjYwX0hQKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWJiLCAiU29ueSBWQUlPIiwgQUxDMjYwX0JBU0lDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWNjLCAiU29ueSBWQUlPIiwgQUxDMjYwX0JBU0lDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWNkLCAiU29ueSBWQUlPIiwgQUxDMjYwX0JBU0lDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBjZiwgMHgxMzI2LCAiRnVqaXRzdSBTNzAyWCIsIEFMQzI2MF9GVUpJVFNVX1M3MDJYKSwKKwlTTkRfUENJX1FVSVJLKDB4MTUyZCwgMHgwNzI5LCAiQ1RMIFU1NTNXIiwgQUxDMjYwX0JBU0lDKSwKIAl7fQogfTsKIApAQCAtNDA1Myw4ICs0Mjk2LDEwIEBACiAKIAljb2RlYy0+c3BlYyA9IHNwZWM7CiAKLQlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgYWxjMjYwX2NmZ190YmwpOwotCWlmIChib2FyZF9jb25maWcgPCAwIHx8IGJvYXJkX2NvbmZpZyA+PSBBTEMyNjBfTU9ERUxfTEFTVCkgeworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBTEMyNjBfTU9ERUxfTEFTVCwKKwkJCQkJCSAgYWxjMjYwX21vZGVscywKKwkJCQkJCSAgYWxjMjYwX2NmZ190YmwpOworCWlmIChib2FyZF9jb25maWcgPCAwKSB7CiAJCXNuZF9wcmludGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIEFMQzI2MCwgIgogCQkJICAgInRyeWluZyBhdXRvLXByb2JlIGZyb20gQklPUy4uLlxuIik7CiAJCWJvYXJkX2NvbmZpZyA9IEFMQzI2MF9BVVRPOwpAQCAtNDIwNyw4ICs0NDUyLDEwIEBACiAJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKQEAgLTQzMTMsNiArNDU2MCwxMDAgQEAKIAl7IH0gCiB9OwogCisvKiBNYWMgUHJvIHRlc3QgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODJfbWFjcHJvX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxOCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg4Ml9tYWNwcm9faW5pdF92ZXJic1tdID0geworCS8qIEZyb250IG1peGVyOiB1bm11dGUgaW5wdXQvb3V0cHV0IGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJLyogRnJvbnQgUGluOiBvdXRwdXQgMCAoMHgwYykgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogRnJvbnQgTWljIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBTcGVha2VyOiAgb3V0cHV0ICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDR9LAorCS8qIEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKworCS8qIEZJWE1FOiB1c2UgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLworCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxYywgMWQsIDE0LCAxNSwgMTYsIDE3LCAwYiAqLworCS8qIElucHV0IG1peGVyMTogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAorCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKKwkvKiBJbnB1dCBtaXhlcjIgKi8KKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCisJLyogSW5wdXQgbWl4ZXIzICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAorCS8qIEFEQzE6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCS8qIEFEQzI6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCS8qIEFEQzM6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJeyB9Cit9Oworc3RhdGljIHZvaWQgYWxjODgyX2dwaW9fbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IHBpbiwgaW50IG11dGVkKQoreworCXVuc2lnbmVkIGludCBncGlvc3RhdGUsIGdwaW9tYXNrLCBncGlvZGlyOworCisJZ3Bpb3N0YXRlID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJCSAgICAgICBBQ19WRVJCX0dFVF9HUElPX0RBVEEsIDApOworCisJaWYgKCFtdXRlZCkKKwkJZ3Bpb3N0YXRlIHw9ICgxIDw8IHBpbik7CisJZWxzZQorCQlncGlvc3RhdGUgJj0gfigxIDw8IHBpbik7CisKKwlncGlvbWFzayA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJCQkgICAgICBBQ19WRVJCX0dFVF9HUElPX01BU0ssIDApOworCWdwaW9tYXNrIHw9ICgxIDw8IHBpbik7CisKKwlncGlvZGlyID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfR1BJT19ESVJFQ1RJT04sIDApOworCWdwaW9kaXIgfD0gKDEgPDwgcGluKTsKKworCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9HUElPX01BU0ssIGdwaW9tYXNrKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCBncGlvZGlyKTsKKworCW1zbGVlcCgxKTsKKworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCBncGlvc3RhdGUpOworfQorCiAvKgogICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwogICovCkBAIC00NDM1LDE5ICs0Nzc2LDIwIEBACiAvKgogICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBhbGM4ODJfY2ZnX3RibFtdID0gewotCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2stZGlnIiwgLmNvbmZpZyA9IEFMQzg4Ml8zU1RfRElHIH0sCi0JeyAubW9kZWxuYW1lID0gIjZzdGFjay1kaWciLCAuY29uZmlnID0gQUxDODgyXzZTVF9ESUcgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxNDYyLCAucGNpX3N1YmRldmljZSA9IDB4NjY2OCwKLQkgIC5jb25maWcgPSBBTEM4ODJfNlNUX0RJRyB9LCAvKiBNU0kgICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA1YiwgLnBjaV9zdWJkZXZpY2UgPSAweDY2NjgsCi0JICAuY29uZmlnID0gQUxDODgyXzZTVF9ESUcgfSwgLyogRm94Y29ubiAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMTksIC5wY2lfc3ViZGV2aWNlID0gMHg2NjY4LAotCSAgLmNvbmZpZyA9IEFMQzg4Ml82U1RfRElHIH0sIC8qIEVDUyB0byBJbnRlbCovCi0JeyAubW9kZWxuYW1lID0gImFyaW1hIiwgLmNvbmZpZyA9IEFMQzg4Ml9BUklNQSB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE2MWYsIC5wY2lfc3ViZGV2aWNlID0gMHgyMDU0LAotCSAgLmNvbmZpZyA9IEFMQzg4Ml9BUklNQSB9LCAvKiBBcmltYSBXODIwRGkxICovCi0JeyAubW9kZWxuYW1lID0gImF1dG8iLCAuY29uZmlnID0gQUxDODgyX0FVVE8gfSwKK3N0YXRpYyBjb25zdCBjaGFyICphbGM4ODJfbW9kZWxzW0FMQzg4Ml9NT0RFTF9MQVNUXSA9IHsKKwlbQUxDODgyXzNTVF9ESUddCT0gIjNzdGFjay1kaWciLAorCVtBTEM4ODJfNlNUX0RJR10JPSAiNnN0YWNrLWRpZyIsCisJW0FMQzg4Ml9BUklNQV0JCT0gImFyaW1hIiwKKwlbQUxDODg1X01BQ1BST10JCT0gIm1hY3BybyIsCisJW0FMQzg4Ml9BVVRPXQkJPSAiYXV0byIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODgyX2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHg2NjY4LCAiRUNTIiwgQUxDODgyXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDY2NjgsICJGb3hjb25uIiwgQUxDODgyXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDY2NjgsICJNU0kiLCBBTEM4ODJfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE2MWYsIDB4MjA1NCwgIkFyaW1hIFc4MjAiLCBBTEM4ODJfQVJJTUEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxZDgsICJBc3VzIFA1V0QiLCBBTEM4ODJfNlNUX0RJRyksCiAJe30KIH07CiAKQEAgLTQ0ODQsNiArNDgyNiwxNyBAQAogCQkuY2hhbm5lbF9tb2RlID0gYWxjODgyX3NpeHN0YWNrX21vZGVzLAogCQkuaW5wdXRfbXV4ID0gJmFsYzg4Ml9jYXB0dXJlX3NvdXJjZSwKIAl9LAorCVtBTEM4ODVfTUFDUFJPXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgyX21hY3Byb19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgyX21hY3Byb19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODJfRElHT1VUX05JRCwKKwkJLmRpZ19pbl9uaWQgPSBBTEM4ODJfRElHSU5fTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgyX2NoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4Ml9jaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODJfY2FwdHVyZV9zb3VyY2UsCisJfSwKIH07CiAKIApAQCAtNDU4NCw3ICs0OTM3LDkgQEAKIAogCWNvZGVjLT5zcGVjID0gc3BlYzsKIAotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBhbGM4ODJfY2ZnX3RibCk7CisJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzg4Ml9NT0RFTF9MQVNULAorCQkJCQkJICBhbGM4ODJfbW9kZWxzLAorCQkJCQkJICBhbGM4ODJfY2ZnX3RibCk7CiAKIAlpZiAoYm9hcmRfY29uZmlnIDwgMCB8fCBib2FyZF9jb25maWcgPj0gQUxDODgyX01PREVMX0xBU1QpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBBTEM4ODIsICIKQEAgLTQ2MDksNiArNDk2NCwxMSBAQAogCWlmIChib2FyZF9jb25maWcgIT0gQUxDODgyX0FVVE8pCiAJCXNldHVwX3ByZXNldChzcGVjLCAmYWxjODgyX3ByZXNldHNbYm9hcmRfY29uZmlnXSk7CiAKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQzg4NV9NQUNQUk8pIHsKKwkJYWxjODgyX2dwaW9fbXV0ZShjb2RlYywgMCwgMCk7CisJCWFsYzg4Ml9ncGlvX211dGUoY29kZWMsIDEsIDApOworCX0KKwogCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJBTEM4ODIgQW5hbG9nIjsKIAlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJmFsYzg4Ml9wY21fYW5hbG9nX3BsYXliYWNrOwogCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZhbGM4ODJfcGNtX2FuYWxvZ19jYXB0dXJlOwpAQCAtNDc2Nyw2ICs1MTI3LDEzIEBACiAJeyA4LCBhbGM4ODNfc2l4c3RhY2tfY2g4X2luaXQgfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX21lZGlvbl9lYXBkX3ZlcmJzW10gPSB7CisgICAgICAgIC8qIGVhbmFibGUgRUFQRCBvbiBtZWRpb24gbGFwdG9wICovCisJezB4MjAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDB4MDd9LAorCXsweDIwLCBBQ19WRVJCX1NFVF9QUk9DX0NPRUYsIDB4MzA3MH0sCisJeyB9Cit9OworCiAvKiBQaW4gYXNzaWdubWVudDogRnJvbnQ9MHgxNCwgUmVhcj0weDE1LCBDTEZFPTB4MTYsIFNpZGU9MHgxNwogICogICAgICAgICAgICAgICAgIE1pYz0weDE4LCBGcm9udCBNaWM9MHgxOSwgTGluZS1Jbj0weDFhLCBIUD0weDFiCiAgKi8KQEAgLTQ3ODgsOCArNTE1NSwxMCBAQAogCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCkBAIC00ODE4LDggKzUxODcsMTAgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIlBDIFNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLApAQCAtNDg1NCw4ICs1MjI1LDEwIEBACiAJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKQEAgLTQ4NzUsNiArNTI0OCwxMDEgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX2ZpdmVzdGFja19taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gYWxjODgzX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGM4ODNfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjODgzX211eF9lbnVtX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfdGFncmFfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAxLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLworCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuY291bnQgPSAyLAorCQkuaW5mbyA9IGFsYzg4M19tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjODgzX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsYzg4M19tdXhfZW51bV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OwkKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M190YWdyYV8yY2hfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAxLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLworCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuY291bnQgPSAyLAorCQkuaW5mbyA9IGFsYzg4M19tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjODgzX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsYzg4M19tdXhfZW51bV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OwkKKwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M19jaG1vZGVfbWl4ZXJbXSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLApAQCAtNDk2Myw2ICs1NDMxLDQ1IEBACiAJeyB9CiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg4M190YWdyYV92ZXJic1tdID0geworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCQorCXsweDE4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sIC8qIG1pYy9jbGZlICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgLyogbGluZS9zdXJyb3VuZCAqLworCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCisKKwl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwM30sIAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwM30sIAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDN9LCAKKworCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzg4M190YWdyYV9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKyAJdW5zaWduZWQgaW50IHByZXNlbnQ7CisKKyAJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNCwgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxYiwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MWIsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMSwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCBwcmVzZW50ID8gMSA6IDMpOworfQorCitzdGF0aWMgdm9pZCBhbGM4ODNfdGFncmFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCit7CisJaWYgKChyZXMgPj4gMjYpID09IEFMQzg4MF9IUF9FVkVOVCkKKwkJYWxjODgzX3RhZ3JhX2F1dG9tdXRlKGNvZGVjKTsKK30KKwogLyoKICAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKICAqLwpAQCAtNTA1NywzMiArNTU2NCw0MiBAQAogLyoKICAqIGNvbmZpZ3VyYXRpb24gYW5kIHByZXNldAogICovCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgYWxjODgzX2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrLWRpZyIsIC5jb25maWcgPSBBTEM4ODNfM1NUXzJjaF9ESUcgfSwKLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrLTZjaC1kaWciLCAuY29uZmlnID0gQUxDODgzXzNTVF82Y2hfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAxOSwgLnBjaV9zdWJkZXZpY2UgPSAweDY2NjgsCi0JICAuY29uZmlnID0gQUxDODgzXzNTVF82Y2hfRElHIH0sIC8qIEVDUyB0byBJbnRlbCovCi0JeyAubW9kZWxuYW1lID0gIjNzdGFjay02Y2giLCAuY29uZmlnID0gQUxDODgzXzNTVF82Y2ggfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDhlLCAucGNpX3N1YmRldmljZSA9IDB4NTM0ZCwKLQkgIC5jb25maWcgPSBBTEM4ODNfM1NUXzZjaCB9LAotICAgICAgICB7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZDYwMSwKLSAgICAgICAgICAuY29uZmlnID0gQUxDODgzXzNTVF82Y2ggfSwgLyogRDEwMkdHQyAqLwotCXsgLm1vZGVsbmFtZSA9ICI2c3RhY2stZGlnIiwgLmNvbmZpZyA9IEFMQzg4M182U1RfRElHIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTQ2MiwgLnBjaV9zdWJkZXZpY2UgPSAweDY2NjgsCi0JICAuY29uZmlnID0gQUxDODgzXzZTVF9ESUcgfSwgLyogTVNJICAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE0NjIsIC5wY2lfc3ViZGV2aWNlID0gMHg3MjgwLAotCSAgLmNvbmZpZyA9IEFMQzg4M182U1RfRElHIH0sIC8qIE1TSSBLOUEgUGxhdGludW0gKE1TLTcyODApICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA1YiwgLnBjaV9zdWJkZXZpY2UgPSAweDY2NjgsCi0JICAuY29uZmlnID0gQUxDODgzXzZTVF9ESUcgfSwgLyogRm94Y29ubiAqLwotCXsgLm1vZGVsbmFtZSA9ICI2c3RhY2stZGlnLWRlbW8iLCAuY29uZmlnID0gQUxDODg4X0RFTU9fQk9BUkQgfSwKLQl7IC5tb2RlbG5hbWUgPSAiYWNlciIsIC5jb25maWcgPSBBTEM4ODNfQUNFUiB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMjUsIC5wY2lfc3ViZGV2aWNlID0gMC8qMHgwMTAyKi8sCi0JICAuY29uZmlnID0gQUxDODgzX0FDRVIgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDI1LCAucGNpX3N1YmRldmljZSA9IDB4MDEwMiwKLQkgIC5jb25maWcgPSBBTEM4ODNfQUNFUiB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwMjUsIC5wY2lfc3ViZGV2aWNlID0gMHgwMDlmLAotCSAgLmNvbmZpZyA9IEFMQzg4M19BQ0VSIH0sCi0JeyAubW9kZWxuYW1lID0gImF1dG8iLCAuY29uZmlnID0gQUxDODgzX0FVVE8gfSwKK3N0YXRpYyBjb25zdCBjaGFyICphbGM4ODNfbW9kZWxzW0FMQzg4M19NT0RFTF9MQVNUXSA9IHsKKwlbQUxDODgzXzNTVF8yY2hfRElHXQk9ICIzc3RhY2stZGlnIiwKKwlbQUxDODgzXzNTVF82Y2hfRElHXQk9ICIzc3RhY2stNmNoLWRpZyIsCisJW0FMQzg4M18zU1RfNmNoXQk9ICIzc3RhY2stNmNoIiwKKwlbQUxDODgzXzZTVF9ESUddCT0gIjZzdGFjay1kaWciLAorCVtBTEM4ODNfVEFSR0FfRElHXQk9ICJ0YXJnYS1kaWciLAorCVtBTEM4ODNfVEFSR0FfMmNoX0RJR10JPSAidGFyZ2EtMmNoLWRpZyIsCisJW0FMQzg4OF9ERU1PX0JPQVJEXQk9ICI2c3RhY2stZGlnLWRlbW8iLAorCVtBTEM4ODNfQUNFUl0JCT0gImFjZXIiLAorCVtBTEM4ODNfTUVESU9OXQkJPSAibWVkaW9uIiwKKwlbQUxDODgzX0xBUFRPUF9FQVBEXQk9ICJsYXB0b3AtZWFwZCIsCisJW0FMQzg4M19BVVRPXQkJPSAiYXV0byIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODgzX2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHg2NjY4LCAiRUNTIiwgQUxDODgzXzNTVF82Y2hfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA4ZSwgMHg1MzRkLCBOVUxMLCBBTEM4ODNfM1NUXzZjaCksCisJU05EX1BDSV9RVUlSSygweDE1NTgsIDAsICJDbGV2byBsYXB0b3AiLCBBTEM4ODNfTEFQVE9QX0VBUEQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDY2NjgsICJGb3hjb25uIiwgQUxDODgzXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDY2NjgsICJNU0kiLCBBTEM4ODNfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzE4NywgIk1TSSIsIEFMQzg4M182U1RfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MjgwLCAiTVNJIiwgQUxDODgzXzZTVF9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDA1NzksICJNU0kiLCBBTEM4ODNfVEFSR0FfMmNoX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4M2VmOSwgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDNiN2YsICJNU0kiLCBBTEM4ODNfVEFSR0FfMmNoX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4M2ZjYywgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDNmYzEsICJNU0kiLCBBTEM4ODNfVEFSR0FfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHgzZmMzLCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NDMxNCwgIk1TSSIsIEFMQzg4M19UQVJHQV9ESUcpLAorCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDQzMTksICJNU0kiLCBBTEM4ODNfVEFSR0FfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg0MzI0LCAiTVNJIiwgQUxDODgzX1RBUkdBX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4YTQyMiwgIk1TSSIsIEFMQzg4M19UQVJHQV8yY2hfRElHKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMCwgIkFjZXIgbGFwdG9wIiwgQUxDODgzX0FDRVIpLAorCVNORF9QQ0lfUVVJUksoMHgxNjFmLCAweDIwNTQsICJNZWRpb24gbGFwdG9wIiwgQUxDODgzX01FRElPTiksCisJU05EX1BDSV9RVUlSSygweDEwNzEsIDB4ODI1OCwgIkV2ZXNoYW0gVm95YWVnZXIiLCBBTEM4ODNfTEFQVE9QX0VBUEQpLAorCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGQ2MDEsICJEMTAyR0dDIiwgQUxDODgzXzNTVF82Y2gpLAogCXt9CiB9OwogCkBAIC01MTM5LDYgKzU2NTYsMzUgQEAKIAkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M19zaXhzdGFja19tb2RlcywKIAkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCiAJfSwKKwlbQUxDODgzX1RBUkdBX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M190YWdyYV9taXhlciwgYWxjODgzX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4M190YWdyYV92ZXJic30sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM4ODNfRElHT1VUX05JRCwKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODgzX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjODgzX2FkY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF82Y2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjODgzX3RhZ3JhX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjODgzX3RhZ3JhX2F1dG9tdXRlLAorCX0sCisJW0FMQzg4M19UQVJHQV8yY2hfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgzX3RhZ3JhXzJjaF9taXhlcn0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX3RhZ3JhX3ZlcmJzfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4M19ESUdPVVRfTklELAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODNfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4M190YWdyYV91bnNvbF9ldmVudCwKKwkJLmluaXRfaG9vayA9IGFsYzg4M190YWdyYV9hdXRvbXV0ZSwKKwl9LAogCVtBTEM4ODhfREVNT19CT0FSRF0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzg4M19iYXNlX21peGVyLCBhbGM4ODNfY2htb2RlX21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicyB9LApAQCAtNTE2OSw2ICs1NzE1LDMxIEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKIAkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCiAJfSwKKwlbQUxDODgzX01FRElPTl0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M19maXZlc3RhY2tfbWl4ZXIsCisJCQkgICAgYWxjODgzX2NobW9kZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsCisJCQkJYWxjODgzX21lZGlvbl9lYXBkX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODNfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfc2l4c3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzX3NpeHN0YWNrX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4ODNfTEFQVE9QX0VBUERdID0geworCQkubWl4ZXJzID0geyBhbGM4ODNfYmFzZV9taXhlciwKKwkJCSAgICBhbGM4ODNfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgyX2VhcGRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODNfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4ODNfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4M19hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg4M19hZGNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M18zU1RfMmNoX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKKwl9LAogfTsKIAogCkBAIC01Mjc3LDggKzU4NDgsMTAgQEAKIAogCWNvZGVjLT5zcGVjID0gc3BlYzsKIAotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBhbGM4ODNfY2ZnX3RibCk7Ci0JaWYgKGJvYXJkX2NvbmZpZyA8IDAgfHwgYm9hcmRfY29uZmlnID49IEFMQzg4M19NT0RFTF9MQVNUKSB7CisJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzg4M19NT0RFTF9MQVNULAorCQkJCQkJICBhbGM4ODNfbW9kZWxzLAorCQkJCQkJICBhbGM4ODNfY2ZnX3RibCk7CisJaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBBTEM4ODMsICIKIAkJICAgICAgICJ0cnlpbmcgYXV0by1wcm9iZSBmcm9tIEJJT1MuLi5cbiIpOwogCQlib2FyZF9jb25maWcgPSBBTEM4ODNfQVVUTzsKQEAgLTUzNTUsNiArNTkyOCwyNCBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfaGlwcG8xX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAorCS8qIEhEQV9DT0RFQ19WT0xVTUUoIlBDIEJlZXAgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKwkgICBIREFfQ09ERUNfTVVURSgiUEMgQmVlbHAgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwgKi8KKwkvKkhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBELCAweDAsIEhEQV9PVVRQVVQpLCovCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfSFBfQlBDX21peGVyW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKQEAgLTUzNzcsNiArNTk2OCwzMCBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJNb25vIFBsYXliYWNrIFZvbHVtZSIsIDB4MGUsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfTU9OTygiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlBDIEJlZXAgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUEMgQmVlcCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X29wdGlvbl9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIlJlYXIgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiUmVhciBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKICNkZWZpbmUgYWxjMjYyX2NhcHR1cmVfbWl4ZXIJCWFsYzg4Ml9jYXB0dXJlX21peGVyCiAjZGVmaW5lIGFsYzI2Ml9jYXB0dXJlX2FsdF9taXhlcglhbGM4ODJfY2FwdHVyZV9hbHRfbWl4ZXIKIApAQCAtNTQ1OSw2ICs2MDc0LDEwMyBAQAogCXsgfQogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfaGlwcG9fdW5zb2xfdmVyYnNbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfaGlwcG8xX3Vuc29sX3ZlcmJzW10gPSB7CisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKKworCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX0hQX0VWRU5UfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXt9Cit9OworCisvKiBtdXRlL3VubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGFjY29yZGluZyB0byB0aGUgaHAgamFjayBhbmQgbXV0ZSBzdGF0ZSAqLworc3RhdGljIHZvaWQgYWxjMjYyX2hpcHBvX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgZm9yY2UpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IG11dGU7CisKKwlpZiAoZm9yY2UgfHwgISBzcGVjLT5zZW5zZV91cGRhdGVkKSB7CisJCXVuc2lnbmVkIGludCBwcmVzZW50OworCQkvKiBuZWVkIHRvIGV4ZWN1dGUgYW5kIHN5bmMgYXQgZmlyc3QgKi8KKwkJc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE1LCAwLCBBQ19WRVJCX1NFVF9QSU5fU0VOU0UsIDApOworCQlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE1LCAwLAorCQkJCSAgICAJIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCk7CisJCXNwZWMtPmphY2tfcHJlc2VudCA9IChwcmVzZW50ICYgMHg4MDAwMDAwMCkgIT0gMDsKKwkJc3BlYy0+c2Vuc2VfdXBkYXRlZCA9IDE7CisJfQorCWlmIChzcGVjLT5qYWNrX3ByZXNlbnQpIHsKKwkJLyogbXV0ZSBpbnRlcm5hbCBzcGVha2VyICovCisJCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNCwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkJIDB4ODAsIDB4ODApOworCQlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTQsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJCSAweDgwLCAweDgwKTsKKwl9IGVsc2UgeworCQkvKiB1bm11dGUgaW50ZXJuYWwgc3BlYWtlciBpZiBuZWNlc3NhcnkgKi8KKwkJbXV0ZSA9IHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIDB4MTUsIDAsIEhEQV9PVVRQVVQsIDApOworCQlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTQsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJCSAweDgwLCBtdXRlICYgMHg4MCk7CisJCW11dGUgPSBzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKGNvZGVjLCAweDE1LCAxLCBIREFfT1VUUFVULCAwKTsKKwkJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE0LCAxLCBIREFfT1VUUFVULCAwLAorCQkJCQkgMHg4MCwgbXV0ZSAmIDB4ODApOworCX0KK30KKworLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgc2Vuc2luZyAqLworc3RhdGljIHZvaWQgYWxjMjYyX2hpcHBvX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVzKQoreworCWlmICgocmVzID4+IDI2KSAhPSBBTEM4ODBfSFBfRVZFTlQpCisJCXJldHVybjsKKwlhbGMyNjJfaGlwcG9fYXV0b211dGUoY29kZWMsIDEpOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjJfaGlwcG8xX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgZm9yY2UpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IG11dGU7CisKKwlpZiAoZm9yY2UgfHwgISBzcGVjLT5zZW5zZV91cGRhdGVkKSB7CisJCXVuc2lnbmVkIGludCBwcmVzZW50OworCQkvKiBuZWVkIHRvIGV4ZWN1dGUgYW5kIHN5bmMgYXQgZmlyc3QgKi8KKwkJc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDFiLCAwLCBBQ19WRVJCX1NFVF9QSU5fU0VOU0UsIDApOworCQlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDFiLCAwLAorCQkJCSAgICAJIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCk7CisJCXNwZWMtPmphY2tfcHJlc2VudCA9IChwcmVzZW50ICYgMHg4MDAwMDAwMCkgIT0gMDsKKwkJc3BlYy0+c2Vuc2VfdXBkYXRlZCA9IDE7CisJfQorCWlmIChzcGVjLT5qYWNrX3ByZXNlbnQpIHsKKwkJLyogbXV0ZSBpbnRlcm5hbCBzcGVha2VyICovCisJCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNCwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkJIDB4ODAsIDB4ODApOworCQlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTQsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJCSAweDgwLCAweDgwKTsKKwl9IGVsc2UgeworCQkvKiB1bm11dGUgaW50ZXJuYWwgc3BlYWtlciBpZiBuZWNlc3NhcnkgKi8KKwkJbXV0ZSA9IHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIDB4MWIsIDAsIEhEQV9PVVRQVVQsIDApOworCQlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTQsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJCSAweDgwLCBtdXRlICYgMHg4MCk7CisJCW11dGUgPSBzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKGNvZGVjLCAweDFiLCAxLCBIREFfT1VUUFVULCAwKTsKKwkJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE0LCAxLCBIREFfT1VUUFVULCAwLAorCQkJCQkgMHg4MCwgbXV0ZSAmIDB4ODApOworCX0KK30KKworLyogdW5zb2xpY2l0ZWQgZXZlbnQgZm9yIEhQIGphY2sgc2Vuc2luZyAqLworc3RhdGljIHZvaWQgYWxjMjYyX2hpcHBvMV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwlpZiAoKHJlcyA+PiAyNikgIT0gQUxDODgwX0hQX0VWRU5UKQorCQlyZXR1cm47CisJYWxjMjYyX2hpcHBvMV9hdXRvbXV0ZShjb2RlYywgMSk7Cit9CisKIC8qCiAgKiBmdWppdHN1IG1vZGVsCiAgKiAgMHgxNCA9IGhlYWRwaG9uZS9zcGRpZi1vdXQsIDB4MTUgPSBpbnRlcm5hbCBzcGVha2VyCkBAIC01ODA5LDYgKzY1MjEsMTAwIEBACiAJeyB9CiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfaW5pdF92ZXJic1tdID0geworCS8qCisJICogVW5tdXRlIEFEQzAtMiBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgorCSAqLworCXsweDA3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCisJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCisJICogbWl4ZXIgd2lkZ2V0CisJICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IgZnJvbnQKKwkgKiBwYW5lbCBtaWMgKG1pYyAyKQorCSAqLworCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNCl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDUpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg2KX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNyl9LAorCS8qCisJICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MGMgLSAweDBlKQorCSAqLworCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisKKwkvKiBzZXQgdXAgaW5wdXQgYW1wcyBmb3IgYW5hbG9nIGxvb3BiYWNrICovCisJLyogQW1wIEluZGljZXM6IERBQyA9IDAsIG1peGVyID0gMSAqLworCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCisKKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFAgfSwJLyogSFAgKi8KKwl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCS8qIE1vbm8gKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCS8qIHJlYXIgTUlDICovCisJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCS8qIExpbmUgaW4gKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCS8qIEZyb250IE1JQyAqLworCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwJLyogTGluZSBvdXQgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwJLyogQ0QgaW4gKi8KKworCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCisJezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAorCisJLyogezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAyMyB9LCAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwIH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAyMyB9LAorCXsweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKKwl7MHgxZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwIH0sCisKKwkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KKwkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDE2LCAxNywgMGIgKi8KKwkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sIC8qcmVhciBNSUMqLworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwgLypMaW5lIGluKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAyIDw8IDgpKX0sIC8qRiBNSUMqLworCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDMgPDwgOCkpfSwgLypGcm9udCovCisJezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNCA8PCA4KSl9LCAvKkNEKi8KKyAgICAgICAgLyogezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNiA8PCA4KSl9LCAgKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA3IDw8IDgpKX0sIC8qSFAqLworCS8qIElucHV0IG1peGVyMiAqLworCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCisJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMiA8PCA4KSl9LAorCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDMgPDwgOCkpfSwKKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA0IDw8IDgpKX0sCisgICAgICAgIC8qIHsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDYgPDwgOCkpfSwgKi8KKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA3IDw8IDgpKX0sCisJLyogSW5wdXQgbWl4ZXIzICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAyIDw8IDgpKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMyA8PCA4KSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDQgPDwgOCkpfSwKKyAgICAgICAgLyogezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNiA8PCA4KSl9LCAqLworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDcgPDwgOCkpfSwKKworCXsgfQorfTsKKwogLyogcGNtIGNvbmZpZ3VyYXRpb246IGlkZW50aWFjYWwgd2l0aCBBTEM4ODAgKi8KICNkZWZpbmUgYWxjMjYyX3BjbV9hbmFsb2dfcGxheWJhY2sJYWxjODgwX3BjbV9hbmFsb2dfcGxheWJhY2sKICNkZWZpbmUgYWxjMjYyX3BjbV9hbmFsb2dfY2FwdHVyZQlhbGM4ODBfcGNtX2FuYWxvZ19jYXB0dXJlCkBAIC01ODY2LDI2ICs2NjcyLDM1IEBACiAvKgogICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBhbGMyNjJfY2ZnX3RibFtdID0gewotCXsgLm1vZGVsbmFtZSA9ICJiYXNpYyIsIC5jb25maWcgPSBBTEMyNjJfQkFTSUMgfSwKLQl7IC5tb2RlbG5hbWUgPSAiZnVqaXRzdSIsIC5jb25maWcgPSBBTEMyNjJfRlVKSVRTVSB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwY2YsIC5wY2lfc3ViZGV2aWNlID0gMHgxMzk3LAotCSAgLmNvbmZpZyA9IEFMQzI2Ml9GVUpJVFNVIH0sCi0JeyAubW9kZWxuYW1lID0gImhwLWJwYyIsIC5jb25maWcgPSBBTEMyNjJfSFBfQlBDIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDI4MGMsCi0JICAuY29uZmlnID0gQUxDMjYyX0hQX0JQQyB9LCAvKiB4dzQ0MDAgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MjgwMSwKLQkgIC5jb25maWcgPSBBTEMyNjJfSFBfQlBDIH0sIC8qIHE5NjUgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MzAxNCwKLQkgIC5jb25maWcgPSBBTEMyNjJfSFBfQlBDIH0sIC8qIHh3NjQwMCAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgzMDE1LAotCSAgLmNvbmZpZyA9IEFMQzI2Ml9IUF9CUEMgfSwgLyogeHc4NDAwICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDEyZmUsCi0JICAuY29uZmlnID0gQUxDMjYyX0hQX0JQQyB9LCAvKiB4dzk0MDAgKi8KLQl7IC5tb2RlbG5hbWUgPSAiYmVucSIsIC5jb25maWcgPSBBTEMyNjJfQkVOUV9FRDggfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxN2ZmLCAucGNpX3N1YmRldmljZSA9IDB4MDU2MCwKLQkgIC5jb25maWcgPSBBTEMyNjJfQkVOUV9FRDggfSwKLQl7IC5tb2RlbG5hbWUgPSAiYXV0byIsIC5jb25maWcgPSBBTEMyNjJfQVVUTyB9LAorc3RhdGljIGNvbnN0IGNoYXIgKmFsYzI2Ml9tb2RlbHNbQUxDMjYyX01PREVMX0xBU1RdID0geworCVtBTEMyNjJfQkFTSUNdCQk9ICJiYXNpYyIsCisJW0FMQzI2Ml9ISVBQT10JCT0gImhpcHBvIiwKKwlbQUxDMjYyX0hJUFBPXzFdCT0gImhpcHBvXzEiLAorCVtBTEMyNjJfRlVKSVRTVV0JPSAiZnVqaXRzdSIsCisJW0FMQzI2Ml9IUF9CUENdCQk9ICJocC1icGMiLAorCVtBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMXT0gImhwLWJwYy1kNzAwMCIsCisJW0FMQzI2Ml9CRU5RX0VEOF0JPSAiYmVucSIsCisJW0FMQzI2Ml9BVVRPXQkJPSAiYXV0byIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjYyX2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAwMiwgMHg0MzdiLCAiSGlwcG8iLCBBTEMyNjJfSElQUE8pLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDEyZmUsICJIUCB4dzk0MDAiLCBBTEMyNjJfSFBfQlBDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODBjLCAiSFAgeHc0NDAwIiwgQUxDMjYyX0hQX0JQQyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNCwgIkhQIHh3NjQwMCIsIEFMQzI2Ml9IUF9CUEMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTUsICJIUCB4dzg0MDAiLCBBTEMyNjJfSFBfQlBDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAwLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAyLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA0LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA2LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAxLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAzLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA1LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA3LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MjAzLCAiU29ueSBVWC05MCIsIEFMQzI2Ml9ISVBQTyksCisJU05EX1BDSV9RVUlSSygweDEwY2YsIDB4MTM5NywgIkZ1aml0c3UiLCBBTEMyNjJfRlVKSVRTVSksCisJU05EX1BDSV9RVUlSSygweDE3ZmYsIDB4MDU4ZiwgIkJlbnEgSGlwcG8iLCBBTEMyNjJfSElQUE9fMSksCisJU05EX1BDSV9RVUlSSygweDE3ZmYsIDB4MDU2MCwgIkJlbnEgRUQ4IiwgQUxDMjYyX0JFTlFfRUQ4KSwKIAl7fQogfTsKIApAQCAtNTkwMCw2ICs2NzE1LDMwIEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAogCX0sCisJW0FMQzI2Ml9ISVBQT10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml9iYXNlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX2hpcHBvX3Vuc29sX3ZlcmJzfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCisJCS5ocF9uaWQgPSAweDAzLAorCQkuZGlnX291dF9uaWQgPSBBTEMyNjJfRElHT1VUX05JRCwKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGMyNjJfaGlwcG9fdW5zb2xfZXZlbnQsCisJfSwKKwlbQUxDMjYyX0hJUFBPXzFdID0geworCQkubWl4ZXJzID0geyBhbGMyNjJfaGlwcG8xX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX2hpcHBvMV91bnNvbF92ZXJic30sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYyX2RhY19uaWRzLAorCQkuaHBfbmlkID0gMHgwMiwKKwkJLmRpZ19vdXRfbmlkID0gQUxDMjYyX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKKwkJLnVuc29sX2V2ZW50ID0gYWxjMjYyX2hpcHBvMV91bnNvbF9ldmVudCwKKwl9LAogCVtBTEMyNjJfRlVKSVRTVV0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2Ml9mdWppdHN1X21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX2Z1aml0c3VfdW5zb2xfdmVyYnMgfSwKQEAgLTU5MjIsNiArNjc2MSwyNyBAQAogCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAogCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9IUF9jYXB0dXJlX3NvdXJjZSwKIAl9LAkKKwlbQUxDMjYyX0hQX0JQQ19ENzAwMF9XRl0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9IUF9jYXB0dXJlX3NvdXJjZSwKKwl9LAkKKwlbQUxDMjYyX0hQX0JQQ19ENzAwMF9XTF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfbWl4ZXIsCisJCQkgICAgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9vcHRpb25fbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKKwkJLmhwX25pZCA9IDB4MDMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9IUF9jYXB0dXJlX3NvdXJjZSwKKwl9LAkKIAlbQUxDMjYyX0JFTlFfRUQ4XSA9IHsKIAkJLm1peGVycyA9IHsgYWxjMjYyX2Jhc2VfbWl4ZXIgfSwKIAkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfRUFQRF92ZXJicyB9LApAQCAtNTk0MCw3ICs2ODAwLDcgQEAKIAlpbnQgYm9hcmRfY29uZmlnOwogCWludCBlcnI7CiAKLQlzcGVjID0ga2NhbGxvYygxLCBzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3BlYyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNTk1Niw5ICs2ODE2LDExIEBACiAJfQogI2VuZGlmCiAKLQlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgYWxjMjYyX2NmZ190YmwpOwotCQotCWlmIChib2FyZF9jb25maWcgPCAwIHx8IGJvYXJkX2NvbmZpZyA+PSBBTEMyNjJfTU9ERUxfTEFTVCkgeworCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBBTEMyNjJfTU9ERUxfTEFTVCwKKwkJCQkJCSAgYWxjMjYyX21vZGVscywKKwkJCQkJCSAgYWxjMjYyX2NmZ190YmwpOworCisJaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBBTEMyNjIsICIKIAkJICAgICAgICJ0cnlpbmcgYXV0by1wcm9iZSBmcm9tIEJJT1MuLi5cbiIpOwogCQlib2FyZF9jb25maWcgPSBBTEMyNjJfQVVUTzsKQEAgLTYwNzgsNiArNjk0MCw0NCBAQAogCXsgNCwgYWxjODYxX3VuaXdpbGxfbTMxX2NoNF9pbml0IH0sCiB9OwogCisvKiBTZXQgbWljMSBhbmQgbGluZS1pbiBhcyBpbnB1dCBhbmQgdW5tdXRlIHRoZSBtaXhlciAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYXN1c19jaDJfaW5pdFtdID0geworCS8qIHNldCBwaW4gd2lkZ2V0IDFBaCAobGluZSBpbikgZm9yIGlucHV0ICovCisJeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKKwkvKiBzZXQgcGluIHdpZGdldCAxOGggKG1pYzEvMikgZm9yIGlucHV0LCBmb3IgbWljIGFsc28gZW5hYmxlIHRoZSB2cmVmICovCisJeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKKworCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjIH0sCisjaWYgMAorCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpIH0sIC8qbGluZS1pbiovCisjZW5kaWYKKwl7IH0gLyogZW5kICovCit9OworLyogU2V0IG1pYzEgbmFkIGxpbmUtaW4gYXMgb3V0cHV0IGFuZCBtdXRlIG1peGVyICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9hc3VzX2NoNl9pbml0W10gPSB7CisJLyogc2V0IHBpbiB3aWRnZXQgMUFoIChsaW5lIGluKSBmb3Igb3V0cHV0IChCYWNrIFN1cnJvdW5kKSovCisJeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKKwkvKiB7IDB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sICovCisJLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxKSBmb3Igb3V0cHV0IChDTEZFKSovCisJeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKKwkvKiB7IDB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sICovCisJeyAweDBjLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCXsgMHgwZCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKKworCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwIH0sCisjaWYgMAorCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpIH0sIC8qbGluZSBpbiovCisjZW5kaWYKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxX2FzdXNfbW9kZXNbMl0gPSB7CisJeyAyLCBhbGM4NjFfYXN1c19jaDJfaW5pdCB9LAorCXsgNiwgYWxjODYxX2FzdXNfY2g2X2luaXQgfSwKK307CisKIC8qIHBhdGNoLUFMQzg2MSAqLwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX2Jhc2VfbWl4ZXJbXSA9IHsKQEAgLTYxNTQsNyArNzA1NCwyOSBAQAogICAgICAgICAgICAgICAgIC5wcml2YXRlX3ZhbHVlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCiAJfSwKIAl7IH0gLyogZW5kICovCi19OwkJCQorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV90b3NoaWJhX21peGVyW10gPSB7CisgICAgICAgIC8qIG91dHB1dCBtaXhlciBjb250cm9sICovCisJSERBX0NPREVDX01VVEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKKwkKKyAgICAgICAgLypDYXB0dXJlIG1peGVyIGNvbnRyb2wgKi8KKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCQkuY291bnQgPSAxLAorCQkuaW5mbyA9IGFsY19tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsY19tdXhfZW51bV9wdXQsCisJfSwKKworCXsgfSAvKiBlbmQgKi8KK307CQorCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX3VuaXdpbGxfbTMxX21peGVyW10gPSB7CiAgICAgICAgIC8qIG91dHB1dCBtaXhlciBjb250cm9sICovCiAJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCkBAIC02MTk2LDcgKzcxMTgsNTggQEAKIAl9LAogCXsgfSAvKiBlbmQgKi8KIH07CQkJCi0JCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfYXN1c19taXhlcltdID0geworICAgICAgICAvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDA2LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MDQsIDB4MCwgSERBX09VVFBVVCksCisKKwkvKiBJbnB1dCBtaXhlciBjb250cm9sICovCisJSERBX0NPREVDX1ZPTFVNRSgiSW5wdXQgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW5wdXQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAxLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWEsIDB4MDMsIEhEQV9PVVRQVVQpLCAvKiB3YXMgSERBX0lOUFVUICh3aHk/KSAqLworIAorCS8qIENhcHR1cmUgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gYWxjX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGNfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjX211eF9lbnVtX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCisJCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKKwkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKKwkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKKyAgICAgICAgICAgICAgICAucHJpdmF0ZV92YWx1ZSA9IEFSUkFZX1NJWkUoYWxjODYxX2FzdXNfbW9kZXMpLAorCX0sCisJeyB9Cit9OworCisvKiBhZGRpdGlvbmFsIG1peGVyICovCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX2FzdXNfbGFwdG9wX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiUEMgQmVlcCBQbGF5YmFjayBWb2x1bWUiLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQyBCZWVwIFBsYXliYWNrIFN3aXRjaCIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCisJeyB9Cit9OworCiAvKgogICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwogICovCkBAIC02MjE3LDcgKzcxOTAsNyBAQAogCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KIAl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LAogCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLwotCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKKwl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCiAJLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KIAl7IDB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAogCS8qIHBvcnQtRyBmb3IgQ0xGRSAocmVhciBwYW5lbCkgKi8KQEAgLTYyODEsNyArNzI1NCw3IEBACiAJLyogcG9ydC1FIGZvciBIUCBvdXQgKGZyb250IHBhbmVsKSAqLwogCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sCiAJLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAorCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKIAkvKiBwb3J0LUYgZm9yIG1pYy1pbiAoZnJvbnQgcGFuZWwpIHdpdGggdnJlZiAqLwogCXsgMHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCiAJLyogcG9ydC1HIGZvciBDTEZFIChyZWFyIHBhbmVsKSAqLwpAQCAtNjM0MSw3ICs3MzE0LDcgQEAKIAkvKiBwb3J0LUUgZm9yIEhQIG91dCAoZnJvbnQgcGFuZWwpICovCiAJeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwgLy8gdGhpcyBoYXMgdG8gYmUgc2V0IHRvIFZSRUY4MAogCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLwotCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKKwl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCiAJLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KIAl7IDB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAogCS8qIHBvcnQtRyBmb3IgQ0xGRSAocmVhciBwYW5lbCkgKi8KQEAgLTYzODUsNiArNzM1OCw3NCBAQAogCXsgfQogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYXN1c19pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgorCSAqLworCS8qIHBvcnQtQSBmb3Igc3Vycm91bmQgKHJlYXIgcGFuZWwpIHwgYWNjb3JkaW5nIHRvIGNvZGVjIzAgdGhpcyBpcyB0aGUgSFAgamFjayovCisJeyAweDBlLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzAgfSwgLyogd2FzIDB4MDAgKi8KKwkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KKwl7IDB4MGUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCisJLyogcG9ydC1CIGZvciBtaWMtaW4gKHJlYXIgcGFuZWwpIHdpdGggdnJlZiAqLworCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCisJLyogcG9ydC1DIGZvciBsaW5lLWluIChyZWFyIHBhbmVsKSAqLworCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCisJLyogcG9ydC1EIGZvciBGcm9udCAqLworCXsgMHgwYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCisJeyAweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KKwl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LCAvKiB0aGlzIGhhcyB0byBiZSBzZXQgdG8gVlJFRjgwICovCisJLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCisJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAorCS8qIHBvcnQtRiBmb3IgbWljLWluIChmcm9udCBwYW5lbCkgd2l0aCB2cmVmICovCisJeyAweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKKwkvKiBwb3J0LUcgZm9yIENMRkUgKHJlYXIgcGFuZWwpICovCisJeyAweDFmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKKwkvKiBwb3J0LUggZm9yIHNpZGUgKHJlYXIgcGFuZWwpICovCisJeyAweDIwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKKwkvKiBDRC1pbiAqLworCXsgMHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCisJLyogcm91dGUgZnJvbnQgbWljIHRvIEFEQzEqLworCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCS8qIFVubXV0ZSBEQUMwfjMgJiBzcGRpZiBvdXQqLworCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDA2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwkvKiBVbm11dGUgTWl4ZXIgMTQgKG1pYykgMWMgKExpbmUgaW4pKi8KKwl7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorICAgICAgICB7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisgICAgICAgIHsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJCisJLyogVW5tdXRlIFN0ZXJlbyBNaXhlciAxNSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGMgICAgICAgICAgfSwgLyogT3V0cHV0IDB+MTIgc3RlcCAqLworCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sIC8qIGhwIHVzZWQgREFDIDMgKEZyb250KSAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7IH0KK307CisKKy8qIGFkZGl0aW9uYWwgaW5pdCB2ZXJicyBmb3IgQVNVUyBsYXB0b3BzICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9hc3VzX2xhcHRvcF9pbml0X3ZlcmJzW10gPSB7CisJeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDUgfSwgLyogSFAtb3V0ICovCisJeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKSB9LCAvKiBtdXRlIGxpbmUtaW4gKi8KKwl7IH0KK307CisKIC8qCiAgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCiAgKi8KQEAgLTY0MzcsNiArNzQ3OCwzOSBAQAogCXsgfQogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdG9zaGliYV9pbml0X3ZlcmJzW10gPSB7CisJezB4MGYsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAorICAgICAgICAKKwl7IH0KK307CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzg2MV90b3NoaWJhX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgwZiwgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNiwgMCwgSERBX0lOUFVULCAwLAorCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNiwgMSwgSERBX0lOUFVULCAwLAorCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxYSwgMCwgSERBX0lOUFVULCAzLAorCQkJCSAweDgwLCBwcmVzZW50ID8gMCA6IDB4ODApOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxYSwgMSwgSERBX0lOUFVULCAzLAorCQkJCSAweDgwLCBwcmVzZW50ID8gMCA6IDB4ODApOworfQorCitzdGF0aWMgdm9pZCBhbGM4NjFfdG9zaGliYV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwkvKiBMb29rcyBsaWtlIHRoZSB1bnNvbCBldmVudCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKKwkgKiBkZWZpbml0aW9uLiAgNmJpdCB0YWcgaXMgcGxhY2VkIGF0IDI2IGJpdCEKKwkgKi8KKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0hQX0VWRU5UKQorCQlhbGM4NjFfdG9zaGliYV9hdXRvbXV0ZShjb2RlYyk7Cit9CisKIC8qIHBjbSBjb25maWd1cmF0aW9uOiBpZGVudGlhY2FsIHdpdGggQUxDODgwICovCiAjZGVmaW5lIGFsYzg2MV9wY21fYW5hbG9nX3BsYXliYWNrCWFsYzg4MF9wY21fYW5hbG9nX3BsYXliYWNrCiAjZGVmaW5lIGFsYzg2MV9wY21fYW5hbG9nX2NhcHR1cmUJYWxjODgwX3BjbV9hbmFsb2dfY2FwdHVyZQpAQCAtNjcxMCwxOSArNzc4NCwyOSBAQAogLyoKICAqIGNvbmZpZ3VyYXRpb24gYW5kIHByZXNldAogICovCi1zdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgYWxjODYxX2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrIiwgLmNvbmZpZyA9IEFMQzg2MV8zU1QgfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHg4MDg2LCAucGNpX3N1YmRldmljZSA9IDB4ZDYwMCwKLQkgIC5jb25maWcgPSBBTEM4NjFfM1NUIH0sCi0JeyAubW9kZWxuYW1lID0gIjNzdGFjay02NjAiLCAuY29uZmlnID0gQUxDNjYwXzNTVCB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHg4MWU3LAotCSAgLmNvbmZpZyA9IEFMQzY2MF8zU1QgfSwKLQl7IC5tb2RlbG5hbWUgPSAiM3N0YWNrLWRpZyIsIC5jb25maWcgPSBBTEM4NjFfM1NUX0RJRyB9LAotCXsgLm1vZGVsbmFtZSA9ICI2c3RhY2stZGlnIiwgLmNvbmZpZyA9IEFMQzg2MV82U1RfRElHIH0sCi0JeyAubW9kZWxuYW1lID0gInVuaXdpbGwtbTMxIiwgLmNvbmZpZyA9IEFMQzg2MV9VTklXSUxMX00zMX0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTU4NCwgLnBjaV9zdWJkZXZpY2UgPSAweDkwNzIsCi0JICAuY29uZmlnID0gQUxDODYxX1VOSVdJTExfTTMxIH0sCi0JeyAubW9kZWxuYW1lID0gImF1dG8iLCAuY29uZmlnID0gQUxDODYxX0FVVE8gfSwKK3N0YXRpYyBjb25zdCBjaGFyICphbGM4NjFfbW9kZWxzW0FMQzg2MV9NT0RFTF9MQVNUXSA9IHsKKwlbQUxDODYxXzNTVF0JCT0gIjNzdGFjayIsCisJW0FMQzY2MF8zU1RdCQk9ICIzc3RhY2stNjYwIiwKKwlbQUxDODYxXzNTVF9ESUddCT0gIjNzdGFjay1kaWciLAorCVtBTEM4NjFfNlNUX0RJR10JPSAiNnN0YWNrLWRpZyIsCisJW0FMQzg2MV9VTklXSUxMX00zMV0JPSAidW5pd2lsbC1tMzEiLAorCVtBTEM4NjFfVE9TSElCQV0JPSAidG9zaGliYSIsCisJW0FMQzg2MV9BU1VTXQkJPSAiYXN1cyIsCisJW0FMQzg2MV9BU1VTX0xBUFRPUF0JPSAiYXN1cy1sYXB0b3AiLAorCVtBTEM4NjFfQVVUT10JCT0gImF1dG8iLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzg2MV9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTIwNSwgIkFTVVMgVzdKIiwgQUxDODYxXzNTVCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzNSwgIkFTVVMgRjIvMyIsIEFMQzg2MV9BU1VTX0xBUFRPUCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOCwgIkFTVVMgRjIvMyIsIEFMQzg2MV9BU1VTX0xBUFRPUCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTM5MywgIkFTVVMiLCBBTEM4NjFfQVNVUyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODFlNywgIkFTVVMiLCBBTEM2NjBfM1NUKSwKKwlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjAwLCAiVG9zaGliYSIsIEFMQzg2MV9UT1NISUJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjEwLCAiVG9zaGliYSIsIEFMQzg2MV9UT1NISUJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHg5MDcyLCAiVW5pd2lsbCBtMzEiLCBBTEM4NjFfVU5JV0lMTF9NMzEpLAorCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDJiMDEsICJVbml3aWxsIFg0MEFJeCIsIEFMQzg2MV9VTklXSUxMX00zMSksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDYwMCwgIkludGVsIiwgQUxDODYxXzNTVCksCiAJe30KIH07CiAKQEAgLTY3ODksOCArNzg3Myw0OCBAQAogCQkuYWRjX25pZHMgPSBhbGM4NjFfYWRjX25pZHMsCiAJCS5pbnB1dF9tdXggPSAmYWxjODYxX2NhcHR1cmVfc291cmNlLAogCX0sCi0KLX07CQorCVtBTEM4NjFfVE9TSElCQV0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MV90b3NoaWJhX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfYmFzZV9pbml0X3ZlcmJzLCBhbGM4NjFfdG9zaGliYV9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxX2RhY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCisJCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKKwkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg2MV90b3NoaWJhX3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjODYxX3Rvc2hpYmFfYXV0b211dGUsCisJfSwKKwlbQUxDODYxX0FTVVNdID0geworCQkubWl4ZXJzID0geyBhbGM4NjFfYXN1c19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX2FzdXNfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKKwkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfYXN1c19tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfYXN1c19tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5ocF9uaWQgPSAweDA2LAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4NjFfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4NjFfYWRjX25pZHMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzg2MV9BU1VTX0xBUFRPUF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MV90b3NoaWJhX21peGVyLCBhbGM4NjFfYXN1c19sYXB0b3BfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV9hc3VzX2luaXRfdmVyYnMsCisJCQkJYWxjODYxX2FzdXNfbGFwdG9wX2luaXRfdmVyYnMgfSwKKwkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg2MV9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgzXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF8yY2hfbW9kZXMsCisJCS5uZWVkX2RhY19maXggPSAxLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4NjFfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4NjFfYWRjX25pZHMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxX2NhcHR1cmVfc291cmNlLAorCX0sCit9OwogCiAKIHN0YXRpYyBpbnQgcGF0Y2hfYWxjODYxKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNjc5OSwxNSArNzkyMywxNyBAQAogCWludCBib2FyZF9jb25maWc7CiAJaW50IGVycjsKIAotCXNwZWMgPSBrY2FsbG9jKDEsIHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmIChzcGVjID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJY29kZWMtPnNwZWMgPSBzcGVjOwkKIAotICAgICAgICBib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgYWxjODYxX2NmZ190YmwpOworICAgICAgICBib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODYxX01PREVMX0xBU1QsCisJCQkJCQkgIGFsYzg2MV9tb2RlbHMsCisJCQkJCQkgIGFsYzg2MV9jZmdfdGJsKTsKIAotCWlmIChib2FyZF9jb25maWcgPCAwIHx8IGJvYXJkX2NvbmZpZyA+PSBBTEM4NjFfTU9ERUxfTEFTVCkgeworCWlmIChib2FyZF9jb25maWcgPCAwKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgQUxDODYxLCAiCiAJCSAgICAgICAidHJ5aW5nIGF1dG8tcHJvYmUgZnJvbSBCSU9TLi4uXG4iKTsKIAkJYm9hcmRfY29uZmlnID0gQUxDODYxX0FVVE87CkBAIC02ODQ2LDE5ICs3OTcyLDcwNiBAQAogfQogCiAvKgorICogQUxDODYxLVZEIHN1cHBvcnQKKyAqCisgKiBCYXNlZCBvbiBBTEM4ODIKKyAqCisgKiBJbiBhZGRpdGlvbiwgYW4gaW5kZXBlbmRlbnQgREFDCisgKi8KKyNkZWZpbmUgQUxDODYxVkRfRElHT1VUX05JRAkweDA2CisKK3N0YXRpYyBoZGFfbmlkX3QgYWxjODYxdmRfZGFjX25pZHNbNF0gPSB7CisJLyogZnJvbnQsIHN1cnIsIGNsZmUsIHNpZGUgc3VyciAqLworCTB4MDIsIDB4MDMsIDB4MDQsIDB4MDUKK307CisKKy8qIGRhY19uaWRzIGZvciBBTEM2NjB2ZCBhcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXIgLSBhY2NvcmRpbmcgdG8KKyAqIFJlYWx0ZWsncyBkcml2ZXIuCisgKiBUaGlzIHNob3VsZCBwcm9iYWJseSB0ZXN1bHQgaW4gYSBkaWZmZXJlbnQgbWl4ZXIgZm9yIDZzdGFjayBtb2RlbHMKKyAqIG9mIEFMQzY2MHZkIGNvZGVjcywgYnV0IGZvciBub3cgdGhlcmUgaXMgb25seSAzc3RhY2sgbWl4ZXIKKyAqIC0gYW5kIGl0IGlzIHRoZSBzYW1lIGFzIGluIDg2MXZkLgorICogYWRjX25pZHMgaW4gQUxDNjYwdmQgYXJlIChpcykgdGhlIHNhbWUgYXMgaW4gODYxdmQKKyAqLworc3RhdGljIGhkYV9uaWRfdCBhbGM2NjB2ZF9kYWNfbmlkc1szXSA9IHsKKwkvKiBmcm9udCwgcmVhciwgY2xmZSwgcmVhcl9zdXJyICovCisJMHgwMiwgMHgwNCwgMHgwMworfTsKKworc3RhdGljIGhkYV9uaWRfdCBhbGM4NjF2ZF9hZGNfbmlkc1sxXSA9IHsKKwkvKiBBREMwICovCisJMHgwOSwKK307CisKKy8qIGlucHV0IE1VWCAqLworLyogRklYTUU6IHNob3VsZCBiZSBhIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gNCwKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJGcm9udCBNaWMiLCAweDEgfSwKKwkJeyAiTGluZSIsIDB4MiB9LAorCQl7ICJDRCIsIDB4NCB9LAorCX0sCit9OworCisjZGVmaW5lIGFsYzg2MXZkX211eF9lbnVtX2luZm8gYWxjX211eF9lbnVtX2luZm8KKyNkZWZpbmUgYWxjODYxdmRfbXV4X2VudW1fZ2V0IGFsY19tdXhfZW51bV9nZXQKKworc3RhdGljIGludCBhbGM4NjF2ZF9tdXhfZW51bV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSBzcGVjLT5pbnB1dF9tdXg7CisJdW5zaWduZWQgaW50IGFkY19pZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwlzdGF0aWMgaGRhX25pZF90IGNhcHR1cmVfbWl4ZXJzWzFdID0geyAweDIyIH07CisJaGRhX25pZF90IG5pZCA9IGNhcHR1cmVfbWl4ZXJzW2FkY19pZHhdOworCXVuc2lnbmVkIGludCAqY3VyX3ZhbCA9ICZzcGVjLT5jdXJfbXV4W2FkY19pZHhdOworCXVuc2lnbmVkIGludCBpLCBpZHg7CisKKwlpZHggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWlmIChpZHggPj0gaW11eC0+bnVtX2l0ZW1zKQorCQlpZHggPSBpbXV4LT5udW1faXRlbXMgLSAxOworCWlmICgqY3VyX3ZhbCA9PSBpZHggJiYgISBjb2RlYy0+aW5fcmVzdW1lKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaW11eC0+bnVtX2l0ZW1zOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHYgPSAoaSA9PSBpZHgpID8gMHg3MDAwIDogMHg3MDgwOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJCQkJICAgIHYgfCAoaW11eC0+aXRlbXNbaV0uaW5kZXggPDwgOCkpOworCX0KKwkqY3VyX3ZhbCA9IGlkeDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIDJjaCBtb2RlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzWzFdID0geworCXsgMiwgTlVMTCB9Cit9OworCisvKgorICogNmNoIG1vZGUKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4NjF2ZF82c3RhY2tfY2g2X2luaXRbXSA9IHsKKwl7IDB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAorCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiA4Y2ggbW9kZQorICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkXzZzdGFja19jaDhfaW5pdFtdID0geworCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg2MXZkXzZzdGFja19tb2Rlc1syXSA9IHsKKwl7IDYsIGFsYzg2MXZkXzZzdGFja19jaDZfaW5pdCB9LAorCXsgOCwgYWxjODYxdmRfNnN0YWNrX2NoOF9pbml0IH0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxdmRfY2htb2RlX21peGVyW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKKwkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAorCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAorCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MXZkX2NhcHR1cmVfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiBUaGUgbXVsdGlwbGUgIkNhcHR1cmUgU291cmNlIiBjb250cm9scyBjb25mdXNlIGFsc2FtaXhlcgorCQkgKiBTbyBjYWxsIHNvbWV3aGF0IGRpZmZlcmVudC4uCisJCSAqRklYTUU6IHRoZSBjb250cm9scyBhcHBlYXIgaW4gdGhlICJwbGF5YmFjayIgdmlldyEKKwkJICovCisJCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KKwkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSBhbGM4NjF2ZF9tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjODYxdmRfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjODYxdmRfbXV4X2VudW1fcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogUGluIGFzc2lnbm1lbnQ6IEZyb250PTB4MTQsIFJlYXI9MHgxNSwgQ0xGRT0weDE2LCBTaWRlPTB4MTcKKyAqICAgICAgICAgICAgICAgICBNaWM9MHgxOCwgRnJvbnQgTWljPTB4MTksIExpbmUtSW49MHgxYSwgSFA9MHgxYgorICovCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxdmRfNnN0X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiU3Vycm91bmQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMSwgMHgwLAorCQkJCUhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDIsIDB4MCwKKwkJCQlIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAxLCAyLCBIREFfSU5QVVQpLAorCUhEQV9CSU5EX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDIsIDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJTaWRlIFBsYXliYWNrIFZvbHVtZSIsIDB4MDUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAyLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxdmRfM3N0X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCisJSERBX0NPREVDX1ZPTFVNRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisKKwl7IH0gLyogZW5kICovCit9OworCisvKgorICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycworICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgorCSAqLworCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCisJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZgorCSAqIHRoZSBhbmFsb2ctbG9vcGJhY2sgbWl4ZXIgd2lkZ2V0CisJICovCisJLyogQW1wIEluZGljZXM6IE1pYzEgPSAwLCBNaWMyID0gMSwgTGluZTEgPSAyLCBMaW5lMiA9IDMsIENEID0gNCAqLworCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCisKKwkvKiBDYXB0dXJlIG1peGVyOiB1bm11dGUgTWljLCBGLU1pYywgTGluZSwgQ0QgaW5wdXRzICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDUpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg2KX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoOCl9LAorCisJLyoKKwkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwMiAtIDB4MDUpCisJICovCisJLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KKwl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKworCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KKwkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKKwl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAorCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCisJezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAorCisJeyB9Cit9OworCisvKgorICogMy1zdGFjayBwaW4gY29uZmlndXJhdGlvbjoKKyAqIGZyb250ID0gMHgxNCwgbWljL2NsZmUgPSAweDE4LCBIUCA9IDB4MTksIGxpbmUvc3VyciA9IDB4MWEsIGYtbWljID0gMHgxYgorICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkXzNzdGFja19pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBTZXQgcGluIG1vZGUgYW5kIG11dGluZworCSAqLworCS8qIHNldCBmcm9udCBwaW4gd2lkZ2V0cyAweDE0IGZvciBvdXRwdXQgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisKKwkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIExpbmUgSW4gcGluOiBpbnB1dCAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTGluZS0yIEluOiBIZWFkcGhvbmUgb3V0cHV0IChvdXRwdXQgMCAtIDB4MGMpICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCisJeyB9Cit9OworCisvKgorICogNi1zdGFjayBwaW4gY29uZmlndXJhdGlvbjoKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4NjF2ZF82c3RhY2tfaW5pdF92ZXJic1tdID0geworCS8qCisJICogU2V0IHBpbiBtb2RlIGFuZCBtdXRpbmcKKwkgKi8KKwkvKiBzZXQgZnJvbnQgcGluIHdpZGdldHMgMHgxNCBmb3Igb3V0cHV0ICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCisJLyogUmVhciBQaW46IG91dHB1dCAxICgweDBkKSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKKwkvKiBDTEZFIFBpbjogb3V0cHV0IDIgKDB4MGUpICovCisJezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAorCS8qIFNpZGUgUGluOiBvdXRwdXQgMyAoMHgwZikgKi8KKwl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwM30sCisKKwkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIExpbmUgSW4gcGluOiBpbnB1dCAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTGluZS0yIEluOiBIZWFkcGhvbmUgb3V0cHV0IChvdXRwdXQgMCAtIDB4MGMpICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCisJeyB9Cit9OworCisvKiBwY20gY29uZmlndXJhdGlvbjogaWRlbnRpYWNhbCB3aXRoIEFMQzg4MCAqLworI2RlZmluZSBhbGM4NjF2ZF9wY21fYW5hbG9nX3BsYXliYWNrCWFsYzg4MF9wY21fYW5hbG9nX3BsYXliYWNrCisjZGVmaW5lIGFsYzg2MXZkX3BjbV9hbmFsb2dfY2FwdHVyZQlhbGM4ODBfcGNtX2FuYWxvZ19jYXB0dXJlCisjZGVmaW5lIGFsYzg2MXZkX3BjbV9kaWdpdGFsX3BsYXliYWNrCWFsYzg4MF9wY21fZGlnaXRhbF9wbGF5YmFjaworI2RlZmluZSBhbGM4NjF2ZF9wY21fZGlnaXRhbF9jYXB0dXJlCWFsYzg4MF9wY21fZGlnaXRhbF9jYXB0dXJlCisKKy8qCisgKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFsYzg2MXZkX21vZGVsc1tBTEM4NjFWRF9NT0RFTF9MQVNUXSA9IHsKKwlbQUxDNjYwVkRfM1NUXQkJPSAiM3N0YWNrLTY2MCIsCisJW0FMQzg2MVZEXzNTVF0JCT0gIjNzdGFjayIsCisJW0FMQzg2MVZEXzNTVF9ESUddCT0gIjNzdGFjay1kaWdvdXQiLAorCVtBTEM4NjFWRF82U1RfRElHXQk9ICI2c3RhY2stZGlnb3V0IiwKKwlbQUxDODYxVkRfQVVUT10JCT0gImF1dG8iLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzg2MXZkX2NmZ190YmxbXSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM5LCAiQXN1cyBHMSIsIEFMQzY2MFZEXzNTVCksCisJU05EX1BDSV9RVUlSSygweDEwZGUsIDB4MDNmMCwgIlJlYWx0ZWsgQUxDNjYwIGRlbW8iLCBBTEM2NjBWRF8zU1QpLAorCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweGE4OGQsICJSZWFsdGVrIEFMQzY2MCBkZW1vIiwgQUxDNjYwVkRfM1NUKSwKKworCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDM4MDIsICJMZW5vdm8gMzAwMCBDMjAwIiwgQUxDODYxVkRfM1NUKSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBhbGNfY29uZmlnX3ByZXNldCBhbGM4NjF2ZF9wcmVzZXRzW10gPSB7CisJW0FMQzY2MFZEXzNTVF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJIGFsYzg2MXZkXzNzdGFja19pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYwdmRfZGFjX25pZHMpLAorCQkuZGFjX25pZHMgPSBhbGM2NjB2ZF9kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODYxdmRfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4NjF2ZF9hZGNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSwKKwl9LAorCVtBTEM4NjFWRF8zU1RdID0geworCQkubWl4ZXJzID0geyBhbGM4NjF2ZF8zc3RfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODYxVkRfM1NUX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCisJCSAJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDODYxVkRfNlNUX0RJR10gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg2MXZkXzZzdF9taXhlciwgYWxjODYxdmRfY2htb2RlX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4NjF2ZF82c3RhY2tfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF82c3RhY2tfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfNnN0YWNrX21vZGVzLAorCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAorCX0sCit9OworCisvKgorICogQklPUyBhdXRvIGNvbmZpZ3VyYXRpb24KKyAqLworc3RhdGljIHZvaWQgYWxjODYxdmRfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJaGRhX25pZF90IG5pZCwgaW50IHBpbl90eXBlLCBpbnQgZGFjX2lkeCkKK3sKKwkvKiBzZXQgYXMgb3V0cHV0ICovCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJCUFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgcGluX3R5cGUpOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKKwkJCQlBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg2MXZkX2F1dG9faW5pdF9tdWx0aV9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IEhEQV9TSURFOyBpKyspIHsKKwkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1tpXTsKKwkJaWYgKG5pZCkKKwkJCWFsYzg2MXZkX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBuaWQsCisJCQkJCQkJCVBJTl9PVVQsIGkpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBhbGM4NjF2ZF9hdXRvX2luaXRfaHBfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWhkYV9uaWRfdCBwaW47CisKKwlwaW4gPSBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF07CisJaWYgKHBpbikgLyogY29ubmVjdCB0byBmcm9udCBhbmQgIHVzZSBkYWMgMCAqLworCQlhbGM4NjF2ZF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgcGluLCBQSU5fSFAsIDApOworfQorCisjZGVmaW5lIGFsYzg2MXZkX2lzX2lucHV0X3BpbihuaWQpCWFsYzg4MF9pc19pbnB1dF9waW4obmlkKQorI2RlZmluZSBBTEM4NjFWRF9QSU5fQ0RfTklECQlBTEM4ODBfUElOX0NEX05JRAorCitzdGF0aWMgdm9pZCBhbGM4NjF2ZF9hdXRvX2luaXRfYW5hbG9nX2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFVVE9fUElOX0xBU1Q7IGkrKykgeworCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5pbnB1dF9waW5zW2ldOworCQlpZiAoYWxjODYxdmRfaXNfaW5wdXRfcGluKG5pZCkpIHsKKwkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKKwkJCQkJQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCQlpIDw9IEFVVE9fUElOX0ZST05UX01JQyA/CisJCQkJCQkJUElOX1ZSRUY4MCA6IFBJTl9JTik7CisJCQlpZiAobmlkICE9IEFMQzg2MVZEX1BJTl9DRF9OSUQpCisJCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJCQkJQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCQkJCUFNUF9PVVRfTVVURSk7CisJCX0KKwl9Cit9CisKKyNkZWZpbmUgYWxjODYxdmRfaWR4X3RvX21peGVyX3ZvbChuaWQpCQkoKG5pZCkgKyAweDAyKQorI2RlZmluZSBhbGM4NjF2ZF9pZHhfdG9fbWl4ZXJfc3dpdGNoKG5pZCkJKChuaWQpICsgMHgwYykKKworLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KKy8qIEJhc2VkIG9uIEFMQzg4MCB2ZXJzaW9uLiBCdXQgQUxDODYxVkQgaGFzIHNlcGFyYXRlLAorICogZGlmZmVyZW50IE5JRHMgZm9yIG11dGUvdW5tdXRlIHN3aXRjaCBhbmQgdm9sdW1lIGNvbnRyb2wgKi8KK3N0YXRpYyBpbnQgYWxjODYxdmRfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IGFsY19zcGVjICpzcGVjLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKK3sKKwljaGFyIG5hbWVbMzJdOworCXN0YXRpYyBjb25zdCBjaGFyICpjaG5hbWVbNF0gPSB7IkZyb250IiwgIlN1cnJvdW5kIiwgIkNMRkUiLCAiU2lkZSJ9OworCWhkYV9uaWRfdCBuaWRfdiwgbmlkX3M7CisJaW50IGksIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7CisJCWlmICghIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKQorCQkJY29udGludWU7CisJCW5pZF92ID0gYWxjODYxdmRfaWR4X3RvX21peGVyX3ZvbCgKKwkJCQlhbGM4ODBfZGFjX3RvX2lkeCgKKwkJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0pKTsKKwkJbmlkX3MgPSBhbGM4NjF2ZF9pZHhfdG9fbWl4ZXJfc3dpdGNoKAorCQkJCWFsYzg4MF9kYWNfdG9faWR4KAorCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSkpOworCisJCWlmIChpID09IDIpIHsKKwkJCS8qIENlbnRlci9MRkUgKi8KKwkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLAorCQkJCQkJIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdiwgMSwKKwkJCQkJCQkwLCBIREFfT1VUUFVUKSkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsCisJCQkJCQkiTEZFIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAyLAorCQkJCQkJCTAsIEhEQV9PVVRQVVQpKSkgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAorCQkJCQkJIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLAorCQkJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfcywgMSwKKwkJCQkJCTIsIEhEQV9JTlBVVCkpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsCisJCQkJCQkiTEZFIFBsYXliYWNrIFN3aXRjaCIsCisJCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAyLAorCQkJCQkJMiwgSERBX0lOUFVUKSkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgeworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKKwkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBuYW1lLAorCQkJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdiwgMywKKwkJCQkJCQkwLCBIREFfT1VUUFVUKSkpIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKKwkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsIG5hbWUsCisJCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAzLAorCQkJCQkJCTIsIEhEQV9JTlBVVCkpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZvciBzcGVha2VyIGFuZCBIUCBvdXRwdXRzICovCisvKiBCYXNlZCBvbiBBTEM4ODAgdmVyc2lvbi4gQnV0IEFMQzg2MVZEIGhhcyBzZXBhcmF0ZSwKKyAqIGRpZmZlcmVudCBOSURzIGZvciBtdXRlL3VubXV0ZSBzd2l0Y2ggYW5kIHZvbHVtZSBjb250cm9sICovCitzdGF0aWMgaW50IGFsYzg2MXZkX2F1dG9fY3JlYXRlX2V4dHJhX291dChzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCisJCQkJCWhkYV9uaWRfdCBwaW4sIGNvbnN0IGNoYXIgKnBmeCkKK3sKKwloZGFfbmlkX3QgbmlkX3YsIG5pZF9zOworCWludCBlcnI7CisJY2hhciBuYW1lWzMyXTsKKworCWlmICghIHBpbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWxjODgwX2lzX2ZpeGVkX3BpbihwaW4pKSB7CisJCW5pZF92ID0gYWxjODgwX2lkeF90b19kYWMoYWxjODgwX2ZpeGVkX3Bpbl9pZHgocGluKSk7CisJCS8qIHNwZWNpZnkgdGhlIERBQyBhcyB0aGUgZXh0cmEgb3V0cHV0ICovCisJCWlmICghIHNwZWMtPm11bHRpb3V0LmhwX25pZCkKKwkJCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IG5pZF92OworCQllbHNlCisJCQlzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdID0gbmlkX3Y7CisJCS8qIGNvbnRyb2wgSFAgdm9sdW1lL3N3aXRjaCBvbiB0aGUgb3V0cHV0IG1peGVyIGFtcCAqLworCQluaWRfdiA9IGFsYzg2MXZkX2lkeF90b19taXhlcl92b2woCisJCQkJYWxjODgwX2ZpeGVkX3Bpbl9pZHgocGluKSk7CisJCW5pZF9zID0gYWxjODYxdmRfaWR4X3RvX21peGVyX3N3aXRjaCgKKwkJCQlhbGM4ODBfZml4ZWRfcGluX2lkeChwaW4pKTsKKworCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBwZngpOworCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgbmFtZSwKKwkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAzLCAwLAorCQkJCQkJCUhEQV9PVVRQVVQpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgcGZ4KTsKKwkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwgbmFtZSwKKwkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAzLCAyLAorCQkJCQkJCUhEQV9JTlBVVCkpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAoYWxjODgwX2lzX211bHRpX3BpbihwaW4pKSB7CisJCS8qIHNldCBtYW51YWwgY29ubmVjdGlvbiAqLworCQkvKiB3ZSBoYXZlIG9ubHkgYSBzd2l0Y2ggb24gSFAtb3V0IFBJTiAqLworCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOworCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIG5hbWUsCisJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsCisJCQkJCQkJSERBX09VVFBVVCkpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogcGFyc2UgdGhlIEJJT1MgY29uZmlndXJhdGlvbiBhbmQgc2V0IHVwIHRoZSBhbGNfc3BlYworICogcmV0dXJuIDEgaWYgc3VjY2Vzc2Z1bCwgMCBpZiB0aGUgcHJvcGVyIGNvbmZpZyBpcyBub3QgZm91bmQsCisgKiBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqIEJhc2VkIG9uIEFMQzg4MCB2ZXJzaW9uIC0gaGFkIHRvIGNoYW5nZSBpdCB0byBvdmVycmlkZQorICogYWxjODgwX2F1dG9fY3JlYXRlX2V4dHJhX291dCBhbmQgYWxjODgwX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzICovCitzdGF0aWMgaW50IGFsYzg2MXZkX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBlcnI7CisJc3RhdGljIGhkYV9uaWRfdCBhbGM4NjF2ZF9pZ25vcmVbXSA9IHsgMHgxZCwgMCB9OworCisJaWYgKChlcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywKKwkJCQkJCWFsYzg2MXZkX2lnbm9yZSkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoISBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cykKKwkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCisKKwlpZiAoKGVyciA9IGFsYzg4MF9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpKSA8IDAgfHwKKwkJKGVyciA9IGFsYzg2MXZkX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsCisJCQkmc3BlYy0+YXV0b2NmZykpIDwgMCB8fAorCQkoZXJyID0gYWxjODYxdmRfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHNwZWMsCisJCQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwgIlNwZWFrZXIiKSkgPCAwIHx8CisJCShlcnIgPSBhbGM4NjF2ZF9hdXRvX2NyZWF0ZV9leHRyYV9vdXQoc3BlYywKKwkJCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwgIkhlYWRwaG9uZSIpKSA8IDAgfHwKKwkJKGVyciA9IGFsYzg4MF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzcGVjLAorCQkJJnNwZWMtPmF1dG9jZmcpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7CisKKwlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0X3BpbikKKwkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBBTEM4NjFWRF9ESUdPVVRfTklEOworCisJaWYgKHNwZWMtPmtjdGxfYWxsb2MpCisJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzKytdID0gc3BlYy0+a2N0bF9hbGxvYzsKKworCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2luaXRfdmVyYnMrK10KKwkJPSBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJiczsKKworCXNwZWMtPm51bV9tdXhfZGVmcyA9IDE7CisJc3BlYy0+aW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eDsKKworCXJldHVybiAxOworfQorCisvKiBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGZvciBhdXRvLWNvbmZpZ3VyYXRpb24gbW9kZWwgKi8KK3N0YXRpYyB2b2lkIGFsYzg2MXZkX2F1dG9faW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlhbGM4NjF2ZF9hdXRvX2luaXRfbXVsdGlfb3V0KGNvZGVjKTsKKwlhbGM4NjF2ZF9hdXRvX2luaXRfaHBfb3V0KGNvZGVjKTsKKwlhbGM4NjF2ZF9hdXRvX2luaXRfYW5hbG9nX2lucHV0KGNvZGVjKTsKK30KKworc3RhdGljIGludCBwYXRjaF9hbGM4NjF2ZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWM7CisJaW50IGVyciwgYm9hcmRfY29uZmlnOworCisJc3BlYyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb2RlYy0+c3BlYyA9IHNwZWM7CisKKwlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODYxVkRfTU9ERUxfTEFTVCwKKwkJCQkJCSAgYWxjODYxdmRfbW9kZWxzLAorCQkJCQkJICBhbGM4NjF2ZF9jZmdfdGJsKTsKKworCWlmIChib2FyZF9jb25maWcgPCAwIHx8IGJvYXJkX2NvbmZpZyA+PSBBTEM4NjFWRF9NT0RFTF9MQVNUKSB7CisJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgQUxDNjYwVkQvIgorCQkJIkFMQzg2MVZELCB0cnlpbmcgYXV0by1wcm9iZSBmcm9tIEJJT1MuLi5cbiIpOworCQlib2FyZF9jb25maWcgPSBBTEM4NjFWRF9BVVRPOworCX0KKworCWlmIChib2FyZF9jb25maWcgPT0gQUxDODYxVkRfQVVUTykgeworCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KKwkJZXJyID0gYWxjODYxdmRfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJYWxjX2ZyZWUoY29kZWMpOworCQkJcmV0dXJuIGVycjsKKwkJfSBlbHNlIGlmICghIGVycikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCisJCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7CisJCQlib2FyZF9jb25maWcgPSBBTEM4NjFWRF8zU1Q7CisJCX0KKwl9CisKKwlpZiAoYm9hcmRfY29uZmlnICE9IEFMQzg2MVZEX0FVVE8pCisJCXNldHVwX3ByZXNldChzcGVjLCAmYWxjODYxdmRfcHJlc2V0c1tib2FyZF9jb25maWddKTsKKworCXNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyA9ICJBTEM4NjFWRCBBbmFsb2ciOworCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmYWxjODYxdmRfcGNtX2FuYWxvZ19wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmYWxjODYxdmRfcGNtX2FuYWxvZ19jYXB0dXJlOworCisJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJBTEM4NjFWRCBEaWdpdGFsIjsKKwlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZhbGM4NjF2ZF9wY21fZGlnaXRhbF9wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJmFsYzg2MXZkX3BjbV9kaWdpdGFsX2NhcHR1cmU7CisKKwlzcGVjLT5hZGNfbmlkcyA9IGFsYzg2MXZkX2FkY19uaWRzOworCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODYxdmRfYWRjX25pZHMpOworCisJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gYWxjODYxdmRfY2FwdHVyZV9taXhlcjsKKwlzcGVjLT5udW1fbWl4ZXJzKys7CisKKwljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKKworCWlmIChib2FyZF9jb25maWcgPT0gQUxDODYxVkRfQVVUTykKKwkJc3BlYy0+aW5pdF9ob29rID0gYWxjODYxdmRfYXV0b19pbml0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBwYXRjaCBlbnRyaWVzCiAgKi8KIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X3JlYWx0ZWtbXSA9IHsKIAl7IC5pZCA9IDB4MTBlYzAyNjAsIC5uYW1lID0gIkFMQzI2MCIsIC5wYXRjaCA9IHBhdGNoX2FsYzI2MCB9LAogCXsgLmlkID0gMHgxMGVjMDI2MiwgLm5hbWUgPSAiQUxDMjYyIiwgLnBhdGNoID0gcGF0Y2hfYWxjMjYyIH0sCi0gCXsgLmlkID0gMHgxMGVjMDg4MCwgLm5hbWUgPSAiQUxDODgwIiwgLnBhdGNoID0gcGF0Y2hfYWxjODgwIH0sCisJeyAuaWQgPSAweDEwZWMwODYxLCAucmV2ID0gMHgxMDAzNDAsIC5uYW1lID0gIkFMQzY2MCIsCisJCS5wYXRjaCA9IHBhdGNoX2FsYzg2MSB9LAorCXsgLmlkID0gMHgxMGVjMDY2MCwgLm5hbWUgPSAiQUxDNjYwLVZEIiwgLnBhdGNoID0gcGF0Y2hfYWxjODYxdmQgfSwKKwl7IC5pZCA9IDB4MTBlYzA4NjEsIC5uYW1lID0gIkFMQzg2MSIsIC5wYXRjaCA9IHBhdGNoX2FsYzg2MSB9LAorCXsgLmlkID0gMHgxMGVjMDg2MiwgLm5hbWUgPSAiQUxDODYxLVZEIiwgLnBhdGNoID0gcGF0Y2hfYWxjODYxdmQgfSwKKwl7IC5pZCA9IDB4MTBlYzA4ODAsIC5uYW1lID0gIkFMQzg4MCIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MCB9LAogCXsgLmlkID0gMHgxMGVjMDg4MiwgLm5hbWUgPSAiQUxDODgyIiwgLnBhdGNoID0gcGF0Y2hfYWxjODgyIH0sCiAJeyAuaWQgPSAweDEwZWMwODgzLCAubmFtZSA9ICJBTEM4ODMiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODMgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODUsIC5uYW1lID0gIkFMQzg4NSIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MiB9LAogCXsgLmlkID0gMHgxMGVjMDg4OCwgLm5hbWUgPSAiQUxDODg4IiwgLnBhdGNoID0gcGF0Y2hfYWxjODgzIH0sCi0JeyAuaWQgPSAweDEwZWMwODYxLCAucmV2ID0gMHgxMDAzMDAsIC5uYW1lID0gIkFMQzg2MSIsCi0JICAucGF0Y2ggPSBwYXRjaF9hbGM4NjEgfSwKLSAgICAgICAgeyAuaWQgPSAweDEwZWMwODYxLCAucmV2ID0gMHgxMDAzNDAsIC5uYW1lID0gIkFMQzY2MCIsCi0JICAucGF0Y2ggPSBwYXRjaF9hbGM4NjEgfSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IGZlNTFlZjMuLjZmNGEzOTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTM3LDE0ICszNywzNyBAQAogI2RlZmluZSBOVU1fQ09OVFJPTF9BTExPQwkzMgogI2RlZmluZSBTVEFDX0hQX0VWRU5UCQkweDM3CiAKLSNkZWZpbmUgU1RBQ19SRUYJCTAKLSNkZWZpbmUgU1RBQ19EOTQ1R1RQMwkJMQotI2RlZmluZSBTVEFDX0Q5NDVHVFA1CQkyCi0jZGVmaW5lIFNUQUNfTUFDTUlOSQkJMwotI2RlZmluZSBTVEFDXzkyMlhfTU9ERUxTCTQJLyogbnVtYmVyIG9mIDkyMnggbW9kZWxzICovCi0jZGVmaW5lIFNUQUNfRDk2NV8zU1QJCTQKLSNkZWZpbmUgU1RBQ19EOTY1XzVTVAkJNQotI2RlZmluZSBTVEFDXzkyN1hfTU9ERUxTCTYJLyogbnVtYmVyIG9mIDkyMnggbW9kZWxzICovCitlbnVtIHsKKwlTVEFDX1JFRiwKKwlTVEFDXzkyMDBfTU9ERUxTCit9OworCitlbnVtIHsKKwlTVEFDXzkyMDVfUkVGLAorCVNUQUNfOTIwNV9NT0RFTFMKK307CisKK2VudW0geworCVNUQUNfOTI1eF9SRUYsCisJU1RBQ19NMl8yLAorCVNUQUNfTUE2LAorCVNUQUNfOTI1eF9NT0RFTFMKK307CisKK2VudW0geworCVNUQUNfRDk0NV9SRUYsCisJU1RBQ19EOTQ1R1RQMywKKwlTVEFDX0Q5NDVHVFA1LAorCVNUQUNfTUFDTUlOSSwKKwlTVEFDXzkyMlhfTU9ERUxTCit9OworCitlbnVtIHsKKwlTVEFDX0Q5NjVfUkVGLAorCVNUQUNfRDk2NV8zU1QsCisJU1RBQ19EOTY1XzVTVCwKKwlTVEFDXzkyN1hfTU9ERUxTCit9OwogCiBzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyB7CiAJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm1peGVyc1s0XTsKQEAgLTY3LDYgKzkwLDkgQEAKIAl1bnNpZ25lZCBpbnQgbnVtX2FkY3M7CiAJaGRhX25pZF90ICptdXhfbmlkczsKIAl1bnNpZ25lZCBpbnQgbnVtX211eGVzOworCWhkYV9uaWRfdCAqZG1pY19uaWRzOworCXVuc2lnbmVkIGludCBudW1fZG1pY3M7CisJaGRhX25pZF90IGRtdXhfbmlkOwogCWhkYV9uaWRfdCBkaWdfaW5fbmlkOwogCiAJLyogcGluIHdpZGdldHMgKi8KQEAgLTgwLDYgKzEwNiw4IEBACiAJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm1peGVyOwogCiAJLyogY2FwdHVyZSBzb3VyY2UgKi8KKwlzdHJ1Y3QgaGRhX2lucHV0X211eCAqZGlucHV0X211eDsKKwl1bnNpZ25lZCBpbnQgY3VyX2RtdXg7CiAJc3RydWN0IGhkYV9pbnB1dF9tdXggKmlucHV0X211eDsKIAl1bnNpZ25lZCBpbnQgY3VyX211eFszXTsKIApAQCAtOTIsNiArMTIwLDcgQEAKIAlzdHJ1Y3QgYXV0b19waW5fY2ZnIGF1dG9jZmc7CiAJdW5zaWduZWQgaW50IG51bV9rY3RsX2FsbG9jLCBudW1fa2N0bF91c2VkOwogCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY3RsX2FsbG9jOworCXN0cnVjdCBoZGFfaW5wdXRfbXV4IHByaXZhdGVfZGltdXg7CiAJc3RydWN0IGhkYV9pbnB1dF9tdXggcHJpdmF0ZV9pbXV4OwogfTsKIApAQCAtMTA3LDYgKzEzNiwxOCBAQAogICAgICAgICAweDAyLAogfTsKIAorc3RhdGljIGhkYV9uaWRfdCBzdGFjOTI1eF9hZGNfbmlkc1sxXSA9IHsKKyAgICAgICAgMHgwMywKK307CisKK3N0YXRpYyBoZGFfbmlkX3Qgc3RhYzkyNXhfbXV4X25pZHNbMV0gPSB7CisgICAgICAgIDB4MGYsCit9OworCitzdGF0aWMgaGRhX25pZF90IHN0YWM5MjV4X2RhY19uaWRzWzFdID0geworICAgICAgICAweDAyLAorfTsKKwogc3RhdGljIGhkYV9uaWRfdCBzdGFjOTIyeF9hZGNfbmlkc1syXSA9IHsKICAgICAgICAgMHgwNiwgMHgwNywKIH07CkBAIC0xMzEsMTEgKzE3MiwyMCBAQAogICAgICAgICAweDE5LCAweDFhCiB9OwogCitzdGF0aWMgaGRhX25pZF90IHN0YWM5MjA1X2RtaWNfbmlkc1szXSA9IHsKKyAgICAgICAgMHgxNywgMHgxOCwgMAorfTsKKwogc3RhdGljIGhkYV9uaWRfdCBzdGFjOTIwMF9waW5fbmlkc1s4XSA9IHsKIAkweDA4LCAweDA5LCAweDBkLCAweDBlLCAKIAkweDBmLCAweDEwLCAweDExLCAweDEyLAogfTsKIAorc3RhdGljIGhkYV9uaWRfdCBzdGFjOTI1eF9waW5fbmlkc1s4XSA9IHsKKwkweDA3LCAweDA4LCAweDBhLCAweDBiLCAKKwkweDBjLCAweDBkLCAweDEwLCAweDExLAorfTsKKwogc3RhdGljIGhkYV9uaWRfdCBzdGFjOTIyeF9waW5fbmlkc1sxMF0gPSB7CiAJMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwKIAkweDBmLCAweDEwLCAweDExLCAweDE1LCAweDFiLApAQCAtMTU0LDYgKzIwNCwzNCBAQAogCQogfTsKIAorc3RhdGljIGludCBzdGFjOTJ4eF9kbXV4X2VudW1faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X2luZm8oc3BlYy0+ZGlucHV0X211eCwgdWluZm8pOworfQorCitzdGF0aWMgaW50IHN0YWM5Mnh4X2RtdXhfZW51bV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHNwZWMtPmN1cl9kbXV4OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5Mnh4X2RtdXhfZW51bV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X3B1dChjb2RlYywgc3BlYy0+ZGlucHV0X211eCwgdWNvbnRyb2wsCisJCQkJICAgICBzcGVjLT5kbXV4X25pZCwgJnNwZWMtPmN1cl9kbXV4KTsKK30KKwogc3RhdGljIGludCBzdGFjOTJ4eF9tdXhfZW51bV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwpAQCAtMTg3LDYgKzI2NSwxMiBAQAogCXt9CiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIHN0YWM5MjV4X2NvcmVfaW5pdFtdID0geworCS8qIHNldCBkYWMwbXV4IGZvciBkYWMgY29udmVydGVyICovCisJeyAweDA2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJe30KK307CisKIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgc3RhYzkyMnhfY29yZV9pbml0W10gPSB7CiAJLyogc2V0IG1hc3RlciB2b2x1bWUgYW5kIGRpcmVjdCBjb250cm9sICovCQogCXsgMHgxNiwgQUNfVkVSQl9TRVRfVk9MVU1FX0tOT0JfQ09OVFJPTCwgMHhmZn0sCkBAIC0yMzIsNiArMzE2LDIzIEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0YWM5MjV4X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4ZSwgMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAweGUsIDAsIEhEQV9PVVRQVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gc3RhYzkyeHhfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IHN0YWM5Mnh4X211eF9lbnVtX2dldCwKKwkJLnB1dCA9IHN0YWM5Mnh4X211eF9lbnVtX3B1dCwKKwl9LAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOSwgMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOSwgMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBNdXggVm9sdW1lIiwgMHgwZiwgMCwgSERBX09VVFBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKwogLyogVGhpcyBuZWVkcyB0byBiZSBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gc2VxdWVuY2UgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGFjOTIyeF9taXhlcltdID0gewogCXsKQEAgLTI2Myw3ICszNjQsNyBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKLXN0YXRpYyBzbmRfa2NvbnRyb2xfbmV3X3Qgc3RhYzkyN3hfbWl4ZXJbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGFjOTI3eF9taXhlcltdID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCkBAIC0yNzgsNyArMzc5LDE1IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAotc3RhdGljIHNuZF9rY29udHJvbF9uZXdfdCBzdGFjOTIwNV9taXhlcltdID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0YWM5MjA1X21peGVyW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiRGlnaXRhbCBJbnB1dCBTb3VyY2UiLAorCQkuY291bnQgPSAxLAorCQkuaW5mbyA9IHN0YWM5Mnh4X2RtdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gc3RhYzkyeHhfZG11eF9lbnVtX2dldCwKKwkJLnB1dCA9IHN0YWM5Mnh4X2RtdXhfZW51bV9wdXQsCisJfSwKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLApAQCAtMzI3LDIyICs0MzYsNjQgQEAKIAkweDAyYTE5MDIwLCAweDAxYTE5MDIxLCAweDkwMTAwMTQwLCAweDAxODEzMTIyLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCAqc3RhYzkyMDBfYnJkX3RibFtdID0gewotCXJlZjkyMDBfcGluX2NvbmZpZ3MsCitzdGF0aWMgdW5zaWduZWQgaW50ICpzdGFjOTIwMF9icmRfdGJsW1NUQUNfOTIwMF9NT0RFTFNdID0geworCVtTVEFDX1JFRl0gPSByZWY5MjAwX3Bpbl9jb25maWdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnIHN0YWM5MjAwX2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAicmVmIiwKLQkgIC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyNjY4LAkvKiBERkkgTGFuUGFydHkgKi8KLQkgIC5jb25maWcgPSBTVEFDX1JFRiB9LAorc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5MjAwX21vZGVsc1tTVEFDXzkyMDBfTU9ERUxTXSA9IHsKKwlbU1RBQ19SRUZdID0gInJlZiIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgc3RhYzkyMDBfY2ZnX3RibFtdID0geworCS8qIFNpZ21hVGVsIHJlZmVyZW5jZSBib2FyZCAqLworCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNjY4LAorCQkgICAgICAiREZJIExhblBhcnR5IiwgU1RBQ19SRUYpLAogCS8qIERlbGwgbGFwdG9wcyBoYXZlIEJJT1MgcHJvYmxlbSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0RFTEwsIC5wY2lfc3ViZGV2aWNlID0gMHgwMWI1LAotCSAgLmNvbmZpZyA9IFNUQUNfUkVGIH0sCS8qIERlbGwgSW5zcGlyb24gNjMwbSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0RFTEwsIC5wY2lfc3ViZGV2aWNlID0gMHgwMWMyLAotCSAgLmNvbmZpZyA9IFNUQUNfUkVGIH0sCS8qIERlbGwgTGF0aXR1ZGUgRDYyMCAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0RFTEwsIC5wY2lfc3ViZGV2aWNlID0gMHgwMWNiLAotCSAgLmNvbmZpZyA9IFNUQUNfUkVGIH0sCS8qIERlbGwgTGF0aXR1ZGUgMTIwTCAqLworCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAxYjUsCisJCSAgICAgICJEZWxsIEluc3Bpcm9uIDYzMG0iLCBTVEFDX1JFRiksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDFjMiwKKwkJICAgICAgIkRlbGwgTGF0aXR1ZGUgRDYyMCIsIFNUQUNfUkVGKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMWNiLAorCQkgICAgICAiRGVsbCBMYXRpdHVkZSAxMjBMIiwgU1RBQ19SRUYpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAxY2MsCisJCSAgICAgICJEZWxsIExhdGl0dWRlIEQ4MjAiLCBTVEFDX1JFRiksCisJe30gLyogdGVybWluYXRvciAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByZWY5MjV4X3Bpbl9jb25maWdzWzhdID0geworCTB4NDBjMDAzZjAsIDB4NDI0NTAzZjIsIDB4MDE4MTMwMjIsIDB4MDJhMTkwMjEsCisJMHg5MGE3MDMyMCwgMHgwMjIxNDIxMCwgMHg0MDAwMDNmMSwgMHg5MDMzMDMyZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhYzkyNXhfTUE2X3Bpbl9jb25maWdzWzhdID0geworCTB4NDBjMDAzZjAsIDB4NDI0NTAzZjIsIDB4MDE4MTMwMjIsIDB4MDJhMTkwMjEsCisJMHg5MGE3MDMyMCwgMHg5MDEwMDIxMSwgMHg0MDAwMDNmMSwgMHg5MDMzMDMyZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhYzkyNXhNMl8yX3Bpbl9jb25maWdzWzhdID0geworCTB4NDBjMDAzZjMsIDB4NDI0NTAzZjIsIDB4MDQxODAwZjQsIDB4MDJhMTkwMjAsCisJMHg1MGExMDNGMCwgMHg5MDEwMDIxMCwgMHg0MDAwMDNmMSwgMHg5MDMzMDMyZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgKnN0YWM5MjV4X2JyZF90YmxbU1RBQ185MjV4X01PREVMU10gPSB7CisJW1NUQUNfUkVGXSA9IHJlZjkyNXhfcGluX2NvbmZpZ3MsCisJW1NUQUNfTTJfMl0gPSBzdGFjOTI1eE0yXzJfcGluX2NvbmZpZ3MsCisJW1NUQUNfTUE2XSA9IHN0YWM5MjV4X01BNl9waW5fY29uZmlncywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpzdGFjOTI1eF9tb2RlbHNbU1RBQ185MjV4X01PREVMU10gPSB7CisJW1NUQUNfUkVGXSA9ICJyZWYiLAorCVtTVEFDX00yXzJdID0gIm0yLTIiLAorCVtTVEFDX01BNl0gPSAibTYiLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIHN0YWM5MjV4X2NmZ190YmxbXSA9IHsKKwkvKiBTaWdtYVRlbCByZWZlcmVuY2UgYm9hcmQgKi8KKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjY2OCwgIkRGSSBMYW5QYXJ0eSIsIFNUQUNfUkVGKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3YiwgMHgwMzE2LCAiR2F0ZXdheSBNMjU1IiwgU1RBQ19SRUYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDAzNjYsICJHYXRld2F5IE1QNjk1NCIsIFNUQUNfUkVGKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3YiwgMHgwNDYxLCAiR2F0ZXdheSBOWDU2MFhMIiwgU1RBQ19NQTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDAyLCAweDQzN2IsICJHYXRld2F5IE1YNjQ1MyIsIFNUQUNfTTJfMiksCiAJe30gLyogdGVybWluYXRvciAqLwogfTsKIApAQCAtMzY1LDEwMCArNTE2LDgwIEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50ICpzdGFjOTIyeF9icmRfdGJsW1NUQUNfOTIyWF9NT0RFTFNdID0gewotCVtTVEFDX1JFRl0gPQlyZWY5MjJ4X3Bpbl9jb25maWdzLAorCVtTVEFDX0Q5NDVfUkVGXSA9IHJlZjkyMnhfcGluX2NvbmZpZ3MsCiAJW1NUQUNfRDk0NUdUUDNdID0gZDk0NWd0cDNfcGluX2NvbmZpZ3MsCiAJW1NUQUNfRDk0NUdUUDVdID0gZDk0NWd0cDVfcGluX2NvbmZpZ3MsCiAJW1NUQUNfTUFDTUlOSV0gPSBkOTQ1Z3RwNV9waW5fY29uZmlncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBzdGFjOTIyeF9jZmdfdGJsW10gPSB7Ci0JeyAubW9kZWxuYW1lID0gIjVzdGFjayIsIC5jb25maWcgPSBTVEFDX0Q5NDVHVFA1IH0sCi0JeyAubW9kZWxuYW1lID0gIjNzdGFjayIsIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCi0JeyAubW9kZWxuYW1lID0gInJlZiIsCi0JICAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjY2OCwJLyogREZJIExhblBhcnR5ICovCi0JICAuY29uZmlnID0gU1RBQ19SRUYgfSwJCS8qIFNpZ21hVGVsIHJlZmVyZW5jZSBib2FyZCAqLwotICAgICAgICAgLyogSW50ZWwgOTQ1RyBiYXNlZCBzeXN0ZW1zICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MDEwMSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHVFAgLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MDIwMiwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHTlQgLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MDYwNiwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHVFAgLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MDYwMSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHVFAgLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MDExMSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHWlAgLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MTExNSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHUE0gLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MTExNiwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHQk8gLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MTExNywKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHUE0gLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MTExOCwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHUE0gLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MTExOSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHUE0gLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4ODgyNiwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHUE0gLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4NTA0OSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHQ1ogLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4NTA1NSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHQ1ogLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4NTA0OCwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHUEIgLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MDExMCwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFAzIH0sCS8qIEludGVsIEQ5NDVHTFIgLSAzIFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MDQwNCwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFA1IH0sCS8qIEludGVsIEQ5NDVHVFAgLSA1IFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MDMwMywKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFA1IH0sCS8qIEludGVsIEQ5NDVHTlQgLSA1IFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MDAxMywKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFA1IH0sCS8qIEludGVsIEQ5NTVYQksgLSA1IFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MDQxNywKLQkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFA1IH0sCS8qIEludGVsIEQ5NzVYQksgLSA1IFN0YWNrICovCi0JICAvKiBJbnRlbCA5NDVQIGJhc2VkIHN5c3RlbXMgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwYjBiLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NVBTTiAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwMTEyLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NVBMTiAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwZDBkLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NVBMTSAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwOTA5LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NVBBVyAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwNTA1LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDMgfSwJLyogSW50ZWwgRDk0NVBMTSAtIDMgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgwNzA3LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk0NUdUUDUgfSwJLyogSW50ZWwgRDk0NVBTViAtIDUgU3RhY2sgKi8KLQkgIC8qIG90aGVyIHN5c3RlbXMgICovCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4ODM4NCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHg3NjgwLAotCSAgLmNvbmZpZyA9IFNUQUNfTUFDTUlOSSB9LAkvKiBBcHBsZSBNYWMgTWluaSAoZWFybHkgMjAwNikgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzdGFjOTIyeF9tb2RlbHNbU1RBQ185MjJYX01PREVMU10gPSB7CisJW1NUQUNfRDk0NV9SRUZdCT0gInJlZiIsCisJW1NUQUNfRDk0NUdUUDVdCT0gIjVzdGFjayIsCisJW1NUQUNfRDk0NUdUUDNdCT0gIjNzdGFjayIsCisJW1NUQUNfTUFDTUlOSV0JPSAibWFjbWluaSIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgc3RhYzkyMnhfY2ZnX3RibFtdID0geworCS8qIFNpZ21hVGVsIHJlZmVyZW5jZSBib2FyZCAqLworCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNjY4LAorCQkgICAgICAiREZJIExhblBhcnR5IiwgU1RBQ19EOTQ1X1JFRiksCisJLyogSW50ZWwgOTQ1RyBiYXNlZCBzeXN0ZW1zICovCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDAxMDEsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwMjAyLAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDYwNiwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDA2MDEsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwMTExLAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTExNSwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDExMTYsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMTE3LAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTExOCwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDExMTksCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg4ODI2LAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NTA0OSwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDUwNTUsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg1MDQ4LAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDExMCwKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQMyksCisJLyogSW50ZWwgRDk0NUcgNS1zdGFjayBzeXN0ZW1zICovCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDA0MDQsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDUpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwMzAzLAorCQkgICAgICAiSW50ZWwgRDk0NUciLCBTVEFDX0Q5NDVHVFA1KSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDAxMywKKwkJICAgICAgIkludGVsIEQ5NDVHIiwgU1RBQ19EOTQ1R1RQNSksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDA0MTcsCisJCSAgICAgICJJbnRlbCBEOTQ1RyIsIFNUQUNfRDk0NUdUUDUpLAorCS8qIEludGVsIDk0NVAgYmFzZWQgc3lzdGVtcyAqLworCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwYjBiLAorCQkgICAgICAiSW50ZWwgRDk0NVAiLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDExMiwKKwkJICAgICAgIkludGVsIEQ5NDVQIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDBkMGQsCisJCSAgICAgICJJbnRlbCBEOTQ1UCIsIFNUQUNfRDk0NUdUUDMpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwOTA5LAorCQkgICAgICAiSW50ZWwgRDk0NVAiLCBTVEFDX0Q5NDVHVFAzKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MDUwNSwKKwkJICAgICAgIkludGVsIEQ5NDVQIiwgU1RBQ19EOTQ1R1RQMyksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDA3MDcsCisJCSAgICAgICJJbnRlbCBEOTQ1UCIsIFNUQUNfRDk0NUdUUDUpLAorCS8qIG90aGVyIHN5c3RlbXMgICovCisJLyogQXBwbGUgTWFjIE1pbmkgKGVhcmx5IDIwMDYpICovCisJU05EX1BDSV9RVUlSSygweDgzODQsIDB4NzY4MCwKKwkJICAgICAgIk1hYyBNaW5pIiwgU1RBQ19NQUNNSU5JKSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCkBAIC00ODQsMTIwICs2MTUsNzIgQEAKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgKnN0YWM5Mjd4X2JyZF90YmxbU1RBQ185MjdYX01PREVMU10gPSB7Ci0JW1NUQUNfUkVGXSA9CXJlZjkyN3hfcGluX2NvbmZpZ3MsCisJW1NUQUNfRDk2NV9SRUZdID0gcmVmOTI3eF9waW5fY29uZmlncywKIAlbU1RBQ19EOTY1XzNTVF0gPSBkOTY1XzNzdF9waW5fY29uZmlncywKIAlbU1RBQ19EOTY1XzVTVF0gPSBkOTY1XzVzdF9waW5fY29uZmlncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBzdGFjOTI3eF9jZmdfdGJsW10gPSB7Ci0JeyAubW9kZWxuYW1lID0gIjVzdGFjayIsIC5jb25maWcgPSBTVEFDX0Q5NjVfNVNUIH0sCi0JeyAubW9kZWxuYW1lID0gIjNzdGFjayIsIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sCi0JeyAubW9kZWxuYW1lID0gInJlZiIsCi0JICAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjY2OCwJLyogREZJIExhblBhcnR5ICovCi0JICAuY29uZmlnID0gU1RBQ19SRUYgfSwJCS8qIFNpZ21hVGVsIHJlZmVyZW5jZSBib2FyZCAqLworc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5Mjd4X21vZGVsc1tTVEFDXzkyN1hfTU9ERUxTXSA9IHsKKwlbU1RBQ19EOTY1X1JFRl0JPSAicmVmIiwKKwlbU1RBQ19EOTY1XzNTVF0JPSAiM3N0YWNrIiwKKwlbU1RBQ19EOTY1XzVTVF0gPSAiNXN0YWNrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBzdGFjOTI3eF9jZmdfdGJsW10gPSB7CisJLyogU2lnbWFUZWwgcmVmZXJlbmNlIGJvYXJkICovCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI2NjgsCisJCSAgICAgICJERkkgTGFuUGFydHkiLCBTVEFDX0Q5NjVfUkVGKSwKIAkgLyogSW50ZWwgOTQ2IGJhc2VkIHN5c3RlbXMgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgzZDAxLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogRDk0NiAgY29uZmlndXJhdGlvbiAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweGEzMDEsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBEOTQ2R1pUIC0gMyBzdGFjayAgKi8KKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4M2QwMSwgIkludGVsIEQ5NDYiLCBTVEFDX0Q5NjVfM1NUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4YTMwMSwgIkludGVsIEQ5NDYiLCBTVEFDX0Q5NjVfM1NUKSwKIAkvKiA5NjUgYmFzZWQgMyBzdGFjayBzeXN0ZW1zICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjExNiwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIEQ5NjUgM1N0YWNrIGNvbmZpZyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIxMTUsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBEUTk2NVdDIC0gMyBTdGFjayAgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMTE0LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRDk2NSAzU3RhY2sgY29uZmlnICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjExMywKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIEQ5NjUgM1N0YWNrIGNvbmZpZyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIxMTIsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBERzk2NU1TIC0gMyBTdGFjayAgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMTExLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRDk2NSAzU3RhY2sgY29uZmlnICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjExMCwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIEQ5NjUgM1N0YWNrIGNvbmZpZyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIwMDksCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBEOTY1IDNTdGFjayBjb25maWcgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMDA4LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRFE5NjVHRiAtIDMgU3RhY2sgICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjAwNywKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIEQ5NjUgM1N0YWNrIGNvbmZpZyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIwMDYsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBEOTY1IDNTdGFjayBjb25maWcgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMDA1LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRDk2NSAzU3RhY2sgY29uZmlnICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjAwNCwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIEQ5NjUgM1N0YWNrIGNvbmZpZyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIwMDMsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzNTVCB9LCAvKiBJbnRlbCBEOTY1IDNTdGFjayBjb25maWcgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMDAyLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV8zU1QgfSwgLyogSW50ZWwgRDk2NSAzU3RhY2sgY29uZmlnICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjAwMSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfM1NUIH0sIC8qIEludGVsIERROTY1R0YgLSAzIFN0YWNrICovCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIxMTYsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIxMTUsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIxMTQsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIxMTMsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIxMTIsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIxMTEsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIxMTAsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMDksICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMDgsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMDcsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMDYsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMDUsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMDQsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMDMsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMDIsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCisJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMDEsICJJbnRlbCBEOTY1IiwgU1RBQ19EOTY1XzNTVCksCiAJLyogOTY1IGJhc2VkIDUgc3RhY2sgc3lzdGVtcyAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIzMDEsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzVTVCB9LCAvKiBJbnRlbCBERzk2NSAtIDUgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMzAyLAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV81U1QgfSwgLyogSW50ZWwgREc5NjUgLSA1IFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjMwMywKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfNVNUIH0sIC8qIEludGVsIERHOTY1IC0gNSBTdGFjayAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDIzMDQsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzVTVCB9LCAvKiBJbnRlbCBERzk2NSAtIDUgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyMzA1LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV81U1QgfSwgLyogSW50ZWwgREc5NjUgLSA1IFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjUwMSwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfNVNUIH0sIC8qIEludGVsIERHOTY1TVEgLSA1IFN0YWNrICovCi0JeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JICAucGNpX3N1YmRldmljZSA9IDB4MjUwMiwKLQkgIC5jb25maWcgPSBTVEFDX0Q5NjVfNVNUIH0sIC8qIEludGVsIERHOTY1IC0gNSBTdGFjayAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCSAgLnBjaV9zdWJkZXZpY2UgPSAweDI1MDMsCi0JICAuY29uZmlnID0gU1RBQ19EOTY1XzVTVCB9LCAvKiBJbnRlbCBERzk2NSAtIDUgU3RhY2sgKi8KLQl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyNTA0LAotCSAgLmNvbmZpZyA9IFNUQUNfRDk2NV81U1QgfSwgLyogSW50ZWwgRFE5NjVHRiAtIDUgU3RhY2sgKi8KKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjMwMSwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfNVNUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjMwMiwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfNVNUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjMwMywgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfNVNUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjMwNCwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfNVNUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjMwNSwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfNVNUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjUwMSwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfNVNUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjUwMiwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfNVNUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjUwMywgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfNVNUKSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjUwNCwgIkludGVsIEQ5NjUiLCBTVEFDX0Q5NjVfNVNUKSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHJlZjkyMDVfcGluX2NvbmZpZ3NbMTJdID0gewogCTB4NDAwMDAxMDAsIDB4NDAwMDAxMDAsIDB4MDEwMTYwMTEsIDB4MDEwMTQwMTAsCi0JMHgwMTgxMzEyMiwgMHgwMWExOTAyMSwgMHg0MDAwMDEwMCwgMHg0MDAwMDEwMCwgCi0JMHg0MDAwMDEwMCwgMHg0MDAwMDEwMCwgMHgwMTQ0MTAzMCwgMHgwMWM0MTAzMAorCTB4MDE4MTMxMjIsIDB4MDFhMTkwMjEsIDB4NDAwMDAxMDAsIDB4NDAwMDAxMDAsCisJMHg5MGEwMDBmMCwgMHg5MGEwMDBmMCwgMHgwMTQ0MTAzMCwgMHgwMWM0MTAzMAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCAqc3RhYzkyMDVfYnJkX3RibFtdID0geworc3RhdGljIHVuc2lnbmVkIGludCAqc3RhYzkyMDVfYnJkX3RibFtTVEFDXzkyMDVfTU9ERUxTXSA9IHsKIAlyZWY5MjA1X3Bpbl9jb25maWdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnIHN0YWM5MjA1X2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAicmVmIiwKLQkgIC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkgIC5wY2lfc3ViZGV2aWNlID0gMHgyNjY4LAkvKiBERkkgTGFuUGFydHkgKi8KLQkgIC5jb25maWcgPSBTVEFDX1JFRiB9LAkJLyogU2lnbWFUZWwgcmVmZXJlbmNlIGJvYXJkICovCitzdGF0aWMgY29uc3QgY2hhciAqc3RhYzkyMDVfbW9kZWxzW1NUQUNfOTIwNV9NT0RFTFNdID0geworCVtTVEFDXzkyMDVfUkVGXSA9ICJyZWYiLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIHN0YWM5MjA1X2NmZ190YmxbXSA9IHsKKwkvKiBTaWdtYVRlbCByZWZlcmVuY2UgYm9hcmQgKi8KKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjY2OCwKKwkJICAgICAgIkRGSSBMYW5QYXJ0eSIsIFNUQUNfOTIwNV9SRUYpLAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKQEAgLTExNTQsNiArMTIzNyw1OCBAQAogCXJldHVybiAwOwogfQogCisvKiBsYWJlbHMgZm9yIGRtaWMgbXV4IGlucHV0cyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5Mnh4X2RtaWNfbGFiZWxzWzVdID0geworCSJBbmFsb2cgSW5wdXRzIiwgIkRpZ2l0YWwgTWljIDEiLCAiRGlnaXRhbCBNaWMgMiIsCisJIkRpZ2l0YWwgTWljIDMiLCAiRGlnaXRhbCBNaWMgNCIKK307CisKKy8qIGNyZWF0ZSBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciBpbnB1dCBwaW5zIG9uIGRtaWMgY2FwYWJsZSBjb2RlY3MgKi8KK3N0YXRpYyBpbnQgc3RhYzkyeHhfYXV0b19jcmVhdGVfZG1pY19pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9pbnB1dF9tdXggKmRpbXV4ID0gJnNwZWMtPnByaXZhdGVfZGltdXg7CisJaGRhX25pZF90IGNvbl9sc3RbSERBX01BWF9OVU1fSU5QVVRTXTsKKwlpbnQgaSwgajsKKworCWRpbXV4LT5pdGVtc1tkaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9IHN0YWM5Mnh4X2RtaWNfbGFiZWxzWzBdOworCWRpbXV4LT5pdGVtc1tkaW11eC0+bnVtX2l0ZW1zXS5pbmRleCA9IDA7CisJZGltdXgtPm51bV9pdGVtcysrOworCisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9kbWljczsgaSsrKSB7CisJCWludCBpbmRleDsKKwkJaW50IG51bV9jb25zOworCQl1bnNpZ25lZCBpbnQgZGVmX2NvbmY7CisKKwkJZGVmX2NvbmYgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsCisJCQkJCSAgICAgIHNwZWMtPmRtaWNfbmlkc1tpXSwKKwkJCQkJICAgICAgMCwKKwkJCQkJICAgICAgQUNfVkVSQl9HRVRfQ09ORklHX0RFRkFVTFQsCisJCQkJCSAgICAgIDApOworCQlpZiAoZ2V0X2RlZmNmZ19jb25uZWN0KGRlZl9jb25mKSA9PSBBQ19KQUNLX1BPUlRfTk9ORSkKKwkJCWNvbnRpbnVlOworCisJCW51bV9jb25zID0gc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsCisJCQkJc3BlYy0+ZG11eF9uaWQsCisJCQkJY29uX2xzdCwKKwkJCQlIREFfTUFYX05VTV9JTlBVVFMpOworCQlmb3IgKGogPSAwOyBqIDwgbnVtX2NvbnM7IGorKykKKwkJCWlmIChjb25fbHN0W2pdID09IHNwZWMtPmRtaWNfbmlkc1tpXSkgeworCQkJCWluZGV4ID0gajsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQljb250aW51ZTsKK2ZvdW5kOgorCQlkaW11eC0+aXRlbXNbZGltdXgtPm51bV9pdGVtc10ubGFiZWwgPQorCQkJc3RhYzkyeHhfZG1pY19sYWJlbHNbZGltdXgtPm51bV9pdGVtc107CisJCWRpbXV4LT5pdGVtc1tkaW11eC0+bnVtX2l0ZW1zXS5pbmRleCA9IGluZGV4OworCQlkaW11eC0+bnVtX2l0ZW1zKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qIGNyZWF0ZSBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciBpbnB1dCBwaW5zICovCiBzdGF0aWMgaW50IHN0YWM5Mnh4X2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCiB7CkBAIC0xMjM4LDcgKzEzNzMsOSBAQAogCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGVycjsKIAotCWlmICgoZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsIE5VTEwpKSA8IDApCisJaWYgKChlcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLAorCQkJCQkJJnNwZWMtPmF1dG9jZmcsCisJCQkJCQlzcGVjLT5kbWljX25pZHMpKSA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKCEgc3BlYy0+YXV0b2NmZy5saW5lX291dHMpCiAJCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIHBpbiBjb25maWcgKi8KQEAgLTEyNTQsNiArMTM5MSwxMSBAQAogCSAgICAoZXJyID0gc3RhYzkyeHhfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoY29kZWMsICZzcGVjLT5hdXRvY2ZnKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJaWYgKHNwZWMtPm51bV9kbWljcyA+IDApCisJCWlmICgoZXJyID0gc3RhYzkyeHhfYXV0b19jcmVhdGVfZG1pY19pbnB1dF9jdGxzKGNvZGVjLAorCQkJCQkJJnNwZWMtPmF1dG9jZmcpKSA8IDApCisJCQlyZXR1cm4gZXJyOworCiAJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgKiAyOwogCWlmIChzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPiAyKQogCQlzcGVjLT5zdXJyX3N3aXRjaCA9IDE7CkBAIC0xMjY3LDYgKzE0MDksNyBAQAogCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxfYWxsb2M7CiAKIAlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OworCXNwZWMtPmRpbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9kaW11eDsKIAogCXJldHVybiAxOwogfQpAQCAtMTM2Niw2ICsxNTA5LDcgQEAKIAkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBzcGVjLT5rY3RsX2FsbG9jOwogCiAJc3BlYy0+aW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eDsKKwlzcGVjLT5kaW5wdXRfbXV4ID0gJnNwZWMtPnByaXZhdGVfZGltdXg7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTE0NDgsNiArMTU5MiwxMSBAQAogCQkJc3RhYzkyeHhfYXV0b19zZXRfcGluY3RsKGNvZGVjLCBuaWQsIHBpbmN0bCk7CiAJCX0KIAl9CisJaWYgKHNwZWMtPm51bV9kbWljcyA+IDApCisJCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fZG1pY3M7IGkrKykKKwkJCXN0YWM5Mnh4X2F1dG9fc2V0X3BpbmN0bChjb2RlYywgc3BlYy0+ZG1pY19uaWRzW2ldLAorCQkJCQkJIEFDX1BJTkNUTF9JTl9FTik7CisKIAlpZiAoY2ZnLT5kaWdfb3V0X3BpbikKIAkJc3RhYzkyeHhfYXV0b19zZXRfcGluY3RsKGNvZGVjLCBjZmctPmRpZ19vdXRfcGluLAogCQkJCQkgQUNfUElOQ1RMX09VVF9FTik7CkBAIC0xNTk4LDcgKzE3NDcsOSBAQAogCWNvZGVjLT5zcGVjID0gc3BlYzsKIAlzcGVjLT5udW1fcGlucyA9IDg7CiAJc3BlYy0+cGluX25pZHMgPSBzdGFjOTIwMF9waW5fbmlkczsKLQlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgc3RhYzkyMDBfY2ZnX3RibCk7CisJc3BlYy0+Ym9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIFNUQUNfOTIwMF9NT0RFTFMsCisJCQkJCQkJc3RhYzkyMDBfbW9kZWxzLAorCQkJCQkJCXN0YWM5MjAwX2NmZ190YmwpOwogCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBVbmtub3duIG1vZGVsIGZvciBTVEFDOTIwMCwgdXNpbmcgQklPUyBkZWZhdWx0c1xuIik7CiAJCWVyciA9IHN0YWM5Mnh4X3NhdmVfYmlvc19jb25maWdfcmVncyhjb2RlYyk7CkBAIC0xNjE4LDYgKzE3NjksNyBAQAogCXNwZWMtPmFkY19uaWRzID0gc3RhYzkyMDBfYWRjX25pZHM7CiAJc3BlYy0+bXV4X25pZHMgPSBzdGFjOTIwMF9tdXhfbmlkczsKIAlzcGVjLT5udW1fbXV4ZXMgPSAxOworCXNwZWMtPm51bV9kbWljcyA9IDA7CiAKIAlzcGVjLT5pbml0ID0gc3RhYzkyMDBfY29yZV9pbml0OwogCXNwZWMtPm1peGVyID0gc3RhYzkyMDBfbWl4ZXI7CkBAIC0xNjMzLDYgKzE3ODUsNTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwYXRjaF9zdGFjOTI1eChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYzsKKwlpbnQgZXJyOworCisJc3BlYyAgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCXNwZWMtPm51bV9waW5zID0gODsKKwlzcGVjLT5waW5fbmlkcyA9IHN0YWM5MjV4X3Bpbl9uaWRzOworCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBTVEFDXzkyNXhfTU9ERUxTLAorCQkJCQkJCXN0YWM5MjV4X21vZGVscywKKwkJCQkJCQlzdGFjOTI1eF9jZmdfdGJsKTsKKwlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnIDwgMCkgeworCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgU1RBQzkyNXgsIHVzaW5nIEJJT1MgZGVmYXVsdHNcbiIpOworCQllcnIgPSBzdGFjOTJ4eF9zYXZlX2Jpb3NfY29uZmlnX3JlZ3MoY29kZWMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJc3RhYzkyeHhfZnJlZShjb2RlYyk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXNwZWMtPnBpbl9jb25maWdzID0gc3BlYy0+Ymlvc19waW5fY29uZmlnczsKKwl9IGVsc2UgaWYgKHN0YWM5MjV4X2JyZF90Ymxbc3BlYy0+Ym9hcmRfY29uZmlnXSAhPSBOVUxMKXsKKwkJc3BlYy0+cGluX2NvbmZpZ3MgPSBzdGFjOTI1eF9icmRfdGJsW3NwZWMtPmJvYXJkX2NvbmZpZ107CisJCXN0YWM5Mnh4X3NldF9jb25maWdfcmVncyhjb2RlYyk7CisJfQorCisJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKKwlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDE7CisJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzdGFjOTI1eF9kYWNfbmlkczsKKwlzcGVjLT5hZGNfbmlkcyA9IHN0YWM5MjV4X2FkY19uaWRzOworCXNwZWMtPm11eF9uaWRzID0gc3RhYzkyNXhfbXV4X25pZHM7CisJc3BlYy0+bnVtX211eGVzID0gMTsKKwlzcGVjLT5udW1fZG1pY3MgPSAwOworCisJc3BlYy0+aW5pdCA9IHN0YWM5MjV4X2NvcmVfaW5pdDsKKwlzcGVjLT5taXhlciA9IHN0YWM5MjV4X21peGVyOworCisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMsIDB4OCwgMHg3KTsKKwlpZiAoZXJyIDwgMCkgeworCQlzdGFjOTJ4eF9mcmVlKGNvZGVjKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwljb2RlYy0+cGF0Y2hfb3BzID0gc3RhYzkyeHhfcGF0Y2hfb3BzOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcGF0Y2hfc3RhYzkyMngoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWM7CkBAIC0xNjQ1LDcgKzE4NDcsOSBAQAogCWNvZGVjLT5zcGVjID0gc3BlYzsKIAlzcGVjLT5udW1fcGlucyA9IDEwOwogCXNwZWMtPnBpbl9uaWRzID0gc3RhYzkyMnhfcGluX25pZHM7Ci0Jc3BlYy0+Ym9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIHN0YWM5MjJ4X2NmZ190YmwpOworCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBTVEFDXzkyMlhfTU9ERUxTLAorCQkJCQkJCXN0YWM5MjJ4X21vZGVscywKKwkJCQkJCQlzdGFjOTIyeF9jZmdfdGJsKTsKIAlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnIDwgMCkgewogCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgU1RBQzkyMngsICIKIAkJCSJ1c2luZyBCSU9TIGRlZmF1bHRzXG4iKTsKQEAgLTE2NjMsNiArMTg2Nyw3IEBACiAJc3BlYy0+YWRjX25pZHMgPSBzdGFjOTIyeF9hZGNfbmlkczsKIAlzcGVjLT5tdXhfbmlkcyA9IHN0YWM5MjJ4X211eF9uaWRzOwogCXNwZWMtPm51bV9tdXhlcyA9IDI7CisJc3BlYy0+bnVtX2RtaWNzID0gMDsKIAogCXNwZWMtPmluaXQgPSBzdGFjOTIyeF9jb3JlX2luaXQ7CiAJc3BlYy0+bWl4ZXIgPSBzdGFjOTIyeF9taXhlcjsKQEAgLTE2OTUsNyArMTkwMCw5IEBACiAJY29kZWMtPnNwZWMgPSBzcGVjOwogCXNwZWMtPm51bV9waW5zID0gMTQ7CiAJc3BlYy0+cGluX25pZHMgPSBzdGFjOTI3eF9waW5fbmlkczsKLQlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgc3RhYzkyN3hfY2ZnX3RibCk7CisJc3BlYy0+Ym9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIFNUQUNfOTI3WF9NT0RFTFMsCisJCQkJCQkJc3RhYzkyN3hfbW9kZWxzLAorCQkJCQkJCXN0YWM5Mjd4X2NmZ190YmwpOwogCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAgICAgICAgICAgICAgICAgc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIFNUQUM5Mjd4LCB1c2luZyBCSU9TIGRlZmF1bHRzXG4iKTsKIAkJZXJyID0gc3RhYzkyeHhfc2F2ZV9iaW9zX2NvbmZpZ19yZWdzKGNvZGVjKTsKQEAgLTE3MTQsNiArMTkyMSw3IEBACiAJCXNwZWMtPmFkY19uaWRzID0gc3RhYzkyN3hfYWRjX25pZHM7CiAJCXNwZWMtPm11eF9uaWRzID0gc3RhYzkyN3hfbXV4X25pZHM7CiAJCXNwZWMtPm51bV9tdXhlcyA9IDM7CisJCXNwZWMtPm51bV9kbWljcyA9IDA7CiAJCXNwZWMtPmluaXQgPSBkOTY1X2NvcmVfaW5pdDsKIAkJc3BlYy0+bWl4ZXIgPSBzdGFjOTIyN19taXhlcjsKIAkJYnJlYWs7CkBAIC0xNzIxLDYgKzE5MjksNyBAQAogCQlzcGVjLT5hZGNfbmlkcyA9IHN0YWM5Mjd4X2FkY19uaWRzOwogCQlzcGVjLT5tdXhfbmlkcyA9IHN0YWM5Mjd4X211eF9uaWRzOwogCQlzcGVjLT5udW1fbXV4ZXMgPSAzOworCQlzcGVjLT5udW1fZG1pY3MgPSAwOwogCQlzcGVjLT5pbml0ID0gZDk2NV9jb3JlX2luaXQ7CiAJCXNwZWMtPm1peGVyID0gc3RhYzkyMjdfbWl4ZXI7CiAJCWJyZWFrOwpAQCAtMTcyOCw2ICsxOTM3LDcgQEAKIAkJc3BlYy0+YWRjX25pZHMgPSBzdGFjOTI3eF9hZGNfbmlkczsKIAkJc3BlYy0+bXV4X25pZHMgPSBzdGFjOTI3eF9tdXhfbmlkczsKIAkJc3BlYy0+bnVtX211eGVzID0gMzsKKwkJc3BlYy0+bnVtX2RtaWNzID0gMDsKIAkJc3BlYy0+aW5pdCA9IHN0YWM5Mjd4X2NvcmVfaW5pdDsKIAkJc3BlYy0+bWl4ZXIgPSBzdGFjOTI3eF9taXhlcjsKIAl9CkBAIC0xNzU3LDcgKzE5NjcsOSBAQAogCWNvZGVjLT5zcGVjID0gc3BlYzsKIAlzcGVjLT5udW1fcGlucyA9IDE0OwogCXNwZWMtPnBpbl9uaWRzID0gc3RhYzkyMDVfcGluX25pZHM7Ci0Jc3BlYy0+Ym9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIHN0YWM5MjA1X2NmZ190YmwpOworCXNwZWMtPmJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBTVEFDXzkyMDVfTU9ERUxTLAorCQkJCQkJCXN0YWM5MjA1X21vZGVscywKKwkJCQkJCQlzdGFjOTIwNV9jZmdfdGJsKTsKIAlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnIDwgMCkgewogCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgU1RBQzkyMDUsIHVzaW5nIEJJT1MgZGVmYXVsdHNcbiIpOwogCQllcnIgPSBzdGFjOTJ4eF9zYXZlX2Jpb3NfY29uZmlnX3JlZ3MoY29kZWMpOwpAQCAtMTc3MywxMyArMTk4NSwyOCBAQAogCiAJc3BlYy0+YWRjX25pZHMgPSBzdGFjOTIwNV9hZGNfbmlkczsKIAlzcGVjLT5tdXhfbmlkcyA9IHN0YWM5MjA1X211eF9uaWRzOwotCXNwZWMtPm51bV9tdXhlcyA9IDM7CisJc3BlYy0+bnVtX211eGVzID0gMjsKKwlzcGVjLT5kbWljX25pZHMgPSBzdGFjOTIwNV9kbWljX25pZHM7CisJc3BlYy0+bnVtX2RtaWNzID0gMjsKKwlzcGVjLT5kbXV4X25pZCA9IDB4MWQ7CiAKIAlzcGVjLT5pbml0ID0gc3RhYzkyMDVfY29yZV9pbml0OwogCXNwZWMtPm1peGVyID0gc3RhYzkyMDVfbWl4ZXI7CiAKIAlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPmRhY19uaWRzOwogCisJLyogQ29uZmlndXJlIEdQSU8wIGFzIEVBUEQgb3V0cHV0ICovCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwMDAwMDAwMSk7CisJLyogQ29uZmlndXJlIEdQSU8wIGFzIENNT1MgKi8KKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLCAweDdlNywgMHgwMDAwMDAwMCk7CisJLyogQXNzZXJ0IEdQSU8wIGhpZ2ggKi8KKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMDAwMDAwMSk7CisJLyogRW5hYmxlIEdQSU8wICovCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MDAwMDAwMDEpOworCiAJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMsIDB4MWYsIDB4MjApOwogCWlmIChlcnIgPCAwKSB7CiAJCXN0YWM5Mnh4X2ZyZWUoY29kZWMpOwpAQCAtMTk2MywxOCArMjE5MCwxOSBAQAogICAgICAgIC8qIFVua25vd24uIGlkPTB4ODM4NDc2NjEgYW5kIHN1YnN5cz0weDEwNEQxMjAwLiAqLwogICAgICAgIFNUQUM5ODcyS19WQUlPLAogICAgICAgIC8qIEFSIFNlcmllcy4gaWQ9MHg4Mzg0NzY2NCBhbmQgc3Vic3lzPTEwNEQxMzAwICovCi0gICAgICAgQ1hEOTg3MkFLRF9WQUlPIAotICAgICB9OworICAgICAgIENYRDk4NzJBS0RfVkFJTywKKyAgICAgICBTVEFDXzk4NzJfTU9ERUxTLAorfTsKIAotc3RhdGljIHN0cnVjdCBoZGFfYm9hcmRfY29uZmlnIHN0YWM5ODcyX2NmZ190YmxbXSA9IHsKLQl7IC5tb2RlbG5hbWUgPSAidmFpbyIsIC5jb25maWcgPSBDWEQ5ODcyUkRfVkFJTyB9LAotCXsgLm1vZGVsbmFtZSA9ICJ2YWlvLWFyIiwgLmNvbmZpZyA9IENYRDk4NzJBS0RfVkFJTyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNGQsIC5wY2lfc3ViZGV2aWNlID0gMHg4MWU2LAotCSAgLmNvbmZpZyA9IENYRDk4NzJSRF9WQUlPIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0ZCwgLnBjaV9zdWJkZXZpY2UgPSAweDgxZWYsCi0JICAuY29uZmlnID0gQ1hEOTg3MlJEX1ZBSU8gfSwKLQl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDRkLCAucGNpX3N1YmRldmljZSA9IDB4ODFmZCwKLQkgIC5jb25maWcgPSBDWEQ5ODcyQUtEX1ZBSU8gfSwKK3N0YXRpYyBjb25zdCBjaGFyICpzdGFjOTg3Ml9tb2RlbHNbU1RBQ185ODcyX01PREVMU10gPSB7CisJW0NYRDk4NzJSRF9WQUlPXQk9ICJ2YWlvIiwKKwlbQ1hEOTg3MkFLRF9WQUlPXQk9ICJ2YWlvLWFyIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBzdGFjOTg3Ml9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODFlNiwgIlNvbnkgVkFJTyBGL1MiLCBDWEQ5ODcyUkRfVkFJTyksCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODFlZiwgIlNvbnkgVkFJTyBGL1MiLCBDWEQ5ODcyUkRfVkFJTyksCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4ODFmZCwgIlNvbnkgVkFJTyBBUiIsIENYRDk4NzJBS0RfVkFJTyksCiAJe30KIH07CiAKQEAgLTE5ODMsNyArMjIxMSw5IEBACiAJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWM7CiAJaW50IGJvYXJkX2NvbmZpZzsKIAotCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBzdGFjOTg3Ml9jZmdfdGJsKTsKKwlib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgU1RBQ185ODcyX01PREVMUywKKwkJCQkJCSAgc3RhYzk4NzJfbW9kZWxzLAorCQkJCQkJICBzdGFjOTg3Ml9jZmdfdGJsKTsKIAlpZiAoYm9hcmRfY29uZmlnIDwgMCkKIAkJLyogdW5rbm93biBjb25maWcsIGxldCBnZW5lcmljLXBhcnNlciBkbyBpdHMgam9iLi4uICovCiAJCXJldHVybiBzbmRfaGRhX3BhcnNlX2dlbmVyaWNfY29kZWMoY29kZWMpOwpAQCAtMjA1NSw2ICsyMjg1LDEyIEBACiAgCXsgLmlkID0gMHg4Mzg0NzYyNywgLm5hbWUgPSAiU1RBQzkyNzFEIiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyN3ggfSwKICAJeyAuaWQgPSAweDgzODQ3NjI4LCAubmFtZSA9ICJTVEFDOTI3NFg1TkgiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTI3eCB9LAogIAl7IC5pZCA9IDB4ODM4NDc2MjksIC5uYW1lID0gIlNUQUM5Mjc0RDVOSCIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5Mjd4IH0sCisJeyAuaWQgPSAweDgzODQ3NjMyLCAubmFtZSA9ICJTVEFDOTIwMiIsICAucGF0Y2ggPSBwYXRjaF9zdGFjOTI1eCB9LAorCXsgLmlkID0gMHg4Mzg0NzYzMywgLm5hbWUgPSAiU1RBQzkyMDJEIiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyNXggfSwKKwl7IC5pZCA9IDB4ODM4NDc2MzQsIC5uYW1lID0gIlNUQUM5MjUwIiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyNXggfSwKKwl7IC5pZCA9IDB4ODM4NDc2MzUsIC5uYW1lID0gIlNUQUM5MjUwRCIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MjV4IH0sCisJeyAuaWQgPSAweDgzODQ3NjM2LCAubmFtZSA9ICJTVEFDOTI1MSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MjV4IH0sCisJeyAuaWQgPSAweDgzODQ3NjM3LCAubmFtZSA9ICJTVEFDOTI1MEQiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTI1eCB9LAogIAkvKiBUaGUgZm9sbG93aW5nIGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IC5pZD0weDgzODQ3NjYxIHdoZW4gc3Vic3lzID0KICAJICogMTA0RDBDMDAgd2hpY2ggaXMgU1RBQzkyMjVzLiBCZWNhdXNlIG9mIHRoaXMsIHNvbWUgU1ogTm90ZWJvb2tzIGFyZQogIAkgKiBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZC4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODM5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCkBAIC0wLDAgKzEsMTM5NiBAQAorLyoKKyAqIFVuaXZlcnNhbCBJbnRlcmZhY2UgZm9yIEludGVsIEhpZ2ggRGVmaW5pdGlvbiBBdWRpbyBDb2RlYworICoKKyAqIEhEIGF1ZGlvIGludGVyZmFjZSBwYXRjaCBmb3IgVklBIFZUMTcwOCBjb2RlYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBMeWRpYSBXYW5nIDxseWRpYXdhbmdAdmlhdGVjaC5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogUmVsZWFzZSBIaXN0b3J5ICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDIwMDYtMDMtMDMgIEx5ZGlhIFdhbmcgIENyZWF0ZSB0aGUgYmFzaWMgcGF0Y2ggdG8gc3VwcG9ydCBWVDE3MDggY29kZWMgICAgKi8KKy8qIDIwMDYtMDMtMTQgIEx5ZGlhIFdhbmcgIE1vZGlmeSBoYXJkIGNvZGUgZm9yIHNvbWUgcGluIHdpZGdldCBuaWQgICAgICAgICAgKi8KKy8qIDIwMDYtMDgtMDIgIEx5ZGlhIFdhbmcgIEFkZCBzdXBwb3J0IHRvIFZUMTcwOSBjb2RlYyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDIwMDYtMDktMDggIEx5ZGlhIFdhbmcgIEZpeCBpbnRlcm5hbCBsb29wYmFjayByZWNvcmRpbmcgc291cmNlIHNlbGVjdCBidWcgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKworCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlICJoZGFfY29kZWMuaCIKKyNpbmNsdWRlICJoZGFfbG9jYWwuaCIKKworCisvKiBhbXAgdmFsdWVzICovCisjZGVmaW5lIEFNUF9WQUxfSURYX1NISUZUCTE5CisjZGVmaW5lIEFNUF9WQUxfSURYX01BU0sJKDB4MGY8PDE5KQorCisjZGVmaW5lIE5VTV9DT05UUk9MX0FMTE9DCTMyCisjZGVmaW5lIE5VTV9WRVJCX0FMTE9DCQkzMgorCisvKiBQaW4gV2lkZ2V0IE5JRCAqLworI2RlZmluZSBWVDE3MDhfSFBfTklECQkweDEzCisjZGVmaW5lIFZUMTcwOF9ESUdPVVRfTklECTB4MTQKKyNkZWZpbmUgVlQxNzA4X0RJR0lOX05JRAkweDE2CisKKyNkZWZpbmUgVlQxNzA5X0hQX0RBQ19OSUQJMHgyOAorI2RlZmluZSBWVDE3MDlfRElHT1VUX05JRAkweDEzCisjZGVmaW5lIFZUMTcwOV9ESUdJTl9OSUQJMHgxNworCisjZGVmaW5lIElTX1ZUMTcwOF9WRU5ET1JJRCh4KQkJKCh4KSA+PSAweDExMDYxNzA4ICYmICh4KSA8PSAweDExMDYxNzBiKQorI2RlZmluZSBJU19WVDE3MDlfMTBDSF9WRU5ET1JJRCh4KQkoKHgpID49IDB4MTEwNmU3MTAgJiYgKHgpIDw9IDB4MTEwNmU3MTMpCisjZGVmaW5lIElTX1ZUMTcwOV82Q0hfVkVORE9SSUQoeCkJKCh4KSA+PSAweDExMDZlNzE0ICYmICh4KSA8PSAweDExMDZlNzE3KQorCisKK2VudW0geworCVZJQV9DVExfV0lER0VUX1ZPTCwKKwlWSUFfQ1RMX1dJREdFVF9NVVRFLAorfTsKKworZW51bSB7CisJQVVUT19TRVFfRlJPTlQsCisJQVVUT19TRVFfU1VSUk9VTkQsCisJQVVUT19TRVFfQ0VOTEZFLAorCUFVVE9fU0VRX1NJREUKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2dDE3MDhfY29udHJvbF90ZW1wbGF0ZXNbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FKE5VTEwsIDAsIDAsIDApLAorCUhEQV9DT0RFQ19NVVRFKE5VTEwsIDAsIDAsIDApLAorfTsKKworCitzdHJ1Y3QgdmlhX3NwZWMgeworCS8qIGNvZGVjIHBhcmFtZXRlcml6YXRpb24gKi8KKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqbWl4ZXJzWzNdOworCXVuc2lnbmVkIGludCBudW1fbWl4ZXJzOworCisJc3RydWN0IGhkYV92ZXJiICppbml0X3ZlcmJzOworCisJY2hhciAqc3RyZWFtX25hbWVfYW5hbG9nOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqc3RyZWFtX2FuYWxvZ19wbGF5YmFjazsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKnN0cmVhbV9hbmFsb2dfY2FwdHVyZTsKKworCWNoYXIgKnN0cmVhbV9uYW1lX2RpZ2l0YWw7CisJc3RydWN0IGhkYV9wY21fc3RyZWFtICpzdHJlYW1fZGlnaXRhbF9wbGF5YmFjazsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKnN0cmVhbV9kaWdpdGFsX2NhcHR1cmU7CisKKwkvKiBwbGF5YmFjayAqLworCXN0cnVjdCBoZGFfbXVsdGlfb3V0IG11bHRpb3V0OworCisJLyogY2FwdHVyZSAqLworCXVuc2lnbmVkIGludCBudW1fYWRjX25pZHM7CisJaGRhX25pZF90ICphZGNfbmlkczsKKwloZGFfbmlkX3QgZGlnX2luX25pZDsKKworCS8qIGNhcHR1cmUgc291cmNlICovCisJY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmlucHV0X211eDsKKwl1bnNpZ25lZCBpbnQgY3VyX211eFszXTsKKworCS8qIFBDTSBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBoZGFfcGNtIHBjbV9yZWNbMl07CisKKwkvKiBkeW5hbWljIGNvbnRyb2xzLCBpbml0X3ZlcmJzIGFuZCBpbnB1dF9tdXggKi8KKwlzdHJ1Y3QgYXV0b19waW5fY2ZnIGF1dG9jZmc7CisJdW5zaWduZWQgaW50IG51bV9rY3RsX2FsbG9jLCBudW1fa2N0bF91c2VkOworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY3RsX2FsbG9jOworCXN0cnVjdCBoZGFfaW5wdXRfbXV4IHByaXZhdGVfaW11eDsKKwloZGFfbmlkX3QgcHJpdmF0ZV9kYWNfbmlkc1s0XTsJCit9OworCitzdGF0aWMgaGRhX25pZF90IHZ0MTcwOF9hZGNfbmlkc1syXSA9IHsKKwkvKiBBREMxLTIgKi8KKwkweDE1LCAweDI3Cit9OworCitzdGF0aWMgaGRhX25pZF90IHZ0MTcwOV9hZGNfbmlkc1szXSA9IHsKKwkvKiBBREMxLTIgKi8KKwkweDE0LCAweDE1LCAweDE2Cit9OworCisvKiBhZGQgZHluYW1pYyBjb250cm9scyAqLworc3RhdGljIGludCB2aWFfYWRkX2NvbnRyb2woc3RydWN0IHZpYV9zcGVjICpzcGVjLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprbmV3OworCisJaWYgKHNwZWMtPm51bV9rY3RsX3VzZWQgPj0gc3BlYy0+bnVtX2tjdGxfYWxsb2MpIHsKKwkJaW50IG51bSA9IHNwZWMtPm51bV9rY3RsX2FsbG9jICsgTlVNX0NPTlRST0xfQUxMT0M7CisKKwkJLyogYXJyYXkgKyB0ZXJtaW5hdG9yICovCisJCWtuZXcgPSBrY2FsbG9jKG51bSArIDEsIHNpemVvZigqa25ldyksIEdGUF9LRVJORUwpOworCQlpZiAoIWtuZXcpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKHNwZWMtPmtjdGxfYWxsb2MpIHsKKwkJCW1lbWNweShrbmV3LCBzcGVjLT5rY3RsX2FsbG9jLAorCQkJICAgICAgIHNpemVvZigqa25ldykgKiBzcGVjLT5udW1fa2N0bF9hbGxvYyk7CisJCQlrZnJlZShzcGVjLT5rY3RsX2FsbG9jKTsKKwkJfQorCQlzcGVjLT5rY3RsX2FsbG9jID0ga25ldzsKKwkJc3BlYy0+bnVtX2tjdGxfYWxsb2MgPSBudW07CisJfQorCisJa25ldyA9ICZzcGVjLT5rY3RsX2FsbG9jW3NwZWMtPm51bV9rY3RsX3VzZWRdOworCSprbmV3ID0gdnQxNzA4X2NvbnRyb2xfdGVtcGxhdGVzW3R5cGVdOworCWtuZXctPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworCisJaWYgKCFrbmV3LT5uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlrbmV3LT5wcml2YXRlX3ZhbHVlID0gdmFsOworCXNwZWMtPm51bV9rY3RsX3VzZWQrKzsKKwlyZXR1cm4gMDsKK30KKworLyogY3JlYXRlIGlucHV0IHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIHRoZSBnaXZlbiBwaW4gKi8KK3N0YXRpYyBpbnQgdmlhX25ld19hbmFsb2dfaW5wdXQoc3RydWN0IHZpYV9zcGVjICpzcGVjLCBoZGFfbmlkX3QgcGluLAorCQkJCWNvbnN0IGNoYXIgKmN0bG5hbWUsIGludCBpZHgsIGludCBtaXhfbmlkKQoreworCWNoYXIgbmFtZVszMl07CisJaW50IGVycjsKKworCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIGN0bG5hbWUpOworCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG1peF9uaWQsIDMsIGlkeCwgSERBX0lOUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY3RsbmFtZSk7CisJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsIG5hbWUsCisJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG1peF9uaWQsIDMsIGlkeCwgSERBX0lOUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZpYV9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgaGRhX25pZF90IG5pZCwgaW50IHBpbl90eXBlLAorCQkJCQkgICBpbnQgZGFjX2lkeCkKK3sKKwkvKiBzZXQgYXMgb3V0cHV0ICovCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkgICAgcGluX3R5cGUpOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCSAgICBBTVBfT1VUX1VOTVVURSk7Cit9CisKKworc3RhdGljIHZvaWQgdmlhX2F1dG9faW5pdF9tdWx0aV9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IEFVVE9fU0VRX1NJREU7IGkrKykgeworCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zW2ldOworCQlpZiAobmlkKQorCQkJdmlhX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBuaWQsIFBJTl9PVVQsIGkpOworCX0KK30KKworc3RhdGljIHZvaWQgdmlhX2F1dG9faW5pdF9ocF9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IHBpbjsKKworCXBpbiA9IHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXTsKKwlpZiAocGluKSAvKiBjb25uZWN0IHRvIGZyb250ICovCisJCXZpYV9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgcGluLCBQSU5fSFAsIDApOworfQorCitzdGF0aWMgdm9pZCB2aWFfYXV0b19pbml0X2FuYWxvZ19pbnB1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBVVRPX1BJTl9MQVNUOyBpKyspIHsKKwkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmF1dG9jZmcuaW5wdXRfcGluc1tpXTsKKworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCisJCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCQkgICAgKGkgPD0gQVVUT19QSU5fRlJPTlRfTUlDID8KKwkJCQkgICAgIFBJTl9WUkVGNTAgOiBQSU5fSU4pKTsKKworCX0KK30KKy8qCisgKiBpbnB1dCBNVVggaGFuZGxpbmcKKyAqLworc3RhdGljIGludCB2aWFfbXV4X2VudW1faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9pbnB1dF9tdXhfaW5mbyhzcGVjLT5pbnB1dF9tdXgsIHVpbmZvKTsKK30KKworc3RhdGljIGludCB2aWFfbXV4X2VudW1fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGludCBhZGNfaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc3BlYy0+Y3VyX211eFthZGNfaWR4XTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFfbXV4X2VudW1fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGludCBhZGNfaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJdW5zaWduZWQgaW50IHZlbmRvcl9pZCA9IGNvZGVjLT52ZW5kb3JfaWQ7CisKKwkvKiBBSVcwICBseWRpYSAwNjA4MDEgYWRkIGZvciBjb3JyZWN0IHN3MCBpbnB1dCBzZWxlY3QgKi8KKwlpZiAoSVNfVlQxNzA4X1ZFTkRPUklEKHZlbmRvcl9pZCkgJiYgKGFkY19pZHggPT0gMCkpCisJCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9wdXQoY29kZWMsIHNwZWMtPmlucHV0X211eCwgdWNvbnRyb2wsCisJCQkJCSAgICAgMHgxOCwgJnNwZWMtPmN1cl9tdXhbYWRjX2lkeF0pOworCWVsc2UgaWYgKChJU19WVDE3MDlfMTBDSF9WRU5ET1JJRCh2ZW5kb3JfaWQpIHx8CisJCSAgSVNfVlQxNzA5XzZDSF9WRU5ET1JJRCh2ZW5kb3JfaWQpKSAmJiAoYWRjX2lkeCA9PSAwKSApCisJCXJldHVybiBzbmRfaGRhX2lucHV0X211eF9wdXQoY29kZWMsIHNwZWMtPmlucHV0X211eCwgdWNvbnRyb2wsCisJCQkJCSAgICAgMHgxOSwgJnNwZWMtPmN1cl9tdXhbYWRjX2lkeF0pOworCWVsc2UKKwkJcmV0dXJuIHNuZF9oZGFfaW5wdXRfbXV4X3B1dChjb2RlYywgc3BlYy0+aW5wdXRfbXV4LCB1Y29udHJvbCwKKwkJCQkJICAgICBzcGVjLT5hZGNfbmlkc1thZGNfaWR4XSwKKwkJCQkJICAgICAmc3BlYy0+Y3VyX211eFthZGNfaWR4XSk7Cit9CisKKy8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2dDE3MDhfY2FwdHVyZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDI3LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MjcsIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiBUaGUgbXVsdGlwbGUgIkNhcHR1cmUgU291cmNlIiBjb250cm9scyBjb25mdXNlIGFsc2FtaXhlcgorCQkgKiBTbyBjYWxsIHNvbWV3aGF0IGRpZmZlcmVudC4uCisJCSAqIEZJWE1FOiB0aGUgY29udHJvbHMgYXBwZWFyIGluIHRoZSAicGxheWJhY2siIHZpZXchCisJCSAqLworCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gdmlhX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSB2aWFfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gdmlhX211eF9lbnVtX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisvKgorICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycworICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIHZ0MTcwOF92b2x1bWVfaW5pdF92ZXJic1tdID0geworCS8qCisJICogVW5tdXRlIEFEQzAtMSBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgorCSAqLworCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgyNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisKKworCS8qIFVubXV0ZSBpbnB1dCBhbXBzIChDRCwgTGluZSBJbiwgTWljIDEgJiBNaWMgMikgb2YgdGhlIGFuYWxvZy1sb29wYmFjaworCSAqIG1peGVyIHdpZGdldAorCSAqLworCS8qIEFtcCBJbmRpY2VzOiBDRCA9IDEsIE1pYzEgPSAyLCBMaW5lID0gMywgTWljMiA9IDQgKi8KKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCisJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNCl9LAorCisJLyoKKwkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgxOSAtIDB4MWIpCisJICovCisJLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwkKKwkvKiBTZXR1cCBkZWZhdWx0IGlucHV0IHRvIFBXNCAqLworCXsweDIwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxfSwKKwkvKiBTZXQgbWljIGFzIGRlZmF1bHQgaW5wdXQgb2Ygc3cwICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDJ9LAorCS8qIFBXOSBPdXRwdXQgZW5hYmxlICovCisJezB4MjUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCit9OworCitzdGF0aWMgaW50IHZpYV9wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19vcGVuKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsIHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgdmlhX3BsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCQkgICAgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQkgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19wcmVwYXJlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsCisJCQkJCQlzdHJlYW1fdGFnLCBmb3JtYXQsIHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgdmlhX3BsYXliYWNrX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX2NsZWFudXAoY29kZWMsICZzcGVjLT5tdWx0aW91dCk7Cit9CisKKy8qCisgKiBEaWdpdGFsIG91dAorICovCitzdGF0aWMgaW50IHZpYV9kaWdfcGxheWJhY2tfcGNtX29wZW4oc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19vcGVuKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOworfQorCitzdGF0aWMgaW50IHZpYV9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19jbG9zZShjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKK30KKworLyoKKyAqIEFuYWxvZyBjYXB0dXJlCisgKi8KK3N0YXRpYyBpbnQgdmlhX2NhcHR1cmVfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCQkgICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCisJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIHNwZWMtPmFkY19uaWRzW3N1YnN0cmVhbS0+bnVtYmVyXSwKKwkJCQkgICBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpYV9jYXB0dXJlX3BjbV9jbGVhbnVwKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIHNwZWMtPmFkY19uaWRzW3N1YnN0cmVhbS0+bnVtYmVyXSwKKwkJCQkgICAwLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDhfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDgsCisJLm5pZCA9IDB4MTAsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLworCS5vcHMgPSB7CisJCS5vcGVuID0gdmlhX3BsYXliYWNrX3BjbV9vcGVuLAorCQkucHJlcGFyZSA9IHZpYV9wbGF5YmFja19wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSB2aWFfcGxheWJhY2tfcGNtX2NsZWFudXAKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDhfcGNtX2FuYWxvZ19jYXB0dXJlID0geworCS5zdWJzdHJlYW1zID0gMiwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkubmlkID0gMHgxNSwgLyogTklEIHRvIHF1ZXJ5IGZvcm1hdHMgYW5kIHJhdGVzICovCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSB2aWFfY2FwdHVyZV9wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSB2aWFfY2FwdHVyZV9wY21fY2xlYW51cAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIHZ0MTcwOF9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLyogTklEIGlzIHNldCBpbiB2aWFfYnVpbGRfcGNtcyAqLworCS5vcHMgPSB7CisJCS5vcGVuID0gdmlhX2RpZ19wbGF5YmFja19wY21fb3BlbiwKKwkJLmNsb3NlID0gdmlhX2RpZ19wbGF5YmFja19wY21fY2xvc2UKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDhfcGNtX2RpZ2l0YWxfY2FwdHVyZSA9IHsKKwkuc3Vic3RyZWFtcyA9IDEsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCit9OworCitzdGF0aWMgaW50IHZpYV9idWlsZF9jb250cm9scyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9taXhlcnM7IGkrKykgeworCQllcnIgPSBzbmRfaGRhX2FkZF9uZXdfY3Rscyhjb2RlYywgc3BlYy0+bWl4ZXJzW2ldKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkgeworCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywKKwkJCQkJCSAgICBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHNwZWMtPmRpZ19pbl9uaWQpIHsKKwkJZXJyID0gc25kX2hkYV9jcmVhdGVfc3BkaWZfaW5fY3Rscyhjb2RlYywgc3BlYy0+ZGlnX2luX25pZCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2J1aWxkX3BjbXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9wY20gKmluZm8gPSBzcGVjLT5wY21fcmVjOworCisJY29kZWMtPm51bV9wY21zID0gMTsKKwljb2RlYy0+cGNtX2luZm8gPSBpbmZvOworCisJaW5mby0+bmFtZSA9IHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZzsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSAqKHNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2spOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPSBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXTsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9ICooc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlKTsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPSBzcGVjLT5hZGNfbmlkc1swXTsKKworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5jaGFubmVsc19tYXggPQorCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHM7CisKKwlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgfHwgc3BlYy0+ZGlnX2luX25pZCkgeworCQljb2RlYy0+bnVtX3BjbXMrKzsKKwkJaW5mbysrOworCQlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbDsKKwkJaWYgKHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKSB7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPQorCQkJCSooc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2spOworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLm5pZCA9CisJCQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQ7CisJCX0KKwkJaWYgKHNwZWMtPmRpZ19pbl9uaWQpIHsKKwkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0KKwkJCQkqKHNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUpOworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0KKwkJCQlzcGVjLT5kaWdfaW5fbmlkOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZpYV9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFzcGVjKQorCQlyZXR1cm47CisKKwlpZiAoc3BlYy0+a2N0bF9hbGxvYykgeworCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX2tjdGxfdXNlZDsgaSsrKQorCQkJa2ZyZWUoc3BlYy0+a2N0bF9hbGxvY1tpXS5uYW1lKTsKKwkJa2ZyZWUoc3BlYy0+a2N0bF9hbGxvYyk7CisJfQorCisJa2ZyZWUoY29kZWMtPnNwZWMpOworfQorCitzdGF0aWMgaW50IHZpYV9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIHNwZWMtPmluaXRfdmVyYnMpOworIAlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorLyoKKyAqIHJlc3VtZQorICovCitzdGF0aWMgaW50IHZpYV9yZXN1bWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CisKKwl2aWFfaW5pdChjb2RlYyk7CisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9taXhlcnM7IGkrKykKKwkJc25kX2hkYV9yZXN1bWVfY3Rscyhjb2RlYywgc3BlYy0+bWl4ZXJzW2ldKTsKKwlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpCisJCXNuZF9oZGFfcmVzdW1lX3NwZGlmX291dChjb2RlYyk7CisJaWYgKHNwZWMtPmRpZ19pbl9uaWQpCisJCXNuZF9oZGFfcmVzdW1lX3NwZGlmX2luKGNvZGVjKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX29wcyB2aWFfcGF0Y2hfb3BzID0geworCS5idWlsZF9jb250cm9scyA9IHZpYV9idWlsZF9jb250cm9scywKKwkuYnVpbGRfcGNtcyA9IHZpYV9idWlsZF9wY21zLAorCS5pbml0ID0gdmlhX2luaXQsCisJLmZyZWUgPSB2aWFfZnJlZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkucmVzdW1lID0gdmlhX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworLyogZmlsbCBpbiB0aGUgZGFjX25pZHMgdGFibGUgZnJvbSB0aGUgcGFyc2VkIHBpbiBjb25maWd1cmF0aW9uICovCitzdGF0aWMgaW50IHZ0MTcwOF9hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCWludCBpOworCWhkYV9uaWRfdCBuaWQ7CisKKwlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IGNmZy0+bGluZV9vdXRzOworCisJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5wcml2YXRlX2RhY19uaWRzOworIAkKKwlmb3IoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOworCQlpZiAobmlkKSB7CisJCQkvKiBjb25maWcgZGFjIGxpc3QgKi8KKwkJCXN3aXRjaCAoaSkgeworCQkJY2FzZSBBVVRPX1NFUV9GUk9OVDoKKwkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTA7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVVE9fU0VRX0NFTkxGRToKKwkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTI7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVVE9fU0VRX1NVUlJPVU5EOgorCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVVUT19TRVFfU0lERToKKwkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KK3N0YXRpYyBpbnQgdnQxNzA4X2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCit7CisJY2hhciBuYW1lWzMyXTsKKwlzdGF0aWMgY29uc3QgY2hhciAqY2huYW1lWzRdID0geyAiRnJvbnQiLCAiU3Vycm91bmQiLCAiQy9MRkUiLCAiU2lkZSIgfTsKKwloZGFfbmlkX3QgbmlkLCBuaWRfdm9sID0gMDsKKwlpbnQgaSwgZXJyOworCisJZm9yIChpID0gMDsgaSA8PSBBVVRPX1NFUV9TSURFOyBpKyspIHsKKwkJbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOworCisJCWlmICghbmlkKQorCQkJY29udGludWU7CisJCQorCQlpZiAoaSAhPSBBVVRPX1NFUV9GUk9OVCkKKwkJCW5pZF92b2wgPSAweDFiIC0gaSArIDE7CisKKwkJaWYgKGkgPT0gQVVUT19TRVFfQ0VOTEZFKSB7CisJCQkvKiBDZW50ZXIvTEZFICovCisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAorCQkJCQkgICAgICAiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3ZvbCwgMSwgMCwgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCisJCQkJCSAgICAgICJMRkUgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAyLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCisJCQkJCSAgICAgICJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAxLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCisJCQkJCSAgICAgICJMRkUgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAyLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgaWYgKGkgPT0gQVVUT19TRVFfRlJPTlQpeworCQkJLyogYWRkIGNvbnRyb2wgdG8gbWl4ZXIgaW5kZXggMCAqLworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKKwkJCQkJICAgICAgIk1hc3RlciBGcm9udCBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTcsIDMsIDAsIEhEQV9JTlBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAorCQkJCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFN3aXRjaCIsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNywgMywgMCwgSERBX0lOUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJCisJCQkvKiBhZGQgY29udHJvbCB0byBQVzMgKi8KKwkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIGNobmFtZVtpXSk7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLCBuYW1lLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpXSk7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0gZWxzZSB7CisJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwgbmFtZSwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdm9sLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92b2wsIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dDE3MDhfYXV0b19jcmVhdGVfaHBfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBwaW4pCit7CisJaW50IGVycjsKKworCWlmICghcGluKQorCQlyZXR1cm4gMDsKKworCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IFZUMTcwOF9IUF9OSUQ7IC8qIEFPVzMgKi8KKworCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCisJCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsCisJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKHBpbiwgMywgMCwgSERBX09VVFBVVCkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAorCQkJICAgICAgIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLAorCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLworc3RhdGljIGludCB2dDE3MDhfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAorCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCXN0YXRpYyBjaGFyICpsYWJlbHNbXSA9IHsKKwkJIk1pYyIsICJGcm9udCBNaWMiLCAiTGluZSIsICJGcm9udCBMaW5lIiwgIkNEIiwgIkF1eCIsIE5VTEwKKwl9OworCXN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eDsKKwlpbnQgaSwgZXJyLCBpZHggPSAwOworCisJLyogZm9yIGludGVybmFsIGxvb3BiYWNrIHJlY29yZGluZyBzZWxlY3QgKi8KKwlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmxhYmVsID0gIlN0ZXJlbyBNaXhlciI7CisJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5pbmRleCA9IGlkeDsKKwlpbXV4LT5udW1faXRlbXMrKzsKKworCWZvciAoaSA9IDA7IGkgPCBBVVRPX1BJTl9MQVNUOyBpKyspIHsKKwkJaWYgKCFjZmctPmlucHV0X3BpbnNbaV0pCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGNmZy0+aW5wdXRfcGluc1tpXSkgeworCQljYXNlIDB4MWQ6IC8qIE1pYyAqLworCQkJaWR4ID0gMjsKKwkJCWJyZWFrOworCQkJCQorCQljYXNlIDB4MWU6IC8qIExpbmUgSW4gKi8KKwkJCWlkeCA9IDM7CisJCQlicmVhazsKKworCQljYXNlIDB4MjE6IC8qIEZyb250IE1pYyAqLworCQkJaWR4ID0gNDsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgyNDogLyogQ0QgKi8KKwkJCWlkeCA9IDE7CisJCQlicmVhazsKKwkJfQorCQllcnIgPSB2aWFfbmV3X2FuYWxvZ19pbnB1dChzcGVjLCBjZmctPmlucHV0X3BpbnNbaV0sIGxhYmVsc1tpXSwKKwkJCQkJICAgaWR4LCAweDE3KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmxhYmVsID0gbGFiZWxzW2ldOworCQlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmluZGV4ID0gaWR4OworCQlpbXV4LT5udW1faXRlbXMrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnQxNzA4X3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBlcnI7CisKKwllcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywgTlVMTCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gdnQxNzA4X2F1dG9fZmlsbF9kYWNfbmlkcyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJaWYgKCFzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cyAmJiAhc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKQorCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KKworCWVyciA9IHZ0MTcwOF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gdnQxNzA4X2F1dG9fY3JlYXRlX2hwX2N0bHMoc3BlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2dDE3MDhfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgKiAyOworCisJaWYgKHNwZWMtPmF1dG9jZmcuZGlnX291dF9waW4pCisJCXNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkID0gVlQxNzA4X0RJR09VVF9OSUQ7CisJaWYgKHNwZWMtPmF1dG9jZmcuZGlnX2luX3BpbikKKwkJc3BlYy0+ZGlnX2luX25pZCA9IFZUMTcwOF9ESUdJTl9OSUQ7CisKKwlpZiAoc3BlYy0+a2N0bF9hbGxvYykKKwkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSBzcGVjLT5rY3RsX2FsbG9jOworCisJc3BlYy0+aW5pdF92ZXJicyA9IHZ0MTcwOF92b2x1bWVfaW5pdF92ZXJiczsJCisKKwlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OworCisJcmV0dXJuIDE7Cit9CisKKy8qIGluaXQgY2FsbGJhY2sgZm9yIGF1dG8tY29uZmlndXJhdGlvbiBtb2RlbCAtLSBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IGluaXQgKi8KK3N0YXRpYyBpbnQgdmlhX2F1dG9faW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl2aWFfaW5pdChjb2RlYyk7CisJdmlhX2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOworCXZpYV9hdXRvX2luaXRfaHBfb3V0KGNvZGVjKTsKKwl2aWFfYXV0b19pbml0X2FuYWxvZ19pbnB1dChjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGF0Y2hfdnQxNzA4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYzsKKwlpbnQgZXJyOworCisJLyogY3JlYXRlIGEgY29kZWMgc3BlY2lmaWMgcmVjb3JkICovCisJc3BlYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpzcGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNwZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb2RlYy0+c3BlYyA9IHNwZWM7CisKKwkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KKwllcnIgPSB2dDE3MDhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOworCWlmIChlcnIgPCAwKSB7CisJCXZpYV9mcmVlKGNvZGVjKTsKKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgaWYgKCFlcnIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgorCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGdlbmVuaWMgbW9kZS4uLlxuIik7CisJfQorCisJCisJc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIlZUMTcwOCBBbmFsb2ciOworCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmdnQxNzA4X3BjbV9hbmFsb2dfcGxheWJhY2s7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0gJnZ0MTcwOF9wY21fYW5hbG9nX2NhcHR1cmU7CisKKwlzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsID0gIlZUMTcwOCBEaWdpdGFsIjsKKwlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZ2dDE3MDhfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CisJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9ICZ2dDE3MDhfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKKworCQorCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CisJCXNwZWMtPmFkY19uaWRzID0gdnQxNzA4X2FkY19uaWRzOworCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKHZ0MTcwOF9hZGNfbmlkcyk7CisJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IHZ0MTcwOF9jYXB0dXJlX21peGVyOworCQlzcGVjLT5udW1fbWl4ZXJzKys7CisJfQorCisJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7CisKKwljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSB2aWFfYXV0b19pbml0OworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2dDE3MDlfY2FwdHVyZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAyLCAweDE2LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDIsIDB4MTYsIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiBUaGUgbXVsdGlwbGUgIkNhcHR1cmUgU291cmNlIiBjb250cm9scyBjb25mdXNlIGFsc2FtaXhlcgorCQkgKiBTbyBjYWxsIHNvbWV3aGF0IGRpZmZlcmVudC4uCisJCSAqIEZJWE1FOiB0aGUgY29udHJvbHMgYXBwZWFyIGluIHRoZSAicGxheWJhY2siIHZpZXchCisJCSAqLworCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gdmlhX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSB2aWFfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gdmlhX211eF9lbnVtX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qCisgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgdnQxNzA5XzEwY2hfdm9sdW1lX2luaXRfdmVyYnNbXSA9IHsKKwkvKgorCSAqIFVubXV0ZSBBREMwLTIgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KKwkgKi8KKwl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKworCisJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCisJICogbWl4ZXIgd2lkZ2V0CisJICovCisJLyogQW1wIEluZGljZXM6IEFPVzA9MCwgQ0QgPSAxLCBNaWMxID0gMiwgTGluZSA9IDMsIE1pYzIgPSA0ICovCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDQpfSwKKworCS8qCisJICogU2V0IHVwIG91dHB1dCBzZWxlY3RvciAoMHgxYSwgMHgxYiwgMHgyOSkKKwkgKi8KKwkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDI5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCisJLyoKKwkgKiAgVW5tdXRlIFBXMyBhbmQgUFc0CisJICovCisJezB4MWYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisJezB4MjAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCisKKwkvKiBTZXQgaW5wdXQgb2YgUFc0IGFzIEFPVzQgKi8KKwl7MHgyMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MX0sCisJLyogU2V0IG1pYyBhcyBkZWZhdWx0IGlucHV0IG9mIHN3MCAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgyfSwKKwkvKiBQVzkgT3V0cHV0IGVuYWJsZSAqLworCXsweDI0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDlfMTBjaF9wY21fYW5hbG9nX3BsYXliYWNrID0geworCS5zdWJzdHJlYW1zID0gMSwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMTAsCisJLm5pZCA9IDB4MTAsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLworCS5vcHMgPSB7CisJCS5vcGVuID0gdmlhX3BsYXliYWNrX3BjbV9vcGVuLAorCQkucHJlcGFyZSA9IHZpYV9wbGF5YmFja19wY21fcHJlcGFyZSwKKwkJLmNsZWFudXAgPSB2aWFfcGxheWJhY2tfcGNtX2NsZWFudXAKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDlfNmNoX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSA2LAorCS5uaWQgPSAweDEwLCAvKiBOSUQgdG8gcXVlcnkgZm9ybWF0cyBhbmQgcmF0ZXMgKi8KKwkub3BzID0geworCQkub3BlbiA9IHZpYV9wbGF5YmFja19wY21fb3BlbiwKKwkJLnByZXBhcmUgPSB2aWFfcGxheWJhY2tfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gdmlhX3BsYXliYWNrX3BjbV9jbGVhbnVwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA5X3BjbV9hbmFsb2dfY2FwdHVyZSA9IHsKKwkuc3Vic3RyZWFtcyA9IDIsCisJLmNoYW5uZWxzX21pbiA9IDIsCisJLmNoYW5uZWxzX21heCA9IDIsCisJLm5pZCA9IDB4MTQsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyAqLworCS5vcHMgPSB7CisJCS5wcmVwYXJlID0gdmlhX2NhcHR1cmVfcGNtX3ByZXBhcmUsCisJCS5jbGVhbnVwID0gdmlhX2NhcHR1cmVfcGNtX2NsZWFudXAKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSB2dDE3MDlfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS8qIE5JRCBpcyBzZXQgaW4gdmlhX2J1aWxkX3BjbXMgKi8KKwkub3BzID0geworCQkub3BlbiA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX29wZW4sCisJCS5jbG9zZSA9IHZpYV9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gdnQxNzA5X3BjbV9kaWdpdGFsX2NhcHR1cmUgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorfTsKKworc3RhdGljIGludCB2dDE3MDlfYXV0b19maWxsX2RhY19uaWRzKHN0cnVjdCB2aWFfc3BlYyAqc3BlYywKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKK3sKKwlpbnQgaTsKKwloZGFfbmlkX3QgbmlkOworCisJaWYgKGNmZy0+bGluZV9vdXRzID09IDQpICAvKiAxMCBjaGFubmVscyAqLworCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IGNmZy0+bGluZV9vdXRzKzE7IC8qIEFPVzB+QU9XNCAqLworCWVsc2UgaWYgKGNmZy0+bGluZV9vdXRzID09IDMpIC8qIDYgY2hhbm5lbHMgKi8KKwkJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSBjZmctPmxpbmVfb3V0czsgLyogQU9XMH5BT1cyICovCisKKwlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7CisKKwlpZiAoY2ZnLT5saW5lX291dHMgPT0gNCkgeyAvKiAxMCBjaGFubmVscyAqLworCQlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5saW5lX291dHM7IGkrKykgeworCQkJbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOworCQkJaWYgKG5pZCkgeworCQkJCS8qIGNvbmZpZyBkYWMgbGlzdCAqLworCQkJCXN3aXRjaCAoaSkgeworCQkJCWNhc2UgQVVUT19TRVFfRlJPTlQ6CisJCQkJCS8qIEFPVzAgKi8KKwkJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSAweDEwOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFVVE9fU0VRX0NFTkxGRToKKwkJCQkJLyogQU9XMiAqLworCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVVUT19TRVFfU1VSUk9VTkQ6CisJCQkJCS8qIEFPVzMgKi8KKwkJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSAweDI3OworCQkJCQlicmVhazsKKwkJCQljYXNlIEFVVE9fU0VRX1NJREU6CisJCQkJCS8qIEFPVzEgKi8KKwkJCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSAweDExOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbY2ZnLT5saW5lX291dHNdID0gMHgyODsgLyogQU9XNCAqLworCisJfSBlbHNlIGlmIChjZmctPmxpbmVfb3V0cyA9PSAzKSB7IC8qIDYgY2hhbm5lbHMgKi8KKwkJZm9yKGkgPSAwOyBpIDwgY2ZnLT5saW5lX291dHM7IGkrKykgeworCQkJbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOworCQkJaWYgKG5pZCkgeworCQkJCS8qIGNvbmZpZyBkYWMgbGlzdCAqLworCQkJCXN3aXRjaChpKSB7CisJCQkJY2FzZSBBVVRPX1NFUV9GUk9OVDoKKwkJCQkJLyogQU9XMCAqLworCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVVUT19TRVFfQ0VOTEZFOgorCQkJCQkvKiBBT1cyICovCisJCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID0gMHgxMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVVRPX1NFUV9TVVJST1VORDoKKwkJCQkJLyogQU9XMSAqLworCQkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IDB4MTE7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLworc3RhdGljIGludCB2dDE3MDlfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKK3sKKwljaGFyIG5hbWVbMzJdOworCXN0YXRpYyBjb25zdCBjaGFyICpjaG5hbWVbNF0gPSB7ICJGcm9udCIsICJTdXJyb3VuZCIsICJDL0xGRSIsICJTaWRlIiB9OworCWhkYV9uaWRfdCBuaWQgPSAwOworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDw9IEFVVE9fU0VRX1NJREU7IGkrKykgeworCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07CisKKwkJaWYgKCFuaWQpCQorCQkJY29udGludWU7CisKKwkJaWYgKGkgPT0gQVVUT19TRVFfQ0VOTEZFKSB7CisJCQkvKiBDZW50ZXIvTEZFICovCisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLAorCQkJCQkgICAgICAiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxYiwgMSwgMCwgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsCisJCQkJCSAgICAgICJMRkUgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAyLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCisJCQkJCSAgICAgICJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAxLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCisJCQkJCSAgICAgICJMRkUgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAyLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgaWYgKGkgPT0gQVVUT19TRVFfRlJPTlQpeworCQkJLyogYWRkIGNvbnRyb2wgdG8gbWl4ZXIgaW5kZXggMCAqLworCQkJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKKwkJCQkJICAgICAgIk1hc3RlciBGcm9udCBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTgsIDMsIDAsIEhEQV9JTlBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9NVVRFLAorCQkJCQkgICAgICAiTWFzdGVyIEZyb250IFBsYXliYWNrIFN3aXRjaCIsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxOCwgMywgMCwgSERBX0lOUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJCisJCQkvKiBhZGQgY29udHJvbCB0byBQVzMgKi8KKwkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIGNobmFtZVtpXSk7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfVk9MLCBuYW1lLAorCQkJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpXSk7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0gZWxzZSBpZiAoaSA9PSBBVVRPX1NFUV9TVVJST1VORCkgeworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgyOSwgMywgMCwgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpXSk7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDI5LCAzLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgaWYgKGkgPT0gQVVUT19TRVFfU0lERSkgeworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IHZpYV9hZGRfY29udHJvbChzcGVjLCBWSUFfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxYSwgMywgMCwgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpXSk7CisJCQllcnIgPSB2aWFfYWRkX2NvbnRyb2woc3BlYywgVklBX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKKwkJCQkJICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFhLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnQxNzA5X2F1dG9fY3JlYXRlX2hwX2N0bHMoc3RydWN0IHZpYV9zcGVjICpzcGVjLCBoZGFfbmlkX3QgcGluKQoreworCWludCBlcnI7CisKKwlpZiAoIXBpbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPT0gNSkgLyogMTAgY2hhbm5lbHMgKi8KKwkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gVlQxNzA5X0hQX0RBQ19OSUQ7CisJZWxzZSBpZiAoc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPT0gMykgLyogNiBjaGFubmVscyAqLworCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSAwOworCisJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX1ZPTCwKKwkJCSAgICAgICJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwKKwkJCSAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gdmlhX2FkZF9jb250cm9sKHNwZWMsIFZJQV9DVExfV0lER0VUX01VVEUsCisJCQkgICAgICAiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsCisJCQkgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKHBpbiwgMywgMCwgSERBX09VVFBVVCkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNyZWF0ZSBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciBpbnB1dCBwaW5zICovCitzdGF0aWMgaW50IHZ0MTcwOV9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsCisJCQkJCQljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCit7CisJc3RhdGljIGNoYXIgKmxhYmVsc1tdID0geworCQkiTWljIiwgIkZyb250IE1pYyIsICJMaW5lIiwgIkZyb250IExpbmUiLCAiQ0QiLCAiQXV4IiwgTlVMTAorCX07CisJc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OworCWludCBpLCBlcnIsIGlkeCA9IDA7CisKKwkvKiBmb3IgaW50ZXJuYWwgbG9vcGJhY2sgcmVjb3JkaW5nIHNlbGVjdCAqLworCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10ubGFiZWwgPSAiU3RlcmVvIE1peGVyIjsKKwlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmluZGV4ID0gaWR4OworCWltdXgtPm51bV9pdGVtcysrOworCisJZm9yIChpID0gMDsgaSA8IEFVVE9fUElOX0xBU1Q7IGkrKykgeworCQlpZiAoIWNmZy0+aW5wdXRfcGluc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoY2ZnLT5pbnB1dF9waW5zW2ldKSB7CisJCWNhc2UgMHgxZDogLyogTWljICovCisJCQlpZHggPSAyOworCQkJYnJlYWs7CisJCQkJCisJCWNhc2UgMHgxZTogLyogTGluZSBJbiAqLworCQkJaWR4ID0gMzsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgyMTogLyogRnJvbnQgTWljICovCisJCQlpZHggPSA0OworCQkJYnJlYWs7CisKKwkJY2FzZSAweDIzOiAvKiBDRCAqLworCQkJaWR4ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWVyciA9IHZpYV9uZXdfYW5hbG9nX2lucHV0KHNwZWMsIGNmZy0+aW5wdXRfcGluc1tpXSwgbGFiZWxzW2ldLAorCQkJCQkgICBpZHgsIDB4MTgpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10ubGFiZWwgPSBsYWJlbHNbaV07CisJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10uaW5kZXggPSBpZHg7CisJCWltdXgtPm51bV9pdGVtcysrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dDE3MDlfcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGVycjsKKworCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2dDE3MDlfYXV0b19maWxsX2RhY19uaWRzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzICYmICFzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pCisJCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIEJJT1MgcGluIGNvbmZpZyAqLworCisJZXJyID0gdnQxNzA5X2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB2dDE3MDlfYXV0b19jcmVhdGVfaHBfY3RscyhzcGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHZ0MTcwOV9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7CisKKwlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0X3BpbikKKwkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBWVDE3MDlfRElHT1VUX05JRDsKKwlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfaW5fcGluKQorCQlzcGVjLT5kaWdfaW5fbmlkID0gVlQxNzA5X0RJR0lOX05JRDsKKworCWlmIChzcGVjLT5rY3RsX2FsbG9jKQorCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxfYWxsb2M7CisKKwlzcGVjLT5pbnB1dF9tdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGF0Y2hfdnQxNzA5XzEwY2goc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjOworCWludCBlcnI7CisKKwkvKiBjcmVhdGUgYSBjb2RlYyBzcGVjaWZpYyByZWNvcmQgKi8KKwlzcGVjID0ga2NhbGxvYygxLCBzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3BlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvZGVjLT5zcGVjID0gc3BlYzsKKworCWVyciA9IHZ0MTcwOV9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJaWYgKGVyciA8IDApIHsKKwkJdmlhX2ZyZWUoY29kZWMpOworCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAoIWVycikgeworCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbi4gICIKKwkJICAgICAgICJVc2luZyBnZW5lbmljIG1vZGUuLi5cbiIpOworCX0KKworCXNwZWMtPmluaXRfdmVyYnMgPSB2dDE3MDlfMTBjaF92b2x1bWVfaW5pdF92ZXJiczsJCisKKwlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiVlQxNzA5IEFuYWxvZyI7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZ2dDE3MDlfMTBjaF9wY21fYW5hbG9nX3BsYXliYWNrOworCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2dDE3MDlfcGNtX2FuYWxvZ19jYXB0dXJlOworCisJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJWVDE3MDkgRGlnaXRhbCI7CisJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmdnQxNzA5X3BjbV9kaWdpdGFsX3BsYXliYWNrOworCXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUgPSAmdnQxNzA5X3BjbV9kaWdpdGFsX2NhcHR1cmU7CisKKwkKKwlpZiAoIXNwZWMtPmFkY19uaWRzICYmIHNwZWMtPmlucHV0X211eCkgeworCQlzcGVjLT5hZGNfbmlkcyA9IHZ0MTcwOV9hZGNfbmlkczsKKwkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRSh2dDE3MDlfYWRjX25pZHMpOworCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPSB2dDE3MDlfY2FwdHVyZV9taXhlcjsKKwkJc3BlYy0+bnVtX21peGVycysrOworCX0KKworCWNvZGVjLT5wYXRjaF9vcHMgPSB2aWFfcGF0Y2hfb3BzOworCisJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gdmlhX2F1dG9faW5pdDsKKworCXJldHVybiAwOworfQorLyoKKyAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKKyAqLworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiB2dDE3MDlfNmNoX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7CisJLyoKKwkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCisJICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisKKworCS8qIFVubXV0ZSBpbnB1dCBhbXBzIChDRCwgTGluZSBJbiwgTWljIDEgJiBNaWMgMikgb2YgdGhlIGFuYWxvZy1sb29wYmFjaworCSAqIG1peGVyIHdpZGdldAorCSAqLworCS8qIEFtcCBJbmRpY2VzOiBBT1cwPTAsIENEID0gMSwgTWljMSA9IDIsIExpbmUgPSAzLCBNaWMyID0gNCAqLworCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCisKKwkvKgorCSAqIFNldCB1cCBvdXRwdXQgc2VsZWN0b3IgKDB4MWEsIDB4MWIsIDB4MjkpCisJICovCisJLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgyOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKworCS8qCisJICogIFVubXV0ZSBQVzMgYW5kIFBXNAorCSAqLworCXsweDFmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCXsweDIwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAorCisJLyogU2V0IGlucHV0IG9mIFBXNCBhcyBNVzAgKi8KKwl7MHgyMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB9LAorCS8qIFNldCBtaWMgYXMgZGVmYXVsdCBpbnB1dCBvZiBzdzAgKi8KKwl7MHgxOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4Mn0sCisJLyogUFc5IE91dHB1dCBlbmFibGUgKi8KKwl7MHgyNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfdnQxNzA5XzZjaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWM7CisJaW50IGVycjsKKworCS8qIGNyZWF0ZSBhIGNvZGVjIHNwZWNpZmljIHJlY29yZCAqLworCXNwZWMgPSBrY2FsbG9jKDEsIHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJZXJyID0gdnQxNzA5X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkgeworCQl2aWFfZnJlZShjb2RlYyk7CisJCXJldHVybiBlcnI7CisJfSBlbHNlIGlmICghZXJyKSB7CisJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uLiAgIgorCQkgICAgICAgIlVzaW5nIGdlbmVuaWMgbW9kZS4uLlxuIik7CisJfQorCisJc3BlYy0+aW5pdF92ZXJicyA9IHZ0MTcwOV82Y2hfdm9sdW1lX2luaXRfdmVyYnM7CQorCisJc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nID0gIlZUMTcwOSBBbmFsb2ciOworCXNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2sgPSAmdnQxNzA5XzZjaF9wY21fYW5hbG9nX3BsYXliYWNrOworCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2dDE3MDlfcGNtX2FuYWxvZ19jYXB0dXJlOworCisJc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCA9ICJWVDE3MDkgRGlnaXRhbCI7CisJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2sgPSAmdnQxNzA5X3BjbV9kaWdpdGFsX3BsYXliYWNrOworCXNwZWMtPnN0cmVhbV9kaWdpdGFsX2NhcHR1cmUgPSAmdnQxNzA5X3BjbV9kaWdpdGFsX2NhcHR1cmU7CisKKwkKKwlpZiAoIXNwZWMtPmFkY19uaWRzICYmIHNwZWMtPmlucHV0X211eCkgeworCQlzcGVjLT5hZGNfbmlkcyA9IHZ0MTcwOV9hZGNfbmlkczsKKwkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRSh2dDE3MDlfYWRjX25pZHMpOworCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPSB2dDE3MDlfY2FwdHVyZV9taXhlcjsKKwkJc3BlYy0+bnVtX21peGVycysrOworCX0KKworCWNvZGVjLT5wYXRjaF9vcHMgPSB2aWFfcGF0Y2hfb3BzOworCisJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gdmlhX2F1dG9faW5pdDsKKworCXJldHVybiAwOworfQorCisvKgorICogcGF0Y2ggZW50cmllcworICovCitzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF92aWFbXSA9IHsKKwl7IC5pZCA9IDB4MTEwNjE3MDgsIC5uYW1lID0gIlZJQSBWVDE3MDgiLCAucGF0Y2ggPSBwYXRjaF92dDE3MDh9LAorCXsgLmlkID0gMHgxMTA2MTcwOSwgLm5hbWUgPSAiVklBIFZUMTcwOCIsIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOH0sCisJeyAuaWQgPSAweDExMDYxNzBBLCAubmFtZSA9ICJWSUEgVlQxNzA4IiwgLnBhdGNoID0gcGF0Y2hfdnQxNzA4fSwKKwl7IC5pZCA9IDB4MTEwNjE3MEIsIC5uYW1lID0gIlZJQSBWVDE3MDgiLCAucGF0Y2ggPSBwYXRjaF92dDE3MDh9LAorCXsgLmlkID0gMHgxMTA2RTcxMCwgLm5hbWUgPSAiVklBIFZUMTcwOSAxMC1DaCIsIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOV8xMGNofSwKKwl7IC5pZCA9IDB4MTEwNkU3MTEsIC5uYW1lID0gIlZJQSBWVDE3MDkgMTAtQ2giLCAucGF0Y2ggPSBwYXRjaF92dDE3MDlfMTBjaH0sCisJeyAuaWQgPSAweDExMDZFNzEyLCAubmFtZSA9ICJWSUEgVlQxNzA5IDEwLUNoIiwgLnBhdGNoID0gcGF0Y2hfdnQxNzA5XzEwY2h9LAorCXsgLmlkID0gMHgxMTA2RTcxMywgLm5hbWUgPSAiVklBIFZUMTcwOSAxMC1DaCIsIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOV8xMGNofSwKKwl7IC5pZCA9IDB4MTEwNkU3MTQsIC5uYW1lID0gIlZJQSBWVDE3MDkgNi1DaCIsIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOV82Y2h9LAorCXsgLmlkID0gMHgxMTA2RTcxNSwgLm5hbWUgPSAiVklBIFZUMTcwOSA2LUNoIiwgLnBhdGNoID0gcGF0Y2hfdnQxNzA5XzZjaH0sCisJeyAuaWQgPSAweDExMDZFNzE2LCAubmFtZSA9ICJWSUEgVlQxNzA5IDYtQ2giLCAucGF0Y2ggPSBwYXRjaF92dDE3MDlfNmNofSwKKwl7IC5pZCA9IDB4MTEwNkU3MTcsIC5uYW1lID0gIlZJQSBWVDE3MDkgNi1DaCIsIC5wYXRjaCA9IHBhdGNoX3Z0MTcwOV82Y2h9LAorCXt9IC8qIHRlcm1pbmF0b3IgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9NYWtlZmlsZSBiL3NvdW5kL3BjaS9pY2UxNzEyL01ha2VmaWxlCmluZGV4IDc4MzdjZWYuLjZlZmRkNjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL01ha2VmaWxlCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogCiBzbmQtaWNlMTd4eC1hazR4eHgtb2JqcyA6PSBhazR4eHgubwogc25kLWljZTE3MTItb2JqcyA6PSBpY2UxNzEyLm8gZGVsdGEubyBob29udGVjaC5vIGV3cy5vCi1zbmQtaWNlMTcyNC1vYmpzIDo9IGljZTE3MjQubyBhbXAubyByZXZvLm8gYXVyZW9uLm8gdnQxNzIwX21vYm8ubyBwb250aXMubyBwcm9kaWd5MTkyLm8ganVsaS5vIHBoYXNlLm8KK3NuZC1pY2UxNzI0LW9ianMgOj0gaWNlMTcyNC5vIGFtcC5vIHJldm8ubyBhdXJlb24ubyB2dDE3MjBfbW9iby5vIHBvbnRpcy5vIHByb2RpZ3kxOTIubyBqdWxpLm8gcGhhc2UubyB3dG0ubwogCiAjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5CiBvYmotJChDT05GSUdfU05EX0lDRTE3MTIpICs9IHNuZC1pY2UxNzEyLm8gc25kLWljZTE3eHgtYWs0eHh4Lm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2FtcC5jIGIvc291bmQvcGNpL2ljZTE3MTIvYW1wLmMKaW5kZXggNTljNDA3OC4uNmUyMmQzMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvYW1wLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYW1wLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgc25kX3Z0MTcyNF9hbXBfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgd21faW5pdHNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgd21faW5pdHNbXSA9IHsKIAkJV01fQVRURU5fTCwJMHgwMDAwLAkvKiAwIGRiICovCiAJCVdNX0FUVEVOX1IsCTB4MDAwMCwJLyogMCBkYiAqLwogCQlXTV9EQUNfQ1RSTCwJMHgwMDA4LAkvKiAyNGJpdCBJMlMgKi8KQEAgLTc1LDcgKzc1LDcgQEAKIAogCiAvKiBlbnRyeSBwb2ludCAqLwotc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X2FtcF9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Citjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfYW1wX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX0FWNzEwLAogCQkubmFtZSA9ICJDaGFpbnRlY2ggQVYtNzEwIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2FtcC5oIGIvc291bmQvcGNpL2ljZTE3MTIvYW1wLmgKaW5kZXggYTBmYzg5Yi4uN2I2NjdiYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvYW1wLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYW1wLmgKQEAgLTQyLDcgKzQyLDcgQEAKICNkZWZpbmUgV01fREFDX0NUUkwJMHgwMgogI2RlZmluZSBXTV9JTlRfQ1RSTAkweDAzCiAKLWV4dGVybiBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICBzbmRfdnQxNzI0X2FtcF9jYXJkc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjRfYW1wX2NhcmRzW107CiAKIAogI2VuZGlmIC8qIF9fU09VTkRfQU1QX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMKaW5kZXggOWU3NmNlYi4uNjk0MWQ4NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMKQEAgLTI5NCw3ICsyOTQsNyBAQAogc3RhdGljIGludCBhdXJlb25fYWM5N19pbml0IChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKIAlpbnQgaTsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWM5N19kZWZhdWx0c1tdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBhYzk3X2RlZmF1bHRzW10gPSB7CiAJCTB4MDAsIDB4OTY0MCwKIAkJMHgwMiwgMHg4MDAwLAogCQkweDA0LCAweDgwMDAsCkBAIC00NzQsNyArNDc0LDggQEAKIAogCXRtcCA9IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpOwogCi0JaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUKSB7CisJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUIHx8CisJICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MVhUKSB7CiAJCXNuZF9pY2UxNzEyX2dwaW9fc2V0X21hc2soaWNlLCB+KFBST0RJR1lfU1BJX01PU0l8UFJPRElHWV9TUElfQ0xLfFBST0RJR1lfV01fQ1MpKTsKIAkJbW9zaSA9IFBST0RJR1lfU1BJX01PU0k7CiAJCWNsayA9IFBST0RJR1lfU1BJX0NMSzsKQEAgLTYwMSw3ICs2MDIsOSBAQAogc3RhdGljIHZvaWQgd21fcHV0X25vY2FjaGUoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIGludCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbCkKIHsKIAlhdXJlb25fc3BpX3dyaXRlKGljZSwKLQkJCShpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCA/IFBST0RJR1lfV01fQ1MgOiBBVVJFT05fV01fQ1MpLAorCQkJICgoaWNlLT5lZXByb20uc3VidmVuZG9yID09IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQgfHwKKwkJCSAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MVhUKSA/CisJCQkgUFJPRElHWV9XTV9DUyA6IEFVUkVPTl9XTV9DUyksCiAJCQkocmVnIDw8IDkpIHwgKHZhbCAmIDB4MWZmKSwgMTYpOwogfQogCkBAIC02NjEsMTcgKzY2NCwxNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV93bV9kYWMsIC0xMjcwMCwgMTAwLCAxKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV93bV9wY20sIC02NDAwLCA1MCwgMSk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfd21fYWRjLCAtMTIwMCwgMTAwLCAwKTsKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hYzk3X21hc3RlciwgLTQ2NTAsIDE1MCwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYWM5N19nYWluLCAtMzQ1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV93bV9kYWMsIC0xMjcwMCwgMTAwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV93bV9wY20sIC02NDAwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfd21fYWRjLCAtMTIwMCwgMTAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hYzk3X21hc3RlciwgLTQ2NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYWM5N19nYWluLCAtMzQ1MCwgMTUwLCAwKTsKIAogLyoKICAqIExvZ2FyaXRobWljIHZvbHVtZSB2YWx1ZXMgZm9yIFdNODc3MAogICogQ29tcHV0ZWQgYXMgMjAgKiBMb2cxMCgyNTUgLyB4KQogICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciB3bV92b2xbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHdtX3ZvbFsyNTZdID0gewogCTEyNywgNDgsIDQyLCAzOSwgMzYsIDM0LCAzMywgMzEsIDMwLCAyOSwgMjgsIDI3LCAyNywgMjYsIDI1LCAyNSwgMjQsIDI0LCAyMywKIAkyMywgMjIsIDIyLCAyMSwgMjEsIDIxLCAyMCwgMjAsIDIwLCAxOSwgMTksIDE5LCAxOCwgMTgsIDE4LCAxOCwgMTcsIDE3LCAxNywKIAkxNywgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywKQEAgLTEwNjQsMTQgKzEwNjcsMTQgQEAKICAqLwogc3RhdGljIGludCB3bV9hZGNfbXV4X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7Ci0Jc3RhdGljIGNoYXIgKnRleHRzW10gPSB7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0c1tdID0gewogCQkiQ0QiLAkJLy9BSU4xCiAJCSJBdXgiLAkJLy9BSU4yCiAJCSJMaW5lIiwJCS8vQUlOMwogCQkiTWljIiwJCS8vQUlONAogCQkiQUM5NyIJCS8vQUlONQogCX07Ci0Jc3RhdGljIGNoYXIgKnVuaXZlcnNlX3RleHRzW10gPSB7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1bml2ZXJzZV90ZXh0c1tdID0gewogCQkiQXV4MSIsCQkvL0FJTjEKIAkJIkNEIiwJCS8vQUlOMgogCQkiUGhvbm8iLAkvL0FJTjMKQEAgLTExMzcsMTEgKzExNDAsMTEgQEAKIHN0YXRpYyBpbnQgYXVyZW9uX2NzODQxNV9tdXhfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdGF0aWMgY2hhciAqYXVyZW9uX3RleHRzW10gPSB7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdXJlb25fdGV4dHNbXSA9IHsKIAkJIkNEIiwJCS8vUlhQMAogCQkiT3B0aWNhbCIJLy9SWFAxCiAJfTsKLQlzdGF0aWMgY2hhciAqcHJvZGlneV90ZXh0c1tdID0geworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHJvZGlneV90ZXh0c1tdID0gewogCQkiQ0QiLAogCQkiQ29heCIKIAl9OwpAQCAtMTI4OCwxMiArMTI5MSwxNCBAQAogCiAJdG1wMiA9IHRtcCA9IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpOwogCWlmIChlbmFibGUpCi0JCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCkKKwkJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUICYmCisJCSAgICBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFYVCkKIAkJCXRtcCB8PSBBVVJFT05fSFBfU0VMOwogCQllbHNlCiAJCQl0bXAgfD0gUFJPRElHWV9IUF9TRUw7CiAJZWxzZQotCQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yICE9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQpCisJCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCAmJgorCQkgICAgaWNlLT5lZXByb20uc3VidmVuZG9yICE9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxWFQpCiAJCQl0bXAgJj0gfiBBVVJFT05fSFBfU0VMOwogCQllbHNlCiAJCQl0bXAgJj0gfiBQUk9ESUdZX0hQX1NFTDsKQEAgLTEzNjMsNyArMTM2OCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYXVyZW9uX292ZXJzYW1wbGluZ19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmssIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7Ci0Jc3RhdGljIGNoYXIgKnRleHRzWzJdID0geyAiMTI4eCIsICI2NHgiCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0c1syXSA9IHsgIjEyOHgiLCAiNjR4Igl9OwogCiAJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CiAJdWluZm8tPmNvdW50ID0gMTsKQEAgLTE0MDYsNyArMTQxMSw3IEBACiAgKiBtaXhlcnMKICAqLwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYXVyZW9uX2RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYXVyZW9uX2RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCkBAIC0xNTIxLDcgKzE1MjYsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd21fY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogIAl7CiAgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiUENNIFBsYXliYWNrIFN3aXRjaCIsCkBAIC0xNTg3LDcgKzE1OTIsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhYzk3X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhYzk3X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKICAJewogIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIkFDOTcgUGxheWJhY2sgU3dpdGNoIiwKQEAgLTE2OTIsNyArMTY5Nyw3IEBACiAgCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB1bml2ZXJzZV9hYzk3X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB1bml2ZXJzZV9hYzk3X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKICAJewogIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIkFDOTcgUGxheWJhY2sgU3dpdGNoIiwKQEAgLTE4MjQsOCArMTgyOSw3IEBACiAKIH07CiAKLQkKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjczg0MTVfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzODQxNV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsQ0FQVFVSRSxTV0lUQ0gpLApAQCAtMTg3MCw3ICsxODc0LDYgQEAKIAl9CiB9OwogCi0gCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdXJlb25fYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCXVuc2lnbmVkIGludCBpLCBjb3VudHM7CkBAIC0xODk4LDcgKzE5MDEsOCBAQAogCQkJCXJldHVybiBlcnI7CiAJCX0KIAl9Ci0JZWxzZSBpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yICE9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQpIHsKKwllbHNlIGlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCAmJgorCQkgaWNlLT5lZXByb20uc3VidmVuZG9yICE9IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxWFQpIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWM5N19jb250cm9scyk7IGkrKykgewogCQkJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLCBzbmRfY3RsX25ldzEoJmFjOTdfY29udHJvbHNbaV0sIGljZSkpOwogCQkJaWYgKGVyciA8IDApCkBAIC0xOTA2LDcgKzE5MTAsOCBAQAogCQl9CiAJfQogCi0JaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUKSB7CisJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUICYmCisJICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MVhUKSB7CiAJCXVuc2lnbmVkIGNoYXIgaWQ7CiAJCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKIAkJaWQgPSBhdXJlb25fY3M4NDE1X2dldChpY2UsIENTODQxNV9JRCk7CkBAIC0xOTM2LDcgKzE5NDEsNyBAQAogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdXJlb25faW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgd21faW5pdHNfYXVyZW9uW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdtX2luaXRzX2F1cmVvbltdID0gewogCQkvKiBUaGVzZSBjb21lIGZpcnN0IHRvIHJlZHVjZSBpbml0IHBvcCBub2lzZSAqLwogCQkweDFiLCAweDA0NCwJCS8qIEFEQyBNdXggKEFDJzk3IHNvdXJjZSkgKi8KIAkJMHgxYywgMHgwMEIsCQkvKiBPdXQgTXV4MSAoVk9VVDEgPSBEQUMrQVVYLCBWT1VUMiA9IERBQykgKi8KQEAgLTE5NzIsNyArMTk3Nyw3IEBACiAJCTB4MWEsIDB4MDAwLAkJLyogLTEyZEIgQURDL1IgKi8KIAkJKHVuc2lnbmVkIHNob3J0KS0xCiAJfTsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgd21faW5pdHNfcHJvZGlneVtdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB3bV9pbml0c19wcm9kaWd5W10gPSB7CiAKIAkJLyogVGhlc2UgY29tZSBmaXJzdCB0byByZWR1Y2UgaW5pdCBwb3Agbm9pc2UgKi8KIAkJMHgxYiwgMHgwMDAsCQkvKiBBREMgTXV4ICovCkBAIC0yMDE0LDcgKzIwMTksNyBAQAogCQkodW5zaWduZWQgc2hvcnQpLTEKIAogCX07Ci0Jc3RhdGljIHVuc2lnbmVkIHNob3J0IGNzX2luaXRzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGNzX2luaXRzW10gPSB7CiAJCTB4MDQ0MSwgLyogUlVOICovCiAJCTB4MDE4MCwgLyogbm8gbXV0ZSwgT01DSyBvdXRwdXQgb24gUk1DSyBwaW4gKi8KIAkJMHgwMjAxLCAvKiBTL1BESUYgc291cmNlIG9uIFJYUDEgKi8KQEAgLTIwMjIsNyArMjAyNyw3IEBACiAJCSh1bnNpZ25lZCBzaG9ydCktMQogCX07CiAJdW5zaWduZWQgaW50IHRtcDsKLQl1bnNpZ25lZCBzaG9ydCAqcDsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqcDsKIAlpbnQgZXJyLCBpOwogCiAJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX0FVUkVPTjUxX1NLWSkgewpAQCAtMjA2Miw3ICsyMDY3LDggQEAKIAogCS8qIGluaXRpYWxpemUgV004NzcwIGNvZGVjICovCiAJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MSB8fAotCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCkKKwkJaWNlLT5lZXByb20uc3VidmVuZG9yID09IFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxTFQgfHwKKwkgICAgICAgIGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MVhUKQogCQlwID0gd21faW5pdHNfcHJvZGlneTsKIAllbHNlCiAJCXAgPSB3bV9pbml0c19hdXJlb247CkBAIC0yMDcwLDcgKzIwNzYsOCBAQAogCQl3bV9wdXQoaWNlLCBwWzBdLCBwWzFdKTsKIAogCS8qIGluaXRpYWxpemUgQ1M4NDE1QSBjb2RlYyAqLwotCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCkgeworCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCAmJgorCSAgICBpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFYVCkgewogCQlmb3IgKHAgPSBjc19pbml0czsgKnAgIT0gKHVuc2lnbmVkIHNob3J0KS0xOyBwKyspCiAJCQlhdXJlb25fc3BpX3dyaXRlKGljZSwgQVVSRU9OX0NTODQxNV9DUywgKnAgfCAweDIwMDAwMCwgMjQpOwogCQlpY2UtPnNwZWMuYXVyZW9uLmNzODQxNV9tdXggPSAxOwpAQCAtMjEwMCw3MyArMjEwNyw1OCBAQAogICogaGVuY2UgdGhlIGRyaXZlciBuZWVkcyB0byBzZXRzIHVwIGl0IHByb3Blcmx5LgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGF1cmVvbjUxX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JMHgwYSwJLyogU1lTQ09ORjogY2xvY2sgNTEyLCBzcGRpZi1pbi9BREMsIDNEQUNzICovCi0JMHg4MCwJLyogQUNMSU5LOiBJMlMgKi8KLQkweGZjLAkvKiBJMlM6IHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLwotCTB4YzMsCS8qIFNQRElGOiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCi0JMHhmZiwJLyogR1BJT19ESVIgKi8KLQkweGZmLAkvKiBHUElPX0RJUjEgKi8KLQkweDVmLAkvKiBHUElPX0RJUjIgKi8KLQkweDAwLAkvKiBHUElPX01BU0sgKi8KLQkweDAwLAkvKiBHUElPX01BU0sxICovCi0JMHgwMCwJLyogR1BJT19NQVNLMiAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUyICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhdXJlb241MV9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDBhLAkvKiBjbG9jayA1MTIsIHNwZGlmLWluL0FEQywgM0RBQ3MgKi8KKwlbSUNFX0VFUDJfQUNMSU5LXSAgICAgID0gMHg4MCwJLyogSTJTICovCisJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4ZmMsCS8qIHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLworCVtJQ0VfRUVQMl9TUERJRl0gICAgICAgPSAweGMzLAkvKiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCisJW0lDRV9FRVAyX0dQSU9fRElSXSAgICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMV0gICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMl0gICA9IDB4NWYsCisJW0lDRV9FRVAyX0dQSU9fTUFTS10gICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzFdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzJdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEVdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUxXSA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MDAsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhdXJlb243MV9lZXByb21bXSBfX2RldmluaXRkYXRhID0gewotCTB4MGIsCS8qIFNZU0NPTkY6IGNsb2NrIDUxMiwgc3BkaWYtaW4vQURDLCA0REFDcyAqLwotCTB4ODAsCS8qIEFDTElOSzogSTJTICovCi0JMHhmYywJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KLQkweGMzLAkvKiBTUERJRjogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLwotCTB4ZmYsCS8qIEdQSU9fRElSICovCi0JMHhmZiwJLyogR1BJT19ESVIxICovCi0JMHg1ZiwJLyogR1BJT19ESVIyICovCi0JMHgwMCwJLyogR1BJT19NQVNLICovCi0JMHgwMCwJLyogR1BJT19NQVNLMSAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSzIgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFICovCi0JMHgwMCwJLyogR1BJT19TVEFURTEgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXVyZW9uNzFfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKKwlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgwYiwJLyogY2xvY2sgNTEyLCBzcGRpZi1pbi9BREMsIDREQUNzICovCisJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4ODAsCS8qIEkyUyAqLworCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweGZjLAkvKiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KKwlbSUNFX0VFUDJfU1BESUZdICAgICAgID0gMHhjMywJLyogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLworCVtJQ0VfRUVQMl9HUElPX0RJUl0gICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjFdICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjJdICAgPSAweDVmLAorCVtJQ0VfRUVQMl9HUElPX01BU0tdICAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX01BU0sxXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX01BU0syXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFMV0gPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFMl0gPSAweDAwLAogfTsKKyNkZWZpbmUgcHJvZGlneTcxX2VlcHJvbSBhdXJlb243MV9lZXByb20KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgcHJvZGlneTcxX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JMHgwYiwJLyogU1lTQ09ORjogY2xvY2sgNTEyLCBzcGRpZi1pbi9BREMsIDREQUNzICovCi0JMHg4MCwJLyogQUNMSU5LOiBJMlMgKi8KLQkweGZjLAkvKiBJMlM6IHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLwotCTB4YzMsCS8qIFNQRElGOiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCi0JMHhmZiwJLyogR1BJT19ESVIgKi8KLQkweGZmLAkvKiBHUElPX0RJUjEgKi8KLQkweDVmLAkvKiBHUElPX0RJUjIgKi8KLQkweDAwLAkvKiBHUElPX01BU0sgKi8KLQkweDAwLAkvKiBHUElPX01BU0sxICovCi0JMHgwMCwJLyogR1BJT19NQVNLMiAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUyICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwcm9kaWd5NzFsdF9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDRiLAkvKiBjbG9jayAzODQsIHNwZGlmLWluL0FEQywgNERBQ3MgKi8KKwlbSUNFX0VFUDJfQUNMSU5LXSAgICAgID0gMHg4MCwJLyogSTJTICovCisJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4ZmMsCS8qIHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLworCVtJQ0VfRUVQMl9TUERJRl0gICAgICAgPSAweGMzLAkvKiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCisJW0lDRV9FRVAyX0dQSU9fRElSXSAgICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMV0gICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMl0gICA9IDB4NWYsCisJW0lDRV9FRVAyX0dQSU9fTUFTS10gICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzFdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzJdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEVdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUxXSA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MDAsCiB9OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwcm9kaWd5NzFsdF9lZXByb21bXSBfX2RldmluaXRkYXRhID0gewotCTB4NGIsCS8qIFNZU0NJTkY6IGNsb2NrIDUxMiwgc3BkaWYtaW4vQURDLCA0REFDcyAqLwotCTB4ODAsCS8qIEFDTElOSzogSTJTICovCi0JMHhmYywJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KLQkweGMzLAkvKiBTUERJRjogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLwotCTB4ZmYsCS8qIEdQSU9fRElSICovCi0JMHhmZiwJLyogR1BJT19ESVIxICovCi0JMHg1ZiwJLyogR1BJT19ESVIyICovCi0JMHgwMCwJLyogR1BJT19NQVNLICovCi0JMHgwMCwJLyogR1BJT19NQVNLMSAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSzIgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFICovCi0JMHgwMCwJLyogR1BJT19TVEFURTEgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMiAqLwotfTsKLQkKKyNkZWZpbmUgcHJvZGlneTcxeHRfZWVwcm9tIHByb2RpZ3k3MWx0X2VlcHJvbQogCiAvKiBlbnRyeSBwb2ludCAqLwotc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X2F1cmVvbl9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Citjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfYXVyZW9uX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX0FVUkVPTjUxX1NLWSwKIAkJLm5hbWUgPSAiVGVycmF0ZWMgQXVyZW9uIDUuMS1Ta3kiLApAQCAtMjIxNyw1ICsyMjA5LDE1IEBACiAJCS5lZXByb21fZGF0YSA9IHByb2RpZ3k3MWx0X2VlcHJvbSwKIAkJLmRyaXZlciA9ICJQcm9kaWd5NzFMVCIsCiAJfSwKKwl7CisJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MVhULAorCQkubmFtZSA9ICJBdWRpb3RyYWsgUHJvZGlneSA3LjEgWFQiLAorCQkubW9kZWwgPSAicHJvZGlneTcxeHQiLAorCQkuY2hpcF9pbml0ID0gYXVyZW9uX2luaXQsCisJCS5idWlsZF9jb250cm9scyA9IGF1cmVvbl9hZGRfY29udHJvbHMsCisJCS5lZXByb21fc2l6ZSA9IHNpemVvZihwcm9kaWd5NzF4dF9lZXByb20pLAorCQkuZWVwcm9tX2RhdGEgPSBwcm9kaWd5NzF4dF9lZXByb20sCisJCS5kcml2ZXIgPSAiUHJvZGlneTcxTFQiLAorCX0sCiAJeyB9IC8qIHRlcm1pbmF0b3IgKi8KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5oCmluZGV4IDNiN2JlYTYuLjc5ZTU4ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5oCkBAIC0yOCwxNSArMjgsMTcgQEAKIAkJCQkgICAgICAgIntUZXJyYXRlYyxBdXJlb24gNy4xIFNwYWNlfSwiXAogCQkJCSAgICAgICAie1RlcnJhdGVjLEF1cmVvbiA3LjEgVW5pdmVyc2V9LCIgXAogCQkJCQkie0F1ZGlvVHJhayxQcm9kaWd5IDcuMX0sIiBcCi0JCQkJCSJ7QXVkaW9UcmFrLFByb2RpZ3kgNy4xIExUfSwiCisJCQkJCSJ7QXVkaW9UcmFrLFByb2RpZ3kgNy4xIExUfSwiXAorCQkJCQkie0F1ZGlvVHJhayxQcm9kaWd5IDcuMSBYVH0sIgogCiAjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfQVVSRU9ONTFfU0tZCTB4M2IxNTQ3MTEJLyogQXVyZW9uIDUuMSBTa3kgKi8KICNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9BVVJFT043MV9TUEFDRQkweDNiMTU0NTExCS8qIEF1cmVvbiA3LjEgU3BhY2UgKi8KICNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9BVVJFT043MV9VTklWRVJTRQkweDNiMTU1MzExCS8qIEF1cmVvbiA3LjEgVW5pdmVyc2UgKi8KICNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzEJMHgzMzQ5NTM0NQkvKiBQUk9ESUdZIDcuMSAqLwogI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUCTB4MzIzMTU0NDEJLyogUFJPRElHWSA3LjEgTFQgKi8KKyNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFYVAkweDM2MzE1NDQxCS8qIFBST0RJR1kgNy4xIFhUKi8KIAotZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjRfYXVyZW9uX2NhcmRzW107CitleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9hdXJlb25fY2FyZHNbXTsKIAogLyogR1BJTyBiaXRzICovCiAjZGVmaW5lIEFVUkVPTl9DUzg0MTVfQ1MJKDEgPDwgMjIpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYwppbmRleCBhZjY1OTgwLi4zZWViMzZjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKQEAgLTQxNiw3ICs0MTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGExMDEwbHRfd29yZGNsb2NrX3N0YXR1cyBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YTEwMTBsdF93b3JkY2xvY2tfc3RhdHVzIF9fZGV2aW5pdGRhdGEgPQogewogCS5hY2Nlc3MgPQkoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQpLAogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLApAQCAtNDI5LDcgKzQyOSw3IEBACiAgKiBpbml0aWFsaXplIHRoZSBjaGlwcyBvbiBNLUF1ZGlvIGNhcmRzCiAgKi8KIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fYXVkaW9waGlsZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fYXVkaW9waGlsZSBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDUyOCwKIAkubnVtX2FkY3MgPSAyLAogCS5udW1fZGFjcyA9IDIsCkBAIC00MzgsNyArNDM4LDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fYXVkaW9waGlsZV9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fYXVkaW9waGlsZV9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMiwKIAkuY2lmID0gMCwKIAkuZGF0YV9tYXNrID0gSUNFMTcxMl9ERUxUQV9BUF9ET1VULApAQCAtNDUwLDcgKzQ1MCw3IEBACiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fZGVsdGE0MTAgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2RlbHRhNDEwIF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0NTI5LAogCS5udW1fYWRjcyA9IDIsCiAJLm51bV9kYWNzID0gOCwKQEAgLTQ1OSw3ICs0NTksNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9kZWx0YTQxMF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZGVsdGE0MTBfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDAsCiAJLmNpZiA9IDAsCiAJLmRhdGFfbWFzayA9IElDRTE3MTJfREVMVEFfQVBfRE9VVCwKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCS5tYXNrX2ZsYWdzID0gMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2RlbHRhMTAxMGx0IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9kZWx0YTEwMTBsdCBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDUyNCwKIAkubnVtX2FkY3MgPSA4LAogCS5udW1fZGFjcyA9IDgsCkBAIC00ODEsNyArNDgxLDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZGVsdGExMDEwbHRfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2RlbHRhMTAxMGx0X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAyLAogCS5jaWYgPSAwLCAvKiB0aGUgZGVmYXVsdCBsZXZlbCBvZiB0aGUgQ0lGIHBpbiBmcm9tIEFLNDUyNCAqLwogCS5kYXRhX21hc2sgPSBJQ0UxNzEyX0RFTFRBXzEwMTBMVF9ET1VULApAQCAtNDkzLDcgKzQ5Myw3IEBACiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fZGVsdGE0NCBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fZGVsdGE0NCBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDUyNCwKIAkubnVtX2FkY3MgPSA0LAogCS5udW1fZGFjcyA9IDQsCkBAIC01MDMsNyArNTAzLDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZGVsdGE0NF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZGVsdGE0NF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMiwKIAkuY2lmID0gMCwgLyogdGhlIGRlZmF1bHQgbGV2ZWwgb2YgdGhlIENJRiBwaW4gZnJvbSBBSzQ1MjQgKi8KIAkuZGF0YV9tYXNrID0gSUNFMTcxMl9ERUxUQV9DT0RFQ19TRVJJQUxfREFUQSwKQEAgLTUxNSw3ICs1MTUsNyBAQAogCS5tYXNrX2ZsYWdzID0gMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3Z4NDQyIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV92eDQ0MiBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDUyNCwKIAkubnVtX2FkY3MgPSA0LAogCS5udW1fZGFjcyA9IDQsCkBAIC01MjUsNyArNTI1LDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fdng0NDJfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Z4NDQyX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAyLAogCS5jaWYgPSAwLAogCS5kYXRhX21hc2sgPSBJQ0UxNzEyX1ZYNDQyX0RPVVQsCkBAIC02NTAsMTUgKzY1MCwxNSBAQAogICogYWRkaXRpb25hbCBjb250cm9scyBmb3IgTS1BdWRpbyBjYXJkcwogICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YTEwMTBfd29yZGNsb2NrX3NlbGVjdCBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YTEwMTBfd29yZGNsb2NrX3NlbGVjdCBfX2RldmluaXRkYXRhID0KIElDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIldvcmQgQ2xvY2sgU3luYyIsIDAsIElDRTE3MTJfREVMVEFfV09SRF9DTE9DS19TRUxFQ1QsIDEsIDApOwotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhMTAxMGx0X3dvcmRjbG9ja19zZWxlY3QgX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGExMDEwbHRfd29yZGNsb2NrX3NlbGVjdCBfX2RldmluaXRkYXRhID0KIElDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIldvcmQgQ2xvY2sgU3luYyIsIDAsIElDRTE3MTJfREVMVEFfMTAxMExUX1dPUkRDTE9DSywgMCwgMCk7Ci1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGExMDEwX3dvcmRjbG9ja19zdGF0dXMgX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGExMDEwX3dvcmRjbG9ja19zdGF0dXMgX19kZXZpbml0ZGF0YSA9CiBJQ0UxNzEyX0dQSU8oU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJXb3JkIENsb2NrIFN0YXR1cyIsIDAsIElDRTE3MTJfREVMVEFfV09SRF9DTE9DS19TVEFUVVMsIDEsIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFKTsKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YWRpbzI0OTZfc3BkaWZfaW5fc2VsZWN0IF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhZGlvMjQ5Nl9zcGRpZl9pbl9zZWxlY3QgX19kZXZpbml0ZGF0YSA9CiBJQ0UxNzEyX0dQSU8oU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJJRUM5NTggSW5wdXQgT3B0aWNhbCIsIDAsIElDRTE3MTJfREVMVEFfU1BESUZfSU5QVVRfU0VMRUNULCAwLCAwKTsKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YV9zcGRpZl9pbl9zdGF0dXMgX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGFfc3BkaWZfaW5fc3RhdHVzIF9fZGV2aW5pdGRhdGEgPQogSUNFMTcxMl9HUElPKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiRGVsdGEgSUVDOTU4IElucHV0IFN0YXR1cyIsIDAsIElDRTE3MTJfREVMVEFfU1BESUZfSU5fU1RBVCwgMSwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUpOwogCiAKQEAgLTczNSw3ICs3MzUsNyBAQAogCiAKIC8qIGVudHJ5IHBvaW50ICovCi1zdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2RlbHRhX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK2NvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfZGVsdGFfY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IElDRTE3MTJfU1VCREVWSUNFX0RFTFRBMTAxMCwKIAkJLm5hbWUgPSAiTSBBdWRpbyBEZWx0YSAxMDEwIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5oCmluZGV4IDc0NmViZGUuLmU2NWQ2NjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuaApAQCAtNDYsNyArNDYsNyBAQAogI2RlZmluZSBJQ0UxNzEyX1NVQkRFVklDRV9NRURJQVNUQVRJT04JMHg2OTRjMDEwMAogCiAvKiBlbnRyeSBwb2ludCAqLwotZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfZGVsdGFfY2FyZHNbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2RlbHRhX2NhcmRzW107CiAKIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jIGIvc291bmQvcGNpL2ljZTE3MTIvZXdzLmMKaW5kZXggYjEzNTM4OS4uOWI3ZmYzMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvZXdzLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvZXdzLmMKQEAgLTMzMiw3ICszMzIsNyBAQAogCiAvKgogICovCi1zdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9ld3M4OG10IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9ld3M4OG10IF9fZGV2aW5pdGRhdGEgPSB7CiAJLm51bV9hZGNzID0gOCwKIAkubnVtX2RhY3MgPSA4LAogCS50eXBlID0gU05EX0FLNDUyNCwKQEAgLTM0Miw3ICszNDIsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9ld3M4OG10X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9ld3M4OG10X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAyLAogCS5jaWYgPSAxLCAvKiBDSUYgaGlnaCAqLwogCS5kYXRhX21hc2sgPSBJQ0UxNzEyX0VXUzg4X1NFUklBTF9EQVRBLApAQCAtMzU0LDcgKzM1NCw3IEBACiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fZXd4MjQ5NiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fZXd4MjQ5NiBfX2RldmluaXRkYXRhID0gewogCS5udW1fYWRjcyA9IDIsCiAJLm51bV9kYWNzID0gMiwKIAkudHlwZSA9IFNORF9BSzQ1MjQsCkBAIC0zNjMsNyArMzYzLDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZXd4MjQ5Nl9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZXd4MjQ5Nl9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMiwKIAkuY2lmID0gMSwgLyogQ0lGIGhpZ2ggKi8KIAkuZGF0YV9tYXNrID0gSUNFMTcxMl9FV1M4OF9TRVJJQUxfREFUQSwKQEAgLTM3NSw3ICszNzUsNyBAQAogCS5tYXNrX2ZsYWdzID0gMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttXzZmaXJlIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV82ZmlyZSBfX2RldmluaXRkYXRhID0gewogCS5udW1fYWRjcyA9IDYsCiAJLm51bV9kYWNzID0gNiwKIAkudHlwZSA9IFNORF9BSzQ1MjQsCkBAIC0zODQsNyArMzg0LDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fNmZpcmVfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttXzZmaXJlX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAyLAogCS5jaWYgPSAxLCAvKiBDSUYgaGlnaCAqLwogCS5kYXRhX21hc2sgPSBJQ0UxNzEyXzZGSVJFX1NFUklBTF9EQVRBLApAQCAtNTc4LDcgKzU3OCw3IEBACiAJcmV0dXJuIHZhbCAhPSBudmFsOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZXd4MjQ5Nl9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZXd4MjQ5Nl9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiSW5wdXQgU2Vuc2l0aXZpdHkgU3dpdGNoIiwKQEAgLTY3OCw3ICs2NzgsNyBAQAogCXJldHVybiBuZGF0YSAhPSBkYXRhOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZXdzODhtdF9pbnB1dF9zZW5zZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2V3czg4bXRfaW5wdXRfc2Vuc2UgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJJbnB1dCBTZW5zaXRpdml0eSBTd2l0Y2giLAogCS5pbmZvID0gc25kX2ljZTE3MTJfZXd4X2lvX3NlbnNlX2luZm8sCkBAIC02ODcsNyArNjg3LDcgQEAKIAkuY291bnQgPSA4LAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2V3czg4bXRfb3V0cHV0X3NlbnNlIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZXdzODhtdF9vdXRwdXRfc2Vuc2UgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJPdXRwdXQgU2Vuc2l0aXZpdHkgU3dpdGNoIiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX2V3eF9pb19zZW5zZV9pbmZvLApAQCAtNzY5LDcgKzc2OSw3IEBACiAgIC5wcml2YXRlX3ZhbHVlID0geHNoaWZ0IHwgKHhpbnZlcnQgPDwgOCksXAogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZXdzODhkX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9ld3M4OGRfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogCUVXUzg4RF9DT05UUk9MKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiSUVDOTU4IElucHV0IE9wdGljYWwiLCAwLCAxLCAwKSwgLyogaW52ZXJ0ZWQgKi8KIAlFV1M4OERfQ09OVFJPTChTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIkFEQVQgT3V0cHV0IE9wdGljYWwiLCAxLCAwLCAwKSwKIAlFV1M4OERfQ09OVFJPTChTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIkFEQVQgRXh0ZXJuYWwgTWFzdGVyIENsb2NrIiwgMiwgMCwgMCksCkBAIC05MDksNyArOTA5LDcgQEAKICAgLnByaXZhdGVfdmFsdWUgPSB4c2hpZnQgfCAoeGludmVydCA8PCA4KSxcCiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl82ZmlyZV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfNmZpcmVfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIkFuYWxvZyBJbnB1dCBTZWxlY3QiLApAQCAtOTg5LDcgKzk4OSw3IEBACiAKIAogLyogZW50cnkgcG9pbnQgKi8KLXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfZXdzX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK2NvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfZXdzX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBJQ0UxNzEyX1NVQkRFVklDRV9FV1gyNDk2LAogCQkubmFtZSA9ICJUZXJyYVRlYyBFV1gyNC85NiIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5oCmluZGV4IGExMmEwYjAuLmRmNDQ5YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5oCkBAIC00MCw3ICs0MCw3IEBACiAjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX1BIQVNFODgJMHgzYjE1NTExMQogCiAvKiBlbnRyeSBwb2ludCAqLwotZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfZXdzX2NhcmRzW107CitleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9ld3NfY2FyZHNbXTsKIAogCiAvKiBUZXJyYVRlYyBFV1ggMjQvOTYgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2hvb250ZWNoLmMKaW5kZXggM2YyN2QwNC4uZGY5NzMxMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9ob29udGVjaC5jCkBAIC0yMzksNyArMjM5LDcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pY2UxNzEyX3ZhbHVlX2luaXQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCiB7CiAJLyogSG9vbnRlY2ggU1REU1AyNCB3aXRoIG1vZGlmaWVkIGhhcmR3YXJlICovCi0Jc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fc3Rkc3AyNF9tdiBfX2RldmluaXRkYXRhID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3N0ZHNwMjRfbXYgX19kZXZpbml0ZGF0YSA9IHsKIAkJLm51bV9hZGNzID0gMiwKIAkJLm51bV9kYWNzID0gMiwKIAkJLnR5cGUgPSBTTkRfQUs0NTI0LApAQCAtMjQ4LDcgKzI0OCw3IEBACiAJCX0KIAl9OwogCi0Jc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3N0ZHNwMjRfbXZfcHJpdiBfX2RldmluaXRkYXRhID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9zdGRzcDI0X212X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkJLmNhZGRyID0gMiwKIAkJLmNpZiA9IDEsIC8qIENJRiBoaWdoICovCiAJCS5kYXRhX21hc2sgPSBJQ0UxNzEyX1NURFNQMjRfU0VSSUFMX0RBVEEsCkBAIC0yOTgsNyArMjk4LDcgQEAKIAogCiAvKiBlbnRyeSBwb2ludCAqLwotc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9ob29udGVjaF9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Citjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2hvb250ZWNoX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBJQ0UxNzEyX1NVQkRFVklDRV9TVERTUDI0LAogCQkubmFtZSA9ICJIb29udGVjaCBTb3VuZFRyYWNrIEF1ZGlvIERTUDI0IiwKQEAgLTMyNSw0ICszMjUsMyBAQAogCX0sCiAJeyB9IC8qIHRlcm1pbmF0b3IgKi8KIH07Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2hvb250ZWNoLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9ob29udGVjaC5oCmluZGV4IDFlZTUzOGIuLmI2MmQ2ZTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2hvb250ZWNoLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guaApAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBJQ0UxNzEyX1NVQkRFVklDRV9TVERTUDI0X01FRElBN18xCTB4MTYxNDEyMTcJLyogSG9vbnRlY2ggU1QgQXVkaW8gRFNQMjQgTWVkaWEgNy4xICovCiAjZGVmaW5lIElDRTE3MTJfU1VCREVWSUNFX0VWRU5UX0VaOAkJMHgwMDAxMDAwMQkvKiBBIGR1bW15IGlkIGZvciBFWjggKi8KIAotZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfaG9vbnRlY2hfY2FyZHNbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2hvb250ZWNoX2NhcmRzW107CiAKIAogLyogSG9vbnRlY2ggU291bmRUcmFjayBBdWRpbyBEU1AgMjQgR1BJTyBkZWZpbml0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCmluZGV4IDhiYTMxY2YuLjgzMGExYmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhkeHJfZW5hYmxlLCAiRW5hYmxlIERYUiBzdXBwb3J0IGZvciBUZXJyYXRlYyBETVg2RklSRS4iKTsKIAogCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2ljZTE3MTJfaWRzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2ljZTE3MTJfaWRzW10gPSB7CiAJeyBQQ0lfVkVORE9SX0lEX0lDRSwgUENJX0RFVklDRV9JRF9JQ0VfMTcxMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAgIC8qIElDRTE3MTIgKi8KIAl7IDAsIH0KIH07CkBAIC0yODcsNyArMjg3LDcgQEAKIAlyZXR1cm4gdmFsICE9IG52YWw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9kaWdtaXhfcm91dGVfYWM5NyBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX21peGVyX2RpZ21peF9yb3V0ZV9hYzk3IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiRGlnaXRhbCBNaXhlciBUbyBBQzk3IiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX2RpZ21peF9yb3V0ZV9hYzk3X2luZm8sCkBAIC03MTksNyArNzE5LDcgQEAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcHRyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX3BsYXliYWNrID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9wbGF5YmFjayA9CiB7CiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CkBAIC03MzksNyArNzM5LDcgQEAKIAkuZmlmb19zaXplID0JCTAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2ljZTE3MTJfcGxheWJhY2tfZHMgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX3BsYXliYWNrX2RzID0KIHsKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKQEAgLTc1OSw3ICs3NTksNyBAQAogCS5maWZvX3NpemUgPQkJMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9jYXB0dXJlID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9jYXB0dXJlID0KIHsKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKQEAgLTExMzMsNyArMTEzMyw3IEBACiAJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHB0cik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9wbGF5YmFja19wcm8gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pY2UxNzEyX3BsYXliYWNrX3BybyA9CiB7CiAJLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CkBAIC0xMTUzLDcgKzExNTMsNyBAQAogCS5maWZvX3NpemUgPQkJMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfaWNlMTcxMl9jYXB0dXJlX3BybyA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2ljZTE3MTJfY2FwdHVyZV9wcm8gPQogewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfApAQCAtMTM3OCw5ICsxMzc4LDkgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfcGxheWJhY2ssIC0xNDQwMCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9wbGF5YmFjaywgLTE0NDAwLCAxNTAsIDApOwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfcGxheWJhY2tfY3RybHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX211bHRpX3BsYXliYWNrX2N0cmxzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9ICJNdWx0aSBQbGF5YmFjayBTd2l0Y2giLApAQCAtMTQwNCw3ICsxNDA0LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfYW5hbG9nX3N3aXRjaCBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfYW5hbG9nX3N3aXRjaCBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIkgvVyBNdWx0aSBDYXB0dXJlIFN3aXRjaCIsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX2luZm8sCkBAIC0xNDEzLDcgKzE0MTMsNyBAQAogCS5wcml2YXRlX3ZhbHVlID0gMTAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9zcGRpZl9zd2l0Y2ggX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX3NwZGlmX3N3aXRjaCBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJNdWx0aSAiLENBUFRVUkUsU1dJVENIKSwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl9zd2l0Y2hfaW5mbywKQEAgLTE0MjMsNyArMTQyMyw3IEBACiAJLmNvdW50ID0gMiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX2FuYWxvZ192b2x1bWUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX2FuYWxvZ192b2x1bWUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAogCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpLApAQCAtMTQzNSw3ICsxNDM1LDcgQEAKIAkudGx2ID0geyAucCA9IGRiX3NjYWxlX3BsYXliYWNrIH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX3NwZGlmX3ZvbHVtZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfc3BkaWZfdm9sdW1lIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIk11bHRpICIsQ0FQVFVSRSxWT0xVTUUpLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX21peGVyX3ZvbHVtZV9pbmZvLApAQCAtMTYyNyw3ICsxNjI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2VlcHJvbSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2VlcHJvbSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0NBUkQsCiAJLm5hbWUgPSAiSUNFMTcxMiBFRVBST00iLAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKQEAgLTE2NjMsNyArMTY2Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9zcGRpZl9kZWZhdWx0IF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3NwZGlmX2RlZmF1bHQgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAogCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssREVGQVVMVCksCkBAIC0xNzE0LDcgKzE3MTQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfc3BkaWZfbWFza2MgX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfc3BkaWZfbWFza2MgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKQEAgLTE3MjMsNyArMTcyMyw3IEBACiAJLmdldCA9CQlzbmRfaWNlMTcxMl9zcGRpZl9tYXNrY19nZXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfc3BkaWZfbWFza3AgX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfc3BkaWZfbWFza3AgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKQEAgLTE3NTAsNyArMTc1MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9zcGRpZl9zdHJlYW0gX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfc3BkaWZfc3RyZWFtIF9fZGV2aW5pdGRhdGEgPQogewogCS5hY2Nlc3MgPQkoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CiAJCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFKSwKQEAgLTE4MTEsNyArMTgxMSw3IEBACiBzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9ja19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKLQlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzW10gPSB7CiAJCSI4MDAwIiwJCS8qIDA6IDYgKi8KIAkJIjk2MDAiLAkJLyogMTogMyAqLwogCQkiMTEwMjUiLAkvKiAyOiAxMCAqLwpAQCAtMTg0MCw3ICsxODQwLDcgQEAKIAkJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgeGxhdGVbMTZdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHhsYXRlWzE2XSA9IHsKIAkJOSwgNiwgMywgMSwgNywgNCwgMCwgMTIsIDgsIDUsIDIsIDExLCAyNTUsIDI1NSwgMjU1LCAxMAogCX07CiAJdW5zaWduZWQgY2hhciB2YWw7CkBAIC0xODY0LDcgKzE4NjQsNyBAQAogCQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdGF0aWMgdW5zaWduZWQgaW50IHhyYXRlWzEzXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHhyYXRlWzEzXSA9IHsKIAkJODAwMCwgOTYwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLAogCQkzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwCiAJfTsKQEAgLTE4OTEsNyArMTg5MSw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9jayBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9jayBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIk11bHRpIFRyYWNrIEludGVybmFsIENsb2NrIiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9ja19pbmZvLApAQCAtMTkwMiw3ICsxOTAyLDcgQEAKIHN0YXRpYyBpbnQgc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2RlZmF1bHRfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewotCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHNbXSA9IHsKIAkJIjgwMDAiLAkJLyogMDogNiAqLwogCQkiOTYwMCIsCQkvKiAxOiAzICovCiAJCSIxMTAyNSIsCS8qIDI6IDEwICovCkBAIC0xOTMxLDcgKzE5MzEsNyBAQAogCQkJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJaW50IHZhbDsKLQlzdGF0aWMgdW5zaWduZWQgaW50IHhyYXRlWzEzXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHhyYXRlWzEzXSA9IHsKIAkJODAwMCwgOTYwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLAogCQkzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwCiAJfTsKQEAgLTE5NDgsNyArMTk0OCw3IEBACiBzdGF0aWMgaW50IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9ja19kZWZhdWx0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgeHJhdGVbMTNdID0geworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgeHJhdGVbMTNdID0gewogCQk4MDAwLCA5NjAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsCiAJCTMyMDAwLCA0NDEwMCwgNDgwMDAsIDY0MDAwLCA4ODIwMCwgOTYwMDAKIAl9OwpAQCAtMTk2Miw3ICsxOTYyLDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2RlZmF1bHQgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfZGVmYXVsdCBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIk11bHRpIFRyYWNrIEludGVybmFsIENsb2NrIERlZmF1bHQiLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2RlZmF1bHRfaW5mbywKQEAgLTIwMDEsNyArMjAwMSw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3Byb19yYXRlX2xvY2tpbmcgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9wcm9fcmF0ZV9sb2NraW5nIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgUmF0ZSBMb2NraW5nIiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19yYXRlX2xvY2tpbmdfaW5mbywKQEAgLTIwNDAsNyArMjA0MCw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3Byb19yYXRlX3Jlc2V0IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfcHJvX3JhdGVfcmVzZXQgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBSYXRlIFJlc2V0IiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19yYXRlX3Jlc2V0X2luZm8sCkBAIC0yMDU0LDcgKzIwNTQsNyBAQAogc3RhdGljIGludCBzbmRfaWNlMTcxMl9wcm9fcm91dGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewotCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHNbXSA9IHsKIAkJIlBDTSBPdXQiLCAvKiAwICovCiAJCSJIL1cgSW4gMCIsICJIL1cgSW4gMSIsICJIL1cgSW4gMiIsICJIL1cgSW4gMyIsIC8qIDEtNCAqLwogCQkiSC9XIEluIDQiLCAiSC9XIEluIDUiLCAiSC9XIEluIDYiLCAiSC9XIEluIDciLCAvKiA1LTggKi8KQEAgLTIyMDcsNyArMjIwNyw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX21peGVyX3Byb19hbmFsb2dfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fYW5hbG9nX3JvdXRlIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiSC9XIFBsYXliYWNrIFJvdXRlIiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19yb3V0ZV9pbmZvLApAQCAtMjIxNSw3ICsyMjE1LDcgQEAKIAkucHV0ID0gc25kX2ljZTE3MTJfcHJvX3JvdXRlX2FuYWxvZ19wdXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbWl4ZXJfcHJvX3NwZGlmX3JvdXRlIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbWl4ZXJfcHJvX3NwZGlmX3JvdXRlIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTk9ORSkgIlJvdXRlIiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19yb3V0ZV9pbmZvLApAQCAtMjI1Nyw3ICsyMjU3LDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbWl4ZXJfcHJvX3ZvbHVtZV9yYXRlIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbWl4ZXJfcHJvX3ZvbHVtZV9yYXRlIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgVm9sdW1lIFJhdGUiLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3ZvbHVtZV9yYXRlX2luZm8sCkBAIC0yMjkwLDcgKzIyOTAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbWl4ZXJfcHJvX3BlYWsgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fcGVhayBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIk11bHRpIFRyYWNrIFBlYWsiLAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwKQEAgLTIzMDUsNyArMjMwNSw3IEBACiAvKgogICogbGlzdCBvZiBhdmFpbGFibGUgYm9hcmRzCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICpjYXJkX3RhYmxlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqY2FyZF90YWJsZXNbXSBfX2RldmluaXRkYXRhID0gewogCXNuZF9pY2UxNzEyX2hvb250ZWNoX2NhcmRzLAogCXNuZF9pY2UxNzEyX2RlbHRhX2NhcmRzLAogCXNuZF9pY2UxNzEyX2V3c19jYXJkcywKQEAgLTIzMjksNyArMjMyOSw3IEBACiB7CiAJaW50IGRldiA9IDB4YTA7CQkvKiBFRVBST00gZGV2aWNlIGFkZHJlc3MgKi8KIAl1bnNpZ25lZCBpbnQgaSwgc2l6ZTsKLQlzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICoqdGJsLCAqYzsKKwljb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICoqdGJsLCAqYzsKIAogCWlmICghIG1vZGVsbmFtZSB8fCAhICptb2RlbG5hbWUpIHsKIAkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gMDsKQEAgLTI2NTgsNyArMjY1OCw3IEBACiAgKgogICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIG5vX21hdGNoZWQgX19kZXZpbml0ZGF0YTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIG5vX21hdGNoZWQgX19kZXZpbml0ZGF0YTsKIAogc3RhdGljIGludCBfX2RldmluaXQgc25kX2ljZTE3MTJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKQEAgLTI2NjcsNyArMjY2Nyw3IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlOwogCWludCBwY21fZGV2ID0gMCwgZXJyOwotCXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOworCWNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOwogCiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmgKaW5kZXggY2UyN2VhYy4uYzNkOWZlYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuaApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2kyYy5oPgogI2luY2x1ZGUgPHNvdW5kL2FrNHh4eC1hZGRhLmg+CiAjaW5jbHVkZSA8c291bmQvYWs0MTE0Lmg+CisjaW5jbHVkZSA8c291bmQvcHQyMjU4Lmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CiAKQEAgLTM4MSw2ICszODIsMTEgQEAKIAkJCXVuc2lnbmVkIHNob3J0IG1hc3RlclsyXTsKIAkJCXVuc2lnbmVkIHNob3J0IHZvbFs4XTsKIAkJfSBwaGFzZTI4OworCQkvKiBhIG5vbi1zdGFuZGFyZCBJMkMgZGV2aWNlIGZvciByZXZvNTEgKi8KKwkJc3RydWN0IHJldm81MV9zcGVjIHsKKwkJCXN0cnVjdCBzbmRfaTJjX2RldmljZSAqZGV2OworCQkJc3RydWN0IHNuZF9wdDIyNTggKnB0MjI1ODsKKwkJfSByZXZvNTE7CiAJCS8qIEhvb250ZWNoLXNwZWNpZmljIHNldHRpbmcgKi8KIAkJc3RydWN0IGhvb250ZWNoX3NwZWMgewogCQkJdW5zaWduZWQgY2hhciBib3hiaXRzWzRdOwpAQCAtNDYyLDYgKzQ2OCwxNCBAQAogCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCBtYXNrICYgYml0cyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9pY2UxNzEyX2dwaW9fcmVhZF9iaXRzKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlpY2UtPmdwaW8uZGlyZWN0aW9uICY9IH5tYXNrOworCXNuZF9pY2UxNzEyX2dwaW9fc2V0X2RpcihpY2UsIGljZS0+Z3Bpby5kaXJlY3Rpb24pOworCXJldHVybiAgKHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpICYgbWFzayk7Cit9CisKIGludCBzbmRfaWNlMTcxMl9zcGRpZl9idWlsZF9jb250cm9scyhzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSk7CiAKIGludCBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoc3RydWN0IHNuZF9ha200eHh4ICphaywgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4ICp0ZW1wbGF0ZSwKQEAgLTUwMCw4ICs1MTQsOCBAQAogCXVuc2lnbmVkIGludCBtcHU0MDFfMl9pbmZvX2ZsYWdzOwogCWNvbnN0IGNoYXIgKm1wdTQwMV8xX25hbWU7CiAJY29uc3QgY2hhciAqbXB1NDAxXzJfbmFtZTsKLQl1bnNpZ25lZCBpbnQgZWVwcm9tX3NpemU7Ci0JdW5zaWduZWQgY2hhciAqZWVwcm9tX2RhdGE7CisJY29uc3QgdW5zaWduZWQgaW50IGVlcHJvbV9zaXplOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVlcHJvbV9kYXRhOwogfTsKIAogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKaW5kZXggM2UzYTEwMi4uMTEyN2ViZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwpAQCAtNTAsNyArNTAsNyBAQAogI2luY2x1ZGUgInByb2RpZ3kxOTIuaCIKICNpbmNsdWRlICJqdWxpLmgiCiAjaW5jbHVkZSAicGhhc2UuaCIKLQorI2luY2x1ZGUgInd0bS5oIgogCiBNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBJQ0Vuc2VtYmxlIElDRTE3MjQvMTcyMCAoRW52eTI0SFQvUFQpIik7CkBAIC02NCw2ICs2NCw3IEBACiAJICAgICAgIFBST0RJR1kxOTJfREVWSUNFX0RFU0MKIAkgICAgICAgSlVMSV9ERVZJQ0VfREVTQwogCSAgICAgICBQSEFTRV9ERVZJQ0VfREVTQworCSAgICAgICBXVE1fREVWSUNFX0RFU0MKIAkJIntWSUEsVlQxNzIwfSwiCiAJCSJ7VklBLFZUMTcyNH0sIgogCQkie0lDRW5zZW1ibGUsR2VuZXJpYyBJQ0UxNzI0fSwiCkBAIC04Niw3ICs4Nyw3IEBACiAKIAogLyogQm90aCBWVDE3MjAgYW5kIFZUMTcyNCBoYXZlIHRoZSBzYW1lIFBDSSBJRHMgKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfdnQxNzI0X2lkc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNuZF92dDE3MjRfaWRzW10gPSB7CiAJeyBQQ0lfVkVORE9SX0lEX0lDRSwgUENJX0RFVklDRV9JRF9WVDE3MjQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKIAl7IDAsIH0KIH07CkBAIC0zNDEsNyArMzQyLDcgQEAKIAogCXdoYXQgPSAwOwogCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLQkJc3RydWN0IHZ0MTcyNF9wY21fcmVnICpyZWc7CisJCWNvbnN0IHN0cnVjdCB2dDE3MjRfcGNtX3JlZyAqcmVnOwogCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKIAkJcmVnID0gcy0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCQl3aGF0IHw9IHJlZy0+c3RhcnQ7CkBAIC02MDUsNyArNjA2LDcgQEAKIHN0YXRpYyBpbnQgc25kX3Z0MTcyNF9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgKnJlZyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0cnVjdCB2dDE3MjRfcGNtX3JlZyAqcmVnID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAKIAlzcGluX2xvY2tfaXJxKCZpY2UtPnJlZ19sb2NrKTsKIAlvdXRsKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHIsIGljZS0+cHJvZmlfcG9ydCArIHJlZy0+YWRkcik7CkBAIC02MjAsNyArNjIxLDcgQEAKIHN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfdnQxNzI0X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCB2dDE3MjRfcGNtX3JlZyAqcmVnID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHZ0MTcyNF9wY21fcmVnICpyZWcgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlzaXplX3QgcHRyOwogCiAJaWYgKCEoaW5sKElDRU1UMTcyNChpY2UsIERNQV9DT05UUk9MKSkgJiByZWctPnN0YXJ0KSkKQEAgLTY0NiwyMSArNjQ3LDIxIEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHN0cnVjdCB2dDE3MjRfcGNtX3JlZyB2dDE3MjRfcGxheWJhY2tfcHJvX3JlZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgdnQxNzI0X3BsYXliYWNrX3Byb19yZWcgPSB7CiAJLmFkZHIgPSBWVDE3MjRfTVRfUExBWUJBQ0tfQUREUiwKIAkuc2l6ZSA9IFZUMTcyNF9NVF9QTEFZQkFDS19TSVpFLAogCS5jb3VudCA9IFZUMTcyNF9NVF9QTEFZQkFDS19DT1VOVCwKIAkuc3RhcnQgPSBWVDE3MjRfUERNQTBfU1RBUlQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHZ0MTcyNF9wY21fcmVnIHZ0MTcyNF9jYXB0dXJlX3Byb19yZWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZ0MTcyNF9wY21fcmVnIHZ0MTcyNF9jYXB0dXJlX3Byb19yZWcgPSB7CiAJLmFkZHIgPSBWVDE3MjRfTVRfQ0FQVFVSRV9BRERSLAogCS5zaXplID0gVlQxNzI0X01UX0NBUFRVUkVfU0laRSwKIAkuY291bnQgPSBWVDE3MjRfTVRfQ0FQVFVSRV9DT1VOVCwKIAkuc3RhcnQgPSBWVDE3MjRfUkRNQTBfU1RBUlQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3Z0MTcyNF9wbGF5YmFja19wcm8gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF92dDE3MjRfcGxheWJhY2tfcHJvID0KIHsKIAkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKQEAgLTY3OSw3ICs2ODAsNyBAQAogCS5wZXJpb2RzX21heCA9CQkxMDI0LAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF92dDE3MjRfc3BkaWYgPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF92dDE3MjRfc3BkaWYgPQogewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfApAQCAtNzAxLDcgKzcwMiw3IEBACiAJLnBlcmlvZHNfbWF4ID0JCTEwMjQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3Z0MTcyNF8yY2hfc3RlcmVvID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfdnQxNzI0XzJjaF9zdGVyZW8gPQogewogCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfApAQCAtNzczLDcgKzc3NCw3IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJaW50IGNoczsKIAotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9ICZ2dDE3MjRfcGxheWJhY2tfcHJvX3JlZzsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSZ2dDE3MjRfcGxheWJhY2tfcHJvX3JlZzsKIAlpY2UtPnBsYXliYWNrX3Byb19zdWJzdHJlYW0gPSBzdWJzdHJlYW07CiAJcnVudGltZS0+aHcgPSBzbmRfdnQxNzI0X3BsYXliYWNrX3BybzsKIAlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CkBAIC04MDIsNyArODAzLDcgQEAKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gJnZ0MTcyNF9jYXB0dXJlX3Byb19yZWc7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikmdnQxNzI0X2NhcHR1cmVfcHJvX3JlZzsKIAlpY2UtPmNhcHR1cmVfcHJvX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlydW50aW1lLT5odyA9IHNuZF92dDE3MjRfMmNoX3N0ZXJlbzsKIAlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CkBAIC04ODgsMTQgKzg4OSwxNCBAQAogICogU1BESUYgUENNCiAgKi8KIAotc3RhdGljIHN0cnVjdCB2dDE3MjRfcGNtX3JlZyB2dDE3MjRfcGxheWJhY2tfc3BkaWZfcmVnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2dDE3MjRfcGNtX3JlZyB2dDE3MjRfcGxheWJhY2tfc3BkaWZfcmVnID0gewogCS5hZGRyID0gVlQxNzI0X01UX1BETUE0X0FERFIsCiAJLnNpemUgPSBWVDE3MjRfTVRfUERNQTRfU0laRSwKIAkuY291bnQgPSBWVDE3MjRfTVRfUERNQTRfQ09VTlQsCiAJLnN0YXJ0ID0gVlQxNzI0X1BETUE0X1NUQVJULAogfTsKIAotc3RhdGljIHN0cnVjdCB2dDE3MjRfcGNtX3JlZyB2dDE3MjRfY2FwdHVyZV9zcGRpZl9yZWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZ0MTcyNF9wY21fcmVnIHZ0MTcyNF9jYXB0dXJlX3NwZGlmX3JlZyA9IHsKIAkuYWRkciA9IFZUMTcyNF9NVF9SRE1BMV9BRERSLAogCS5zaXplID0gVlQxNzI0X01UX1JETUExX1NJWkUsCiAJLmNvdW50ID0gVlQxNzI0X01UX1JETUExX0NPVU5ULApAQCAtOTUzLDcgKzk1NCw3IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9ICZ2dDE3MjRfcGxheWJhY2tfc3BkaWZfcmVnOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopJnZ0MTcyNF9wbGF5YmFja19zcGRpZl9yZWc7CiAJaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCWlmIChpY2UtPmZvcmNlX3BkbWE0KSB7CiAJCXJ1bnRpbWUtPmh3ID0gc25kX3Z0MTcyNF8yY2hfc3RlcmVvOwpAQCAtOTg1LDcgKzk4Niw3IEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9ICZ2dDE3MjRfY2FwdHVyZV9zcGRpZl9yZWc7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikmdnQxNzI0X2NhcHR1cmVfc3BkaWZfcmVnOwogCWljZS0+Y2FwdHVyZV9jb25fc3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCWlmIChpY2UtPmZvcmNlX3JkbWExKSB7CiAJCXJ1bnRpbWUtPmh3ID0gc25kX3Z0MTcyNF8yY2hfc3RlcmVvOwpAQCAtMTA5MCw3ICsxMDkxLDcgQEAKICAqIGluZGVwZW5kZW50IHN1cnJvdW5kIFBDTXMKICAqLwogCi1zdGF0aWMgc3RydWN0IHZ0MTcyNF9wY21fcmVnIHZ0MTcyNF9wbGF5YmFja19kbWFfcmVnc1szXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdnQxNzI0X3BjbV9yZWcgdnQxNzI0X3BsYXliYWNrX2RtYV9yZWdzWzNdID0gewogCXsKIAkJLmFkZHIgPSBWVDE3MjRfTVRfUERNQTFfQUREUiwKIAkJLnNpemUgPSBWVDE3MjRfTVRfUERNQTFfU0laRSwKQEAgLTExMzYsNyArMTEzNyw3IEBACiAJCXJldHVybiAtRUJVU1k7IC8qIEZJWE1FOiBzaG91bGQgaGFuZGxlIGJsb2NraW5nIG1vZGUgcHJvcGVybHkgKi8KIAl9CiAJbXV0ZXhfdW5sb2NrKCZpY2UtPm9wZW5fbXV0ZXgpOwotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9ICZ2dDE3MjRfcGxheWJhY2tfZG1hX3JlZ3Nbc3Vic3RyZWFtLT5udW1iZXJdOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopJnZ0MTcyNF9wbGF5YmFja19kbWFfcmVnc1tzdWJzdHJlYW0tPm51bWJlcl07CiAJaWNlLT5wbGF5YmFja19jb25fc3Vic3RyZWFtX2RzW3N1YnN0cmVhbS0+bnVtYmVyXSA9IHN1YnN0cmVhbTsKIAlydW50aW1lLT5odyA9IHNuZF92dDE3MjRfMmNoX3N0ZXJlbzsKIAlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7CkBAIC0xMzE3LDcgKzEzMTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9lZXByb20gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X2VlcHJvbSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0NBUkQsCiAJLm5hbWUgPSAiSUNFMTcyNCBFRVBST00iLAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKQEAgLTE0MzAsNyArMTQzMSw3IEBACiAJcmV0dXJuICh2YWwgIT0gb2xkKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfc3BkaWZfZGVmYXVsdCBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX2RlZmF1bHQgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAogCS5uYW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssREVGQVVMVCksCkBAIC0xNDYyLDcgKzE0NjMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9zcGRpZl9tYXNrYyBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX21hc2tjIF9fZGV2aW5pdGRhdGEgPQogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCkBAIC0xNDcxLDcgKzE0NzIsNyBAQAogCS5nZXQgPQkJc25kX3Z0MTcyNF9zcGRpZl9tYXNrY19nZXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9zcGRpZl9tYXNrcCBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX21hc2twIF9fZGV2aW5pdGRhdGEgPQogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCkBAIC0xNTE2LDcgKzE1MTcsNyBAQAogCXJldHVybiBvbGQgIT0gdmFsOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9zcGRpZl9zd2l0Y2ggX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9zcGRpZl9zd2l0Y2ggX19kZXZpbml0ZGF0YSA9CiB7CiAJLmlmYWNlID0JU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLyogRklYTUU6IHRoZSBmb2xsb3dpbmcgY29uZmxpY3Qgd2l0aCBJRUM5NTggUGxheWJhY2sgUm91dGUgKi8KQEAgLTE1ODQsNyArMTU4NSw3IEBACiBzdGF0aWMgaW50IHNuZF92dDE3MjRfcHJvX2ludGVybmFsX2Nsb2NrX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7Ci0Jc3RhdGljIGNoYXIgKnRleHRzXzE3MjRbXSA9IHsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzXzE3MjRbXSA9IHsKIAkJIjgwMDAiLAkJLyogMDogNiAqLwogCQkiOTYwMCIsCQkvKiAxOiAzICovCiAJCSIxMTAyNSIsCS8qIDI6IDEwICovCkBAIC0xNjAyLDcgKzE2MDMsNyBAQAogCQkiMTkyMDAwIiwJLyogMTQ6IDE0ICovCiAJCSJJRUM5NTggSW5wdXQiLAkvKiAxNTogLS0gKi8KIAl9OwotCXN0YXRpYyBjaGFyICp0ZXh0c18xNzIwW10gPSB7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0c18xNzIwW10gPSB7CiAJCSI4MDAwIiwJCS8qIDA6IDYgKi8KIAkJIjk2MDAiLAkJLyogMTogMyAqLwogCQkiMTEwMjUiLAkvKiAyOiAxMCAqLwpAQCAtMTYzNSw3ICsxNjM2LDcgQEAKIAkJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciB4bGF0ZVsxNl0gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeGxhdGVbMTZdID0gewogCQk5LCA2LCAzLCAxLCA3LCA0LCAwLCAxMiwgOCwgNSwgMiwgMTEsIDEzLCAyNTUsIDE0LCAxMAogCX07CiAJdW5zaWduZWQgY2hhciB2YWw7CkBAIC0xNjk0LDcgKzE2OTUsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3Byb19pbnRlcm5hbF9jbG9jayBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfcHJvX2ludGVybmFsX2Nsb2NrIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgSW50ZXJuYWwgQ2xvY2siLAogCS5pbmZvID0gc25kX3Z0MTcyNF9wcm9faW50ZXJuYWxfY2xvY2tfaW5mbywKQEAgLTE3MzMsNyArMTczNCw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfcHJvX3JhdGVfbG9ja2luZyBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfcHJvX3JhdGVfbG9ja2luZyBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIk11bHRpIFRyYWNrIFJhdGUgTG9ja2luZyIsCiAJLmluZm8gPSBzbmRfdnQxNzI0X3Byb19yYXRlX2xvY2tpbmdfaW5mbywKQEAgLTE3NzIsNyArMTc3Myw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfcHJvX3JhdGVfcmVzZXQgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3Byb19yYXRlX3Jlc2V0IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgUmF0ZSBSZXNldCIsCiAJLmluZm8gPSBzbmRfdnQxNzI0X3Byb19yYXRlX3Jlc2V0X2luZm8sCkBAIC0xODE2LDcgKzE4MTcsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgdmFsOwogCXVuc2lnbmVkIGNoYXIgZWl0ZW07Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgeGxhdGVbOF0gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeGxhdGVbOF0gPSB7CiAJCTAsIDI1NSwgMSwgMiwgMjU1LCAyNTUsIDMsIDQsCiAJfTsKIApAQCAtMTgzNSw3ICsxODM2LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgb2xkX3ZhbCwgbnZhbDsKIAlpbnQgY2hhbmdlOwotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHhyb3V0ZVs4XSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB4cm91dGVbOF0gPSB7CiAJCTAsIC8qIFBDTSAqLwogCQkyLCAvKiBQU0RJTjAgTGVmdCAqLwogCQkzLCAvKiBQU0RJTjAgUmlnaHQgKi8KQEAgLTE4OTEsNyArMTg5Miw3IEBACiAJCQkgICAgIGRpZ2l0YWxfcm91dGVfc2hpZnQoaWR4KSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X21peGVyX3Byb19hbmFsb2dfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X21peGVyX3Byb19hbmFsb2dfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJIL1cgUGxheWJhY2sgUm91dGUiLAogCS5pbmZvID0gc25kX3Z0MTcyNF9wcm9fcm91dGVfaW5mbywKQEAgLTE4OTksNyArMTkwMCw3IEBACiAJLnB1dCA9IHNuZF92dDE3MjRfcHJvX3JvdXRlX2FuYWxvZ19wdXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9taXhlcl9wcm9fc3BkaWZfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X21peGVyX3Byb19zcGRpZl9yb3V0ZSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE5PTkUpICJSb3V0ZSIsCiAJLmluZm8gPSBzbmRfdnQxNzI0X3Byb19yb3V0ZV9pbmZvLApAQCAtMTkzNSw3ICsxOTM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfbWl4ZXJfcHJvX3BlYWsgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X21peGVyX3Byb19wZWFrIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgUGVhayIsCiAJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLApAQCAtMTk0Nyw5ICsxOTQ4LDkgQEAKICAqCiAgKi8KIAotc3RhdGljIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gbm9fbWF0Y2hlZCBfX2RldmluaXRkYXRhOworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gbm9fbWF0Y2hlZCBfX2RldmluaXRkYXRhOwogCi1zdGF0aWMgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqY2FyZF90YWJsZXNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKmNhcmRfdGFibGVzW10gX19kZXZpbml0ZGF0YSA9IHsKIAlzbmRfdnQxNzI0X3Jldm9fY2FyZHMsCiAJc25kX3Z0MTcyNF9hbXBfY2FyZHMsIAogCXNuZF92dDE3MjRfYXVyZW9uX2NhcmRzLApAQCAtMTk1OCw2ICsxOTU5LDcgQEAKIAlzbmRfdnQxNzI0X3Byb2RpZ3kxOTJfY2FyZHMsCiAJc25kX3Z0MTcyNF9qdWxpX2NhcmRzLAogCXNuZF92dDE3MjRfcGhhc2VfY2FyZHMsCisJc25kX3Z0MTcyNF93dG1fY2FyZHMsCiAJTlVMTCwKIH07CiAKQEAgLTIwMDcsNyArMjAwOSw3IEBACiB7CiAJY29uc3QgaW50IGRldiA9IDB4YTA7CQkvKiBFRVBST00gZGV2aWNlIGFkZHJlc3MgKi8KIAl1bnNpZ25lZCBpbnQgaSwgc2l6ZTsKLQlzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICoqdGJsLCAqYzsKKwljb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICoqdGJsLCAqYzsKIAogCWlmICghIG1vZGVsbmFtZSB8fCAhICptb2RlbG5hbWUpIHsKIAkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gMDsKQEAgLTIzMDYsNyArMjMwOCw3IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlOwogCWludCBwY21fZGV2ID0gMCwgZXJyOwotCXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOworCWNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOwogCiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmMKaW5kZXggNTE3NmI0MS4uZDg4MTcyZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJc25kX2FrbTR4eHhfcmVzZXQoYWssIDApOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9qdWxpX2RhYyBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fanVsaV9kYWMgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzQzNTgsCiAJLm51bV9kYWNzID0gMiwKIAkub3BzID0gewpAQCAtMTQ2LDcgKzE0Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IGp1bGlfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBhazQxMTRfaW5pdF92YWxzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWs0MTE0X2luaXRfdmFsc1tdID0gewogCQkvKiBBSzQxMTdfUkVHX1BXUkROICovCUFLNDExNF9SU1QgfCBBSzQxMTRfUFdOIHwgQUs0MTE0X09DS1MwIHwgQUs0MTE0X09DS1MxLAogCQkvKiBBSzQxMTRfUkVRX0ZPUk1BVCAqLwlBSzQxMTRfRElGX0kyNEkyUywKIAkJLyogQUs0MTE0X1JFR19JTzAgKi8JQUs0MTE0X1RYMUUsCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJLyogQUs0MTE0X1JFR19JTlQwX01BU0sgKi8gMCwKIAkJLyogQUs0MTE0X1JFR19JTlQxX01BU0sgKi8gMAogCX07Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgYWs0MTE0X2luaXRfdHhjc2JbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhazQxMTRfaW5pdF90eGNzYltdID0gewogCQkweDQxLCAweDAyLCAweDJjLCAweDAwLCAweDAwCiAJfTsKIAlpbnQgZXJyOwpAQCAtMjA2LDI0ICsyMDYsMjQgQEAKICAqIGhlbmNlIHRoZSBkcml2ZXIgbmVlZHMgdG8gc2V0cyB1cCBpdCBwcm9wZXJseS4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBqdWxpX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JMHgyMCwJLyogU1lTQ09ORjogY2xvY2sgNTEyLCBtcHU0MDEsIDF4QURDLCAxeERBQ3MgKi8KLQkweDgwLAkvKiBBQ0xJTks6IEkyUyAqLwotCTB4ZjgsCS8qIEkyUzogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCi0JMHhjMywJLyogU1BESUY6IG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KLQkweDlmLAkvKiBHUElPX0RJUiAqLwotCTB4ZmYsCS8qIEdQSU9fRElSMSAqLwotCTB4N2YsCS8qIEdQSU9fRElSMiAqLwotCTB4OWYsCS8qIEdQSU9fTUFTSyAqLwotCTB4ZmYsCS8qIEdQSU9fTUFTSzEgKi8KLQkweDdmLAkvKiBHUElPX01BU0syICovCi0JMHgxNiwJLyogR1BJT19TVEFURTogaW50ZXJuYWwgY2xvY2ssIG11bHRpcGxlIDF4LCA0OGtIeiAqLwotCTB4ODAsCS8qIEdQSU9fU1RBVEUxOiBtdXRlICovCi0JMHgwMCwJLyogR1BJT19TVEFURTIgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGp1bGlfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKKwlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgyMCwJLyogY2xvY2sgNTEyLCBtcHU0MDEsIDF4QURDLCAxeERBQ3MgKi8KKwlbSUNFX0VFUDJfQUNMSU5LXSAgICAgID0gMHg4MCwJLyogSTJTICovCisJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4ZjgsCS8qIHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLworCVtJQ0VfRUVQMl9TUERJRl0gICAgICAgPSAweGMzLAkvKiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCisJW0lDRV9FRVAyX0dQSU9fRElSXSAgICA9IDB4OWYsCisJW0lDRV9FRVAyX0dQSU9fRElSMV0gICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMl0gICA9IDB4N2YsCisJW0lDRV9FRVAyX0dQSU9fTUFTS10gICA9IDB4OWYsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzFdICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzJdICA9IDB4N2YsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEVdICA9IDB4MTYsCS8qIGludGVybmFsIGNsb2NrLCBtdWx0aXBsZSAxeCwgNDhrSHogKi8KKwlbSUNFX0VFUDJfR1BJT19TVEFURTFdID0gMHg4MCwJLyogbXV0ZSAqLworCVtJQ0VfRUVQMl9HUElPX1NUQVRFMl0gPSAweDAwLAogfTsKIAogLyogZW50cnkgcG9pbnQgKi8KLXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9qdWxpX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK2NvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9qdWxpX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX0pVTEksCiAJCS5uYW1lID0gIkVTSSBKdWxpQCIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmgKaW5kZXggZDlmODUzNC4uMWI5Mjk0ZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvanVsaS5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuaApAQCAtNSw2ICs1LDYgQEAKIAogI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX0pVTEkJCTB4MzEzMDUzNDUJLyogSnVsaUAgKi8KIAotZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjRfanVsaV9jYXJkc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjRfanVsaV9jYXJkc1tdOwogCiAjZW5kaWYJLyogX19TT1VORF9KVUxJX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5jCmluZGV4IGUwOGQ3M2YuLjA3NTE3MTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuYwpAQCAtNzEsNyArNzEsNyBAQAogICogTG9nYXJpdGhtaWMgdm9sdW1lIHZhbHVlcyBmb3IgV004NzcwCiAgKiBDb21wdXRlZCBhcyAyMCAqIExvZzEwKDI1NSAvIHgpCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHdtX3ZvbFsyNTZdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgd21fdm9sWzI1Nl0gPSB7CiAJMTI3LCA0OCwgNDIsIDM5LCAzNiwgMzQsIDMzLCAzMSwgMzAsIDI5LCAyOCwgMjcsIDI3LCAyNiwgMjUsIDI1LCAyNCwgMjQsIDIzLAogCTIzLCAyMiwgMjIsIDIxLCAyMSwgMjEsIDIwLCAyMCwgMjAsIDE5LCAxOSwgMTksIDE4LCAxOCwgMTgsIDE4LCAxNywgMTcsIDE3LAogCTE3LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLApAQCAtODksMTMgKzg5LDEzIEBACiAjZGVmaW5lIFdNX1ZPTF9NQVgJKHNpemVvZih3bV92b2wpIC0gMSkKICNkZWZpbmUgV01fVk9MX01VVEUJMHg4MDAwCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3BoYXNlMjIgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3BoYXNlMjIgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzQ1MjQsCiAJLm51bV9kYWNzID0gMiwKIAkubnVtX2FkY3MgPSAyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3BoYXNlMjJfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3BoYXNlMjJfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9CTIsCiAJLmNpZiA9CQkxLAogCS5kYXRhX21hc2sgPQkxIDw8IDQsCkBAIC0xNTIsMzYgKzE1MiwzNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwaGFzZTIyX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JMHgwMCwJLyogU1lTQ09ORjogMXhBREMsIDF4REFDcyAqLwotCTB4ODAsCS8qIEFDTElOSzogSTJTICovCi0JMHhmOCwJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQqLwotCTB4YzMsCS8qIFNQRElGOiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCi0JMHhGRiwJLyogR1BJT19ESVIgKi8KLQkweEZGLAkvKiBHUElPX0RJUjEgKi8KLQkweEZGLAkvKiBHUElPX0RJUjIgKi8KLQkweDAwLAkvKiBHUElPX01BU0sgKi8KLQkweDAwLAkvKiBHUElPX01BU0sxICovCi0JMHgwMCwJLyogR1BJT19NQVNLMiAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEU6ICovCi0JMHgwMCwJLyogR1BJT19TVEFURTE6ICovCi0JMHgwMCwJLyogR1BJT19TVEFURTIgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBoYXNlMjJfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKKwlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgwMCwJLyogMXhBREMsIDF4REFDcyAqLworCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDgwLAkvKiBJMlMgKi8KKwlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHhmOCwJLyogdm9sLCA5NmssIDI0Yml0ICovCisJW0lDRV9FRVAyX1NQRElGXSAgICAgICA9IDB4YzMsCS8qIG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KKwlbSUNFX0VFUDJfR1BJT19ESVJdICAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIxXSAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIyXSAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19NQVNLXSAgID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMl0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTFdID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTJdID0gMHgwMCwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBoYXNlMjhfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKLQkweDBiLAkvKiBTWVNDT05GOiBjbG9jayA1MTIsIHNwZGlmLWluL0FEQywgNERBQ3MgKi8KLQkweDgwLAkvKiBBQ0xJTks6IEkyUyAqLwotCTB4ZmMsCS8qIEkyUzogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCi0JMHhjMywJLyogU1BESUY6IG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KLQkweGZmLAkvKiBHUElPX0RJUiAqLwotCTB4ZmYsCS8qIEdQSU9fRElSMSAqLwotCTB4NWYsCS8qIEdQSU9fRElSMiAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSyAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSzEgKi8KLQkweDAwLAkvKiBHUElPX01BU0syICovCi0JMHgwMCwJLyogR1BJT19TVEFURSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUxICovCi0JMHgwMCwJLyogR1BJT19TVEFURTIgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBoYXNlMjhfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKKwlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgwYiwJLyogY2xvY2sgNTEyLCBzcGRpZi1pbi9BREMsIDREQUNzICovCisJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4ODAsCS8qIEkyUyAqLworCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweGZjLAkvKiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KKwlbSUNFX0VFUDJfU1BESUZdICAgICAgID0gMHhjMywJLyogb3V0LWVuLCBvdXQtaW50LCBzcGRpZi1pbiAqLworCVtJQ0VfRUVQMl9HUElPX0RJUl0gICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjFdICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX0RJUjJdICAgPSAweDVmLAorCVtJQ0VfRUVQMl9HUElPX01BU0tdICAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX01BU0sxXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX01BU0syXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFXSAgPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFMV0gPSAweDAwLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFMl0gPSAweDAwLAogfTsKIAogLyoKQEAgLTM0Myw3ICszNDMsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwaGFzZTI4X2luaXQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIHNob3J0IHdtX2luaXRzX3BoYXNlMjhbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgd21faW5pdHNfcGhhc2UyOFtdID0gewogCQkvKiBUaGVzZSBjb21lIGZpcnN0IHRvIHJlZHVjZSBpbml0IHBvcCBub2lzZSAqLwogCQkweDFiLCAweDA0NCwJCS8qIEFEQyBNdXggKEFDJzk3IHNvdXJjZSkgKi8KIAkJMHgxYywgMHgwMEIsCQkvKiBPdXQgTXV4MSAoVk9VVDEgPSBEQUMrQVVYLCBWT1VUMiA9IERBQykgKi8KQEAgLTM4Miw3ICszODIsNyBAQAogCiAJdW5zaWduZWQgaW50IHRtcDsKIAlzdHJ1Y3Qgc25kX2FrbTR4eHggKmFrOwotCXVuc2lnbmVkIHNob3J0ICpwOworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICpwOwogCWludCBpOwogCiAJaWNlLT5udW1fdG90YWxfZGFjcyA9IDg7CkBAIC02OTcsMTAgKzY5NywxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfd21fZGFjLCAtMTI3MDAsIDEwMCwgMSk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfd21fcGNtLCAtNjQwMCwgNTAsIDEpOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3dtX2RhYywgLTEyNzAwLCAxMDAsIDEpOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3dtX3BjbSwgLTY0MDAsIDUwLCAxKTsKIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHBoYXNlMjhfZGFjX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwaGFzZTI4X2RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCkBAIC04MTUsNyArODE1LDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd21fY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9ICJQQ00gUGxheWJhY2sgU3dpdGNoIiwKQEAgLTg3MCw3ICs4NzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfcGhhc2VfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3BoYXNlX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX1BIQVNFMjIsCiAJCS5uYW1lID0gIlRlcnJhdGVjIFBIQVNFIDIyIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5oCmluZGV4IDEzZTg0MWIuLmFkMzc5YTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuaApAQCAtMzEsNyArMzEsNyBAQAogI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX1BIQVNFMjgJMHgzYjE1NDkxMQogCiAvKiBlbnRyeSBwb2ludCAqLwotZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9waGFzZV9jYXJkc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9waGFzZV9jYXJkc1tdOwogCiAvKiBQSEFTRTI4IEdQSU8gYml0cyAqLwogI2RlZmluZSBQSEFTRTI4X1NQSV9NSVNPCSgxIDw8IDIxKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9wb250aXMuYwppbmRleCA2Yzc0YzJkLi45NTUyNDk3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9wb250aXMuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9wb250aXMuYwpAQCAtNDM0LDcgKzQzNCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgY3Nfc291cmNlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7Ci0Jc3RhdGljIGNoYXIgKnRleHRzW10gPSB7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0c1tdID0gewogCQkiQ29heCIsCQkvKiBSWFAwICovCiAJCSJPcHRpY2FsIiwJLyogUlhQMSAqLwogCQkiQ0QiLAkJLyogUlhQMiAqLwpAQCAtNTY1LDEzICs1NjUsMTMgQEAKIAlyZXR1cm4gY2hhbmdlZDsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX3ZvbHVtZSwgLTY0MDAsIDUwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV92b2x1bWUsIC02NDAwLCA1MCwgMSk7CiAKIC8qCiAgKiBtaXhlcnMKICAqLwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcG9udGlzX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwb250aXNfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CkBAIC03NDEsNyArNzQxLDcgQEAKICAqLwogc3RhdGljIGludCBfX2RldmluaXQgcG9udGlzX2luaXQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIHNob3J0IHdtX2luaXRzW10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdtX2luaXRzW10gPSB7CiAJCS8qIFRoZXNlIGNvbWUgZmlyc3QgdG8gcmVkdWNlIGluaXQgcG9wIG5vaXNlICovCiAJCVdNX0FEQ19NVVgsCTB4MDBjMCwJLyogQURDIG11dGUgKi8KIAkJV01fREFDX01VVEUsCTB4MDAwMSwJLyogREFDIHNvZnRtdXRlICovCkBAIC03NTAsNyArNzUwLDcgQEAKIAkJV01fUE9XRVJET1dOLAkweDAwMDgsCS8qIEFsbCBwb3dlci11cCBleGNlcHQgSFAgKi8KIAkJV01fUkVTRVQsCTB4MDAwMCwJLyogcmVzZXQgKi8KIAl9OwotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB3bV9pbml0czJbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgd21faW5pdHMyW10gPSB7CiAJCVdNX01BU1RFUl9DVFJMLAkweDAwMjIsCS8qIDI1NmZzLCBzbGF2ZSBtb2RlICovCiAJCVdNX0RBQ19JTlQsCTB4MDAyMiwJLyogSTJTLCBub3JtYWwgcG9sYXJpdHksIDI0Yml0ICovCiAJCVdNX0FEQ19JTlQsCTB4MDAyMiwJLyogSTJTLCBub3JtYWwgcG9sYXJpdHksIDI0Yml0ICovCkBAIC03NzYsNyArNzc2LDcgQEAKIAkJV01fREFDX01VVEUsCTB4MDAwMCwJLyogREFDIHVubXV0ZSAqLwogCQlXTV9BRENfTVVYLAkweDAwMDMsCS8qIEFEQyB1bm11dGUsIGJvdGggQ0QvTGluZSBPbiAqLwogCX07Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgY3NfaW5pdHNbXSA9IHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjc19pbml0c1tdID0gewogCQkweDA0LAkweDgwLAkvKiBSVU4sIFJYUDAgKi8KIAkJMHgwNSwJMHgwNSwJLyogc2xhdmUsIDI0Yml0ICovCiAJCTB4MDEsCTB4MDAsCkBAIC04MjYsMjQgKzgyNiwyNCBAQAogICogaGVuY2UgdGhlIGRyaXZlciBuZWVkcyB0byBzZXRzIHVwIGl0IHByb3Blcmx5LgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBvbnRpc19lZXByb21bXSBfX2RldmluaXRkYXRhID0gewotCTB4MDgsCS8qIFNZU0NPTkY6IGNsb2NrIDI1NiwgbXB1NDAxLCBzcGRpZi1pbi9BREMsIDFEQUMgKi8KLQkweDgwLAkvKiBBQ0xJTks6IEkyUyAqLwotCTB4ZjgsCS8qIEkyUzogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCi0JMHhjMywJLyogU1BESUY6IG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KLQkweDA3LAkvKiBHUElPX0RJUiAqLwotCTB4MDAsCS8qIEdQSU9fRElSMSAqLwotCTB4MDAsCS8qIEdQSU9fRElSMiAoaWdub3JlZCkgKi8KLQkweDBmLAkvKiBHUElPX01BU0sgKDQtNyByZXNlcnZlZCBmb3IgQ1M4NDE2KSAqLwotCTB4ZmYsCS8qIEdQSU9fTUFTSzEgKi8KLQkweDAwLAkvKiBHUElPX01BU0syIChpZ25vcmVkKSAqLwotCTB4MDYsCS8qIEdQSU9fU1RBVEUgKDAtbG93LCAxLWhpZ2gsIDItaGlnaCkgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUyIChpZ25vcmVkKSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcG9udGlzX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJW0lDRV9FRVAyX1NZU0NPTkZdICAgICA9IDB4MDgsCS8qIGNsb2NrIDI1NiwgbXB1NDAxLCBzcGRpZi1pbi9BREMsIDFEQUMgKi8KKwlbSUNFX0VFUDJfQUNMSU5LXSAgICAgID0gMHg4MCwJLyogSTJTICovCisJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4ZjgsCS8qIHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLworCVtJQ0VfRUVQMl9TUERJRl0gICAgICAgPSAweGMzLAkvKiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCisJW0lDRV9FRVAyX0dQSU9fRElSXSAgICA9IDB4MDcsCisJW0lDRV9FRVAyX0dQSU9fRElSMV0gICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fRElSMl0gICA9IDB4MDAsCS8qIGlnbm9yZWQgKi8KKwlbSUNFX0VFUDJfR1BJT19NQVNLXSAgID0gMHgwZiwJLyogNC03IHJlc2VydmVkIGZvciBDUzg0MTYgKi8KKwlbSUNFX0VFUDJfR1BJT19NQVNLMV0gID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMl0gID0gMHgwMCwJLyogaWdub3JlZCAqLworCVtJQ0VfRUVQMl9HUElPX1NUQVRFXSAgPSAweDA2LAkvKiAwLWxvdywgMS1oaWdoLCAyLWhpZ2ggKi8KKwlbSUNFX0VFUDJfR1BJT19TVEFURTFdID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTJdID0gMHgwMCwJLyogaWdub3JlZCAqLwogfTsKIAogLyogZW50cnkgcG9pbnQgKi8KLXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyMF9wb250aXNfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzIwX3BvbnRpc19jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuc3VidmVuZG9yID0gVlQxNzIwX1NVQkRFVklDRV9QT05USVNfTVMzMDAsCiAJCS5uYW1lID0gIlBvbnRpcyBNUzMwMCIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9wb250aXMuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5oCmluZGV4IGQwZDEzNzguLjFhNDE4MjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5oCkBAIC0yOCw2ICsyOCw2IEBACiAKICNkZWZpbmUgVlQxNzIwX1NVQkRFVklDRV9QT05USVNfTVMzMDAJMHgwMDAyMDAwMgkvKiBhIGR1bW15IGlkIGZvciBNUzMwMCAqLwogCi1leHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyMF9wb250aXNfY2FyZHNbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICBzbmRfdnQxNzIwX3BvbnRpc19jYXJkc1tdOwogCiAjZW5kaWYgLyogX19TT1VORF9QT05USVNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jIGIvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jCmluZGV4IDQxYjI2MDUuLjMxY2M2NmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmMKQEAgLTM1NywxNCArMzU3LDE0IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RhYywgLTE5MTI1LCA3NSwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYWRjLCAwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RhYywgLTE5MTI1LCA3NSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYWRjLCAwLCAxNTAsIDApOwogCiAvKgogICogbWl4ZXJzCiAgKi8KIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0YWNfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0YWNfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLApAQCAtNDc1LDcgKzQ3NSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IHByb2RpZ3kxOTJfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKLQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgc3RhY19pbml0c19wcm9kaWd5W10gPSB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHN0YWNfaW5pdHNfcHJvZGlneVtdID0gewogCQlTVEFDOTQ2WF9SRVNFVCwgMCwKIC8qCQlTVEFDOTQ2WF9NQVNURVJfVk9MVU1FLCAwLAogCQlTVEFDOTQ2WF9MRl9WT0xVTUUsIDAsCkBAIC00ODYsNyArNDg2LDcgQEAKIAkJU1RBQzk0NlhfTEZFX1ZPTFVNRSwgMCwqLwogCQkodW5zaWduZWQgc2hvcnQpLTEKIAl9OwotCXVuc2lnbmVkIHNob3J0ICpwOworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICpwOwogCiAJLyogcHJvZGlneSAxOTIgKi8KIAlpY2UtPm51bV90b3RhbF9kYWNzID0gNjsKQEAgLTUwNiwyNSArNTA2LDI1IEBACiAgKiBoZW5jZSB0aGUgZHJpdmVyIG5lZWRzIHRvIHNldHMgdXAgaXQgcHJvcGVybHkuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgcHJvZGlneTcxX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JMHgyYiwJLyogU1lTQ09ORjogY2xvY2sgNTEyLCBtcHU0MDEsIHNwZGlmLWluL0FEQywgNERBQ3MgKi8KLQkweDgwLAkvKiBBQ0xJTks6IEkyUyAqLwotCTB4ZjgsCS8qIEkyUzogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCi0JMHhjMywJLyogU1BESUY6IG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KLQkweGZmLAkvKiBHUElPX0RJUiAqLwotCTB4ZmYsCS8qIEdQSU9fRElSMSAqLwotCTB4YmYsCS8qIEdQSU9fRElSMiAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSyAqLwotCTB4MDAsCS8qIEdQSU9fTUFTSzEgKi8KLQkweDAwLAkvKiBHUElPX01BU0syICovCi0JMHgwMCwJLyogR1BJT19TVEFURSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUxICovCi0JMHgwMCwJLyogR1BJT19TVEFURTIgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHByb2RpZ3k3MV9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDJiLAkvKiBjbG9jayA1MTIsIG1wdTQwMSwgc3BkaWYtaW4vQURDLCA0REFDcyAqLworCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDgwLAkvKiBJMlMgKi8KKwlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHhmOCwJLyogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCisJW0lDRV9FRVAyX1NQRElGXSAgICAgICA9IDB4YzMsCS8qIG91dC1lbiwgb3V0LWludCwgc3BkaWYtaW4gKi8KKwlbSUNFX0VFUDJfR1BJT19ESVJdICAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIxXSAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIyXSAgID0gMHhiZiwKKwlbSUNFX0VFUDJfR1BJT19NQVNLXSAgID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMl0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURV0gID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTFdID0gMHgwMCwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTJdID0gMHgwMCwKIH07CiAKIAogLyogZW50cnkgcG9pbnQgKi8KLXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9wcm9kaWd5MTkyX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK2NvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9wcm9kaWd5MTkyX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1kxOTJWRSwKIAkJLm5hbWUgPSAiQXVkaW90cmFrIFByb2RpZ3kgMTkyIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuaAppbmRleCA5NGM4MjRlLi4yZmEyZTYyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5oCkBAIC02LDYgKzYsNiBAQAogCiAjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTE5MlZFCSAweDM0NDk1MzQ1CS8qIFBST0RJR1kgMTkyIFZFICovCiAKLWV4dGVybiBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICBzbmRfdnQxNzI0X3Byb2RpZ3kxOTJfY2FyZHNbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICBzbmRfdnQxNzI0X3Byb2RpZ3kxOTJfY2FyZHNbXTsKIAogI2VuZGlmCS8qIF9fU09VTkRfUFJPRElHWTE5Ml9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmMKaW5kZXggYmY5OGVhMy4uMDI1YTdlOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvcmV2by5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Jldm8uYwpAQCAtODQsMzggKzg0LDE0MiBAQAogfQogCiAvKgorICogSTJDIGFjY2VzcyB0byB0aGUgUFQyMjU4IHZvbHVtZSBjb250cm9sbGVyIG9uIEdQSU8gNi83IChSZXZvbHV0aW9uIDUuMSkKKyAqLworCitzdGF0aWMgdm9pZCByZXZvX2kyY19zdGFydChzdHJ1Y3Qgc25kX2kyY19idXMgKmJ1cykKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKK30KKworc3RhdGljIHZvaWQgcmV2b19pMmNfc3RvcChzdHJ1Y3Qgc25kX2kyY19idXMgKmJ1cykKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCXNuZF9pY2UxNzEyX3Jlc3RvcmVfZ3Bpb19zdGF0dXMoaWNlKTsKK30KKworc3RhdGljIHZvaWQgcmV2b19pMmNfZGlyZWN0aW9uKHN0cnVjdCBzbmRfaTJjX2J1cyAqYnVzLCBpbnQgY2xvY2ssIGludCBkYXRhKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gYnVzLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2ssIHZhbDsKKworCXZhbCA9IDA7CisJaWYgKGNsb2NrKQorCQl2YWwgfD0gVlQxNzI0X1JFVk9fSTJDX0NMT0NLOwkvKiB3cml0ZSBTQ0wgKi8KKwlpZiAoZGF0YSkKKwkJdmFsIHw9IFZUMTcyNF9SRVZPX0kyQ19EQVRBOwkvKiB3cml0ZSBTREEgKi8KKwltYXNrID0gVlQxNzI0X1JFVk9fSTJDX0NMT0NLIHwgVlQxNzI0X1JFVk9fSTJDX0RBVEE7CisJaWNlLT5ncGlvLmRpcmVjdGlvbiAmPSB+bWFzazsKKwlpY2UtPmdwaW8uZGlyZWN0aW9uIHw9IHZhbDsKKwlzbmRfaWNlMTcxMl9ncGlvX3NldF9kaXIoaWNlLCBpY2UtPmdwaW8uZGlyZWN0aW9uKTsKKwlzbmRfaWNlMTcxMl9ncGlvX3NldF9tYXNrKGljZSwgfm1hc2spOworfQorCitzdGF0aWMgdm9pZCByZXZvX2kyY19zZXRsaW5lcyhzdHJ1Y3Qgc25kX2kyY19idXMgKmJ1cywgaW50IGNsaywgaW50IGRhdGEpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBidXMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKworCWlmIChjbGspCisJCXZhbCB8PSBWVDE3MjRfUkVWT19JMkNfQ0xPQ0s7CisJaWYgKGRhdGEpCisJCXZhbCB8PSBWVDE3MjRfUkVWT19JMkNfREFUQTsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlX2JpdHMoaWNlLAorCQkJCSAgICBWVDE3MjRfUkVWT19JMkNfREFUQSB8CisJCQkJICAgIFZUMTcyNF9SRVZPX0kyQ19DTE9DSywgdmFsKTsKKwl1ZGVsYXkoNSk7Cit9CisKK3N0YXRpYyBpbnQgcmV2b19pMmNfZ2V0ZGF0YShzdHJ1Y3Qgc25kX2kyY19idXMgKmJ1cywgaW50IGFjaykKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IGJ1cy0+cHJpdmF0ZV9kYXRhOworCWludCBiaXQ7CisKKwlpZiAoYWNrKQorCQl1ZGVsYXkoNSk7CisJYml0ID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkX2JpdHMoaWNlLCBWVDE3MjRfUkVWT19JMkNfREFUQSkgPyAxIDogMDsKKwlyZXR1cm4gYml0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9pMmNfYml0X29wcyByZXZvNTFfYml0X29wcyA9IHsKKwkuc3RhcnQgPSByZXZvX2kyY19zdGFydCwKKwkuc3RvcCA9IHJldm9faTJjX3N0b3AsCisJLmRpcmVjdGlvbiA9IHJldm9faTJjX2RpcmVjdGlvbiwKKwkuc2V0bGluZXMgPSByZXZvX2kyY19zZXRsaW5lcywKKwkuZ2V0ZGF0YSA9IHJldm9faTJjX2dldGRhdGEsCit9OworCitzdGF0aWMgaW50IHJldm81MV9pMmNfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwKKwkJCSAgIHN0cnVjdCBzbmRfcHQyMjU4ICpwdCkKK3sKKwlpbnQgZXJyOworCisJLyogY3JlYXRlIHRoZSBJMkMgYnVzICovCisJZXJyID0gc25kX2kyY19idXNfY3JlYXRlKGljZS0+Y2FyZCwgIklDRTE3MjQgR1BJTzYiLCBOVUxMLCAmaWNlLT5pMmMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWNlLT5pMmMtPnByaXZhdGVfZGF0YSA9IGljZTsKKwlpY2UtPmkyYy0+aHdfb3BzLmJpdCA9ICZyZXZvNTFfYml0X29wczsKKworCS8qIGNyZWF0ZSB0aGUgSTJDIGRldmljZSAqLworCWVyciA9IHNuZF9pMmNfZGV2aWNlX2NyZWF0ZShpY2UtPmkyYywgIlBUMjI1OCIsIDB4NDAsCisJCQkJICAgICZpY2UtPnNwZWMucmV2bzUxLmRldik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlwdC0+Y2FyZCA9IGljZS0+Y2FyZDsKKwlwdC0+aTJjX2J1cyA9IGljZS0+aTJjOworCXB0LT5pMmNfZGV2ID0gaWNlLT5zcGVjLnJldm81MS5kZXY7CisJaWNlLT5zcGVjLnJldm81MS5wdDIyNTggPSBwdDsKKworCXNuZF9wdDIyNThfcmVzZXQocHQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBpbml0aWFsaXplIHRoZSBjaGlwcyBvbiBNLUF1ZGlvIFJldm9sdXRpb24gY2FyZHMKICAqLwogCiAjZGVmaW5lIEFLX0RBQyh4bmFtZSx4Y2gpIHsgLm5hbWUgPSB4bmFtZSwgLm51bV9jaGFubmVscyA9IHhjaCB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHhfZGFjX2NoYW5uZWwgcmV2bzcxX2Zyb250W10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4X2RhY19jaGFubmVsIHJldm83MV9mcm9udFtdID0gewogCUFLX0RBQygiUENNIFBsYXliYWNrIFZvbHVtZSIsIDIpCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9ha200eHh4X2RhY19jaGFubmVsIHJldm83MV9zdXJyb3VuZFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eF9kYWNfY2hhbm5lbCByZXZvNzFfc3Vycm91bmRbXSA9IHsKIAlBS19EQUMoIlBDTSBDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMSksCiAJQUtfREFDKCJQQ00gTEZFIFBsYXliYWNrIFZvbHVtZSIsIDEpLAogCUFLX0RBQygiUENNIFNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMiksCiAJQUtfREFDKCJQQ00gUmVhciBQbGF5YmFjayBWb2x1bWUiLCAyKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHhfZGFjX2NoYW5uZWwgcmV2bzUxX2RhY1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eF9kYWNfY2hhbm5lbCByZXZvNTFfZGFjW10gPSB7CiAJQUtfREFDKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMiksCiAJQUtfREFDKCJQQ00gQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDEpLAogCUFLX0RBQygiUENNIExGRSBQbGF5YmFjayBWb2x1bWUiLCAxKSwKIAlBS19EQUMoIlBDTSBSZWFyIFBsYXliYWNrIFZvbHVtZSIsIDIpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eF9hZGNfY2hhbm5lbCByZXZvNTFfYWRjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqcmV2bzUxX2FkY19pbnB1dF9uYW1lc1tdID0geworCSJNaWMiLAorCSJMaW5lIiwKKwkiQ0QiLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHhfYWRjX2NoYW5uZWwgcmV2bzUxX2FkY1tdID0gewogCXsKIAkJLm5hbWUgPSAiUENNIENhcHR1cmUgVm9sdW1lIiwKIAkJLnN3aXRjaF9uYW1lID0gIlBDTSBDYXB0dXJlIFN3aXRjaCIsCi0JCS5udW1fY2hhbm5lbHMgPSAyCisJCS5udW1fY2hhbm5lbHMgPSAyLAorCQkuaW5wdXRfbmFtZXMgPSByZXZvNTFfYWRjX2lucHV0X25hbWVzCiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3Jldm9fZnJvbnQgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3Jldm9fZnJvbnQgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzQzODEsCiAJLm51bV9kYWNzID0gMiwKIAkub3BzID0gewpAQCAtMTI0LDcgKzIyOCw3IEBACiAJLmRhY19pbmZvID0gcmV2bzcxX2Zyb250LAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Jldm9fZnJvbnRfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Jldm9fZnJvbnRfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDEsCiAJLmNpZiA9IDAsCiAJLmRhdGFfbWFzayA9IFZUMTcyNF9SRVZPX0NET1VULApAQCAtMTM2LDcgKzI0MCw3IEBACiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2b19zdXJyb3VuZCBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2b19zdXJyb3VuZCBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDM1NSwKIAkuaWR4X29mZnNldCA9IDEsCiAJLm51bV9kYWNzID0gNiwKQEAgLTE0Niw3ICsyNTAsNyBAQAogCS5kYWNfaW5mbyA9IHJldm83MV9zdXJyb3VuZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9yZXZvX3N1cnJvdW5kX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9yZXZvX3N1cnJvdW5kX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAzLAogCS5jaWYgPSAwLAogCS5kYXRhX21hc2sgPSBWVDE3MjRfUkVWT19DRE9VVCwKQEAgLTE1OCw3ICsyNjIsNyBAQAogCS5tYXNrX2ZsYWdzID0gMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3Jldm81MSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2bzUxIF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0MzU4LAogCS5udW1fZGFjcyA9IDYsCiAJLm9wcyA9IHsKQEAgLTE2NywzNiArMjcxLDIxMyBAQAogCS5kYWNfaW5mbyA9IHJldm81MV9kYWMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcmV2bzUxX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9yZXZvNTFfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDIsCiAJLmNpZiA9IDAsCiAJLmRhdGFfbWFzayA9IFZUMTcyNF9SRVZPX0NET1VULAogCS5jbGtfbWFzayA9IFZUMTcyNF9SRVZPX0NDTEssCi0JLmNzX21hc2sgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEgfCBWVDE3MjRfUkVWT19DUzIsCi0JLmNzX2FkZHIgPSBWVDE3MjRfUkVWT19DUzEgfCBWVDE3MjRfUkVWT19DUzIsCi0JLmNzX25vbmUgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEgfCBWVDE3MjRfUkVWT19DUzIsCisJLmNzX21hc2sgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEsCisJLmNzX2FkZHIgPSBWVDE3MjRfUkVWT19DUzEsCisJLmNzX25vbmUgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEsCiAJLmFkZF9mbGFncyA9IFZUMTcyNF9SRVZPX0NDTEssIC8qIGhpZ2ggYXQgaW5pdCAqLwogCS5tYXNrX2ZsYWdzID0gMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3Jldm81MV9hZGMgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3Jldm81MV9hZGMgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzUzNjUsCiAJLm51bV9hZGNzID0gMiwKIAkuYWRjX2luZm8gPSByZXZvNTFfYWRjLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Jldm81MV9hZGNfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Jldm81MV9hZGNfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDIsCiAJLmNpZiA9IDAsCiAJLmRhdGFfbWFzayA9IFZUMTcyNF9SRVZPX0NET1VULAogCS5jbGtfbWFzayA9IFZUMTcyNF9SRVZPX0NDTEssCi0JLmNzX21hc2sgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEgfCBWVDE3MjRfUkVWT19DUzIsCi0JLmNzX2FkZHIgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzIsCi0JLmNzX25vbmUgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEgfCBWVDE3MjRfUkVWT19DUzIsCisJLmNzX21hc2sgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEsCisJLmNzX2FkZHIgPSBWVDE3MjRfUkVWT19DUzAsCisJLmNzX25vbmUgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzEsCiAJLmFkZF9mbGFncyA9IFZUMTcyNF9SRVZPX0NDTEssIC8qIGhpZ2ggYXQgaW5pdCAqLwogCS5tYXNrX2ZsYWdzID0gMCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX3B0MjI1OCBwdGNfcmV2bzUxX3ZvbHVtZTsKKworLyogQUs0MzU4IGZvciBBUDE5MiBEQUMsIEFLNTM4NUEgZm9yIEFEQyAqLworc3RhdGljIHZvaWQgYXAxOTJfc2V0X3JhdGVfdmFsKHN0cnVjdCBzbmRfYWttNHh4eCAqYWssIHVuc2lnbmVkIGludCByYXRlKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gYWstPnByaXZhdGVfZGF0YVswXTsKKworCXJldm9fc2V0X3JhdGVfdmFsKGFrLCByYXRlKTsKKworI2lmIDEgLyogRklYTUU6IGRvIHdlIG5lZWQgdGhpcyBwcm9jZWR1cmU/ICovCisJLyogcmVzZXQgREZTIHBpbiBvZiBBSzUzODVBIGZvciBBREMsIHRvbyAqLworCS8qIERGUzAgKHBpbiAxOCkgLS0gR1BJTzEwIHBpbiA3NyAqLworCXNuZF9pY2UxNzEyX3NhdmVfZ3Bpb19zdGF0dXMoaWNlKTsKKwlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlX2JpdHMoaWNlLCAxIDw8IDEwLAorCQkJCSAgICByYXRlID4gNDgwMDAgPyAoMSA8PCAxMCkgOiAwKTsKKwlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7CisjZW5kaWYKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eF9kYWNfY2hhbm5lbCBhcDE5Ml9kYWNbXSA9IHsKKwlBS19EQUMoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAyKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fYXAxOTIgX19kZXZpbml0ZGF0YSA9IHsKKwkudHlwZSA9IFNORF9BSzQzNTgsCisJLm51bV9kYWNzID0gMiwKKwkub3BzID0geworCQkuc2V0X3JhdGVfdmFsID0gYXAxOTJfc2V0X3JhdGVfdmFsCisJfSwKKwkuZGFjX2luZm8gPSBhcDE5Ml9kYWMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fYXAxOTJfcHJpdiBfX2RldmluaXRkYXRhID0geworCS5jYWRkciA9IDIsCisJLmNpZiA9IDAsCisJLmRhdGFfbWFzayA9IFZUMTcyNF9SRVZPX0NET1VULAorCS5jbGtfbWFzayA9IFZUMTcyNF9SRVZPX0NDTEssCisJLmNzX21hc2sgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzMsCisJLmNzX2FkZHIgPSBWVDE3MjRfUkVWT19DUzMsCisJLmNzX25vbmUgPSBWVDE3MjRfUkVWT19DUzAgfCBWVDE3MjRfUkVWT19DUzMsCisJLmFkZF9mbGFncyA9IFZUMTcyNF9SRVZPX0NDTEssIC8qIGhpZ2ggYXQgaW5pdCAqLworCS5tYXNrX2ZsYWdzID0gMCwKK307CisKKyNpZiAwCisvKiBGSVhNRTogYWs0MTE0IG1ha2VzIHRoZSBzb3VuZCBtdWNoIGxvd2VyIGR1ZSB0byBzb21lIGNvbmZsaWN0aW9uLAorICogICAgICAgIHNvIGxldCdzIGRpc2FibGUgaXQgcmlnaHQgbm93Li4uCisgKi8KKyNkZWZpbmUgQlVJTERfQUs0MTE0X0FQMTkyCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0FLNDExNF9BUDE5MgorLyogQUs0MTE0IHN1cHBvcnQgb24gQXVkaW9waGlsZSAxOTIgKi8KKy8qIENEVE8gKHBpbiAzMikgLS0gR1BJTzIgcGluIDUyCisgKiBDRFRJIChwaW4gMzMpIC0tIEdQSU8zIHBpbiA1MyAoc2hhcmVkIHdpdGggQUs0MzU4KQorICogQ0NMSyAocGluIDM0KSAtLSBHUElPMSBwaW4gNTEgKHNoYXJlZCB3aXRoIEFLNDM1OCkKKyAqIENTTiAgKHBpbiAzNSkgLS0gR1BJTzcgcGluIDU5CisgKi8KKyNkZWZpbmUgQUs0MTE0X0FERFIJMHgwMAorCitzdGF0aWMgdm9pZCB3cml0ZV9kYXRhKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCB1bnNpZ25lZCBpbnQgZ3BpbywKKwkJICAgICAgIHVuc2lnbmVkIGludCBkYXRhLCBpbnQgaWR4KQoreworCWZvciAoOyBpZHggPj0gMDsgaWR4LS0pIHsKKwkJLyogZHJvcCBjbG9jayAqLworCQlncGlvICY9IH5WVDE3MjRfUkVWT19DQ0xLOworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgZ3Bpbyk7CisJCXVkZWxheSgxKTsKKwkJLyogc2V0IGRhdGEgKi8KKwkJaWYgKGRhdGEgJiAoMSA8PCBpZHgpKQorCQkJZ3BpbyB8PSBWVDE3MjRfUkVWT19DRE9VVDsKKwkJZWxzZQorCQkJZ3BpbyAmPSB+VlQxNzI0X1JFVk9fQ0RPVVQ7CisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCBncGlvKTsKKwkJdWRlbGF5KDEpOworCQkvKiByYWlzZSBjbG9jayAqLworCQlncGlvIHw9IFZUMTcyNF9SRVZPX0NDTEs7CisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCBncGlvKTsKKwkJdWRlbGF5KDEpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhZF9kYXRhKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCB1bnNpZ25lZCBpbnQgZ3BpbywKKwkJCSAgICAgICBpbnQgaWR4KQoreworCXVuc2lnbmVkIGNoYXIgZGF0YSA9IDA7CisKKwlmb3IgKDsgaWR4ID49IDA7IGlkeC0tKSB7CisJCS8qIGRyb3AgY2xvY2sgKi8KKwkJZ3BpbyAmPSB+VlQxNzI0X1JFVk9fQ0NMSzsKKwkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIGdwaW8pOworCQl1ZGVsYXkoMSk7CisJCS8qIHJlYWQgZGF0YSAqLworCQlpZiAoc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSkgJiBWVDE3MjRfUkVWT19DRElOKQorCQkJZGF0YSB8PSAoMSA8PCBpZHgpOworCQl1ZGVsYXkoMSk7CisJCS8qIHJhaXNlIGNsb2NrICovCisJCWdwaW8gfD0gVlQxNzI0X1JFVk9fQ0NMSzsKKwkJc25kX2ljZTE3MTJfZ3Bpb193cml0ZShpY2UsIGdwaW8pOworCQl1ZGVsYXkoMSk7CisJfQorCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhcDE5Ml80d2lyZV9zdGFydChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJc25kX2ljZTE3MTJfc2F2ZV9ncGlvX3N0YXR1cyhpY2UpOworCXRtcCA9IHNuZF9pY2UxNzEyX2dwaW9fcmVhZChpY2UpOworCXRtcCB8PSBWVDE3MjRfUkVWT19DQ0xLOyAvKiBoaWdoIGF0IGluaXQgKi8KKwl0bXAgfD0gVlQxNzI0X1JFVk9fQ1MwOworCXRtcCAmPSB+VlQxNzI0X1JFVk9fQ1MzOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxKTsKKwlyZXR1cm4gdG1wOworfQorCitzdGF0aWMgdm9pZCBhcDE5Ml80d2lyZV9maW5pc2goc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHVuc2lnbmVkIGludCB0bXApCit7CisJdG1wIHw9IFZUMTcyNF9SRVZPX0NTMzsKKwl0bXAgfD0gVlQxNzI0X1JFVk9fQ1MwOworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxKTsKKwlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFwMTkyX2FrNDExNF93cml0ZSh2b2lkICpwcml2YXRlX2RhdGEsIHVuc2lnbmVkIGNoYXIgYWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBwcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHRtcCwgYWRkcmRhdGE7CisKKwl0bXAgPSBhcDE5Ml80d2lyZV9zdGFydChpY2UpOworCWFkZHJkYXRhID0gKEFLNDExNF9BRERSIDw8IDYpIHwgMHgyMCB8IChhZGRyICYgMHgxZik7CisJYWRkcmRhdGEgPSAoYWRkcmRhdGEgPDwgOCkgfCBkYXRhOworCXdyaXRlX2RhdGEoaWNlLCB0bXAsIGFkZHJkYXRhLCAxNSk7CisJYXAxOTJfNHdpcmVfZmluaXNoKGljZSwgdG1wKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXAxOTJfYWs0MTE0X3JlYWQodm9pZCAqcHJpdmF0ZV9kYXRhLCB1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBwcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHRtcDsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisKKwl0bXAgPSBhcDE5Ml80d2lyZV9zdGFydChpY2UpOworCXdyaXRlX2RhdGEoaWNlLCB0bXAsIChBSzQxMTRfQUREUiA8PCA2KSB8IChhZGRyICYgMHgxZiksIDcpOworCWRhdGEgPSByZWFkX2RhdGEoaWNlLCB0bXAsIDcpOworCWFwMTkyXzR3aXJlX2ZpbmlzaChpY2UsIHRtcCk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgYXAxOTJfYWs0MTE0X2luaXQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWs0MTE0X2luaXRfdmFsc1tdID0geworCQlBSzQxMTRfUlNUIHwgQUs0MTE0X1BXTiB8IEFLNDExNF9PQ0tTMCB8IEFLNDExNF9PQ0tTMSwKKwkJQUs0MTE0X0RJRl9JMjRJMlMsCisJCUFLNDExNF9UWDFFLAorCQlBSzQxMTRfRUZIXzEwMjQgfCBBSzQxMTRfRElUIHwgQUs0MTE0X0lQUygxKSwKKwkJMCwKKwkJMAorCX07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWs0MTE0X2luaXRfdHhjc2JbXSA9IHsKKwkJMHg0MSwgMHgwMiwgMHgyYywgMHgwMCwgMHgwMAorCX07CisJc3RydWN0IGFrNDExNCAqYWs7CisJaW50IGVycjsKKworCXJldHVybiBzbmRfYWs0MTE0X2NyZWF0ZShpY2UtPmNhcmQsCisJCQkJIGFwMTkyX2FrNDExNF9yZWFkLAorCQkJCSBhcDE5Ml9hazQxMTRfd3JpdGUsCisJCQkJIGFrNDExNF9pbml0X3ZhbHMsIGFrNDExNF9pbml0X3R4Y3NiLAorCQkJCSBpY2UsICZhayk7Cit9CisjZW5kaWYgLyogQlVJTERfQUs0MTE0X0FQMTkyICovCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJldm9faW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKIAlzdHJ1Y3Qgc25kX2FrbTR4eHggKmFrOwpAQCAtMjEzLDYgKzQ5NCwxMCBAQAogCQlpY2UtPm51bV90b3RhbF9kYWNzID0gNjsKIAkJaWNlLT5udW1fdG90YWxfYWRjcyA9IDI7CiAJCWJyZWFrOworCWNhc2UgVlQxNzI0X1NVQkRFVklDRV9BVURJT1BISUxFMTkyOgorCQlpY2UtPm51bV90b3RhbF9kYWNzID0gMjsKKwkJaWNlLT5udW1fdG90YWxfYWRjcyA9IDI7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNuZF9CVUcoKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMzUsMTQgKzUyMCwyOCBAQAogCQlicmVhazsKIAljYXNlIFZUMTcyNF9TVUJERVZJQ0VfUkVWT0xVVElPTjUxOgogCQlpY2UtPmFrbV9jb2RlY3MgPSAyOwotCQlpZiAoKGVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfaW5pdChhaywgJmFrbV9yZXZvNTEsICZha21fcmV2bzUxX3ByaXYsIGljZSkpIDwgMCkKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttX3Jldm81MSwKKwkJCQkJICAgICAgICZha21fcmV2bzUxX3ByaXYsIGljZSk7CisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrICsgMSwgJmFrbV9yZXZvNTFfYWRjLAorCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWsrMSwgJmFrbV9yZXZvNTFfYWRjLAogCQkJCQkgICAgICAgJmFrbV9yZXZvNTFfYWRjX3ByaXYsIGljZSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKLQkJLyogdW5tdXRlIGFsbCBjb2RlY3MgLSBuZWVkZWQhICovCi0JCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGVfYml0cyhpY2UsIFZUMTcyNF9SRVZPX01VVEUsIFZUMTcyNF9SRVZPX01VVEUpOworCQllcnIgPSByZXZvNTFfaTJjX2luaXQoaWNlLCAmcHRjX3Jldm81MV92b2x1bWUpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCS8qIHVubXV0ZSBhbGwgY29kZWNzICovCisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGVfYml0cyhpY2UsIFZUMTcyNF9SRVZPX01VVEUsCisJCQkJCSAgICBWVDE3MjRfUkVWT19NVVRFKTsKKwkJYnJlYWs7CisJY2FzZSBWVDE3MjRfU1VCREVWSUNFX0FVRElPUEhJTEUxOTI6CisJCWljZS0+YWttX2NvZGVjcyA9IDE7CisJCWVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfaW5pdChhaywgJmFrbV9hcDE5MiwgJmFrbV9hcDE5Ml9wcml2LAorCQkJCQkgICAgICAgaWNlKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQkKIAkJYnJlYWs7CiAJfQogCkBAIC0yNTYsMTYgKzU1NSwzNCBAQAogCiAJc3dpdGNoIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IpIHsKIAljYXNlIFZUMTcyNF9TVUJERVZJQ0VfUkVWT0xVVElPTjcxOgorCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2J1aWxkX2NvbnRyb2xzKGljZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CiAJY2FzZSBWVDE3MjRfU1VCREVWSUNFX1JFVk9MVVRJT041MToKIAkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9idWlsZF9jb250cm9scyhpY2UpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CisJCWVyciA9IHNuZF9wdDIyNThfYnVpbGRfY29udHJvbHMoaWNlLT5zcGVjLnJldm81MS5wdDIyNTgpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgVlQxNzI0X1NVQkRFVklDRV9BVURJT1BISUxFMTkyOgorCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2J1aWxkX2NvbnRyb2xzKGljZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKyNpZmRlZiBCVUlMRF9BSzQxMTRfQVAxOTIKKwkJZXJyID0gYXAxOTJfYWs0MTE0X2luaXQoaWNlKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworI2VuZGlmCisJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogLyogZW50cnkgcG9pbnQgKi8KLXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9yZXZvX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK2NvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9yZXZvX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX1JFVk9MVVRJT043MSwKIAkJLm5hbWUgPSAiTSBBdWRpbyBSZXZvbHV0aW9uLTcuMSIsCkBAIC0yODAsNSArNTk3LDEyIEBACiAJCS5jaGlwX2luaXQgPSByZXZvX2luaXQsCiAJCS5idWlsZF9jb250cm9scyA9IHJldm9fYWRkX2NvbnRyb2xzLAogCX0sCisJeworCQkuc3VidmVuZG9yID0gVlQxNzI0X1NVQkRFVklDRV9BVURJT1BISUxFMTkyLAorCQkubmFtZSA9ICJNIEF1ZGlvIEF1ZGlvcGhpbGUxOTIiLAorCQkubW9kZWwgPSAiYXAxOTIiLAorCQkuY2hpcF9pbml0ID0gcmV2b19pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSByZXZvX2FkZF9jb250cm9scywKKwl9LAogCXsgfSAvKiB0ZXJtaW5hdG9yICovCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcmV2by5oIGIvc291bmQvcGNpL2ljZTE3MTIvcmV2by5oCmluZGV4IGVmYmI4NmUuLjJhMjQ0ODggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3Jldm8uaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmgKQEAgLTI2LDEzICsyNiwxNSBAQAogCiAjZGVmaW5lIFJFVk9fREVWSUNFX0RFU0MgXAogCQkie01pZGlNYW4gTSBBdWRpbyxSZXZvbHV0aW9uIDcuMX0sIlwKLQkJIntNaWRpTWFuIE0gQXVkaW8sUmV2b2x1dGlvbiA1LjF9LCIKKwkJIntNaWRpTWFuIE0gQXVkaW8sUmV2b2x1dGlvbiA1LjF9LCJcCisJCSJ7TWlkaU1hbiBNIEF1ZGlvLEF1ZGlvcGhpbGUgMTkyfSwiCiAKICNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9SRVZPTFVUSU9ONzEJMHgxMjE0MzAzNgogI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX1JFVk9MVVRJT041MQkweDEyMTQzMTM2CisjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfQVVESU9QSElMRTE5MgkweDEyMTQzMjM2CiAKIC8qIGVudHJ5IHBvaW50ICovCi1leHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3Jldm9fY2FyZHNbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfcmV2b19jYXJkc1tdOwogCiAKIC8qCkBAIC00Miw5ICs0NCwxMiBAQAogI2RlZmluZSBWVDE3MjRfUkVWT19DQ0xLCTB4MDIKICNkZWZpbmUgVlQxNzI0X1JFVk9fQ0RJTgkweDA0CS8qIG5vdCB1c2VkICovCiAjZGVmaW5lIFZUMTcyNF9SRVZPX0NET1VUCTB4MDgKLSNkZWZpbmUgVlQxNzI0X1JFVk9fQ1MwCQkweDEwCS8qIEFLNTM2NSBjaGlwc2VsZWN0IGZvciBSZXYuIDUuMSAqLworI2RlZmluZSBWVDE3MjRfUkVWT19DUzAJCTB4MTAJLyogQUs1MzY1IGNoaXBzZWxlY3QgZm9yIChyZXZvNTEpICovCiAjZGVmaW5lIFZUMTcyNF9SRVZPX0NTMQkJMHgyMAkvKiBmcm9udCBBS000MzgxIGNoaXBzZWxlY3QgKi8KLSNkZWZpbmUgVlQxNzI0X1JFVk9fQ1MyCQkweDQwCS8qIHN1cnJvdW5kIEFLTTQzNTUgY2hpcHNlbGVjdCAqLworI2RlZmluZSBWVDE3MjRfUkVWT19DUzIJCTB4NDAJLyogc3Vycm91bmQgQUtNNDM1NSBDUyAocmV2bzcxKSAqLworI2RlZmluZSBWVDE3MjRfUkVWT19JMkNfREFUQSAgICAweDQwICAgIC8qIEkyQzogUFQgMjI1OCBTREEgKG9uIHJldm81MSkgKi8KKyNkZWZpbmUgVlQxNzI0X1JFVk9fSTJDX0NMT0NLICAgMHg4MCAgICAvKiBJMkM6IFBUIDIyNTggU0NMIChvbiByZXZvNTEpICovCisjZGVmaW5lIFZUMTcyNF9SRVZPX0NTMwkJMHg4MAkvKiBBSzQxMTQgZm9yIEFQMTkyICovCiAjZGVmaW5lIFZUMTcyNF9SRVZPX01VVEUJKDE8PDIyKQkvKiAwID0gYWxsIG11dGUsIDEgPSBub3JtYWwgb3BlcmF0aW9uICovCiAKICNlbmRpZiAvKiBfX1NPVU5EX1JFVk9fSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Z0MTcyMF9tb2JvLmMKaW5kZXggN2NhMjYzYzEuLjcyYjA2MGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3Z0MTcyMF9tb2JvLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KIAogI2luY2x1ZGUgImljZTE3MTIuaCIKKyNpbmNsdWRlICJlbnZ5MjRodC5oIgogI2luY2x1ZGUgInZ0MTcyMF9tb2JvLmgiCiAKIApAQCAtNTUsNDEgKzU2LDQxIEBACiAKIC8qIEVFUFJPTSBpbWFnZSAqLwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBrOHg4MDBfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKLQkweDAxLAkvKiBTWVNDT05GOiBjbG9jayAyNTYsIDFBREMsIDJEQUNzICovCi0JMHgwMiwJLyogQUNMSU5LOiBBQ0xJTkssIHBhY2tlZCAqLwotCTB4MDAsCS8qIEkyUzogLSAqLwotCTB4MDAsCS8qIFNQRElGOiAtICovCi0JMHhmZiwJLyogR1BJT19ESVIgKi8KLQkweGZmLAkvKiBHUElPX0RJUjEgKi8KLQkweDAwLAkvKiAtICovCi0JMHhmZiwJLyogR1BJT19NQVNLICovCi0JMHhmZiwJLyogR1BJT19NQVNLMSAqLwotCTB4MDAsCS8qIC0gKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFICovCi0JMHgwMCwJLyogR1BJT19TVEFURTEgKi8KLQkweDAwLAkvKiAtICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrOHg4MDBfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKKwlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgwMSwJLyogY2xvY2sgMjU2LCAxQURDLCAyREFDcyAqLworCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDAyLAkvKiBBQ0xJTkssIHBhY2tlZCAqLworCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweDAwLAkvKiAtICovCisJW0lDRV9FRVAyX1NQRElGXSAgICAgICA9IDB4MDAsCS8qIC0gKi8KKwlbSUNFX0VFUDJfR1BJT19ESVJdICAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIxXSAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIyXSAgID0gMHgwMCwJLyogLSAqLworCVtJQ0VfRUVQMl9HUElPX01BU0tdICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX01BU0sxXSAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX01BU0syXSAgPSAweDAwLAkvKiAtICovCisJW0lDRV9FRVAyX0dQSU9fU1RBVEVdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUxXSA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MDAsCS8qIC0gKi8KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNuMjVwX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JMHgwMSwJLyogU1lTQ09ORjogY2xvY2sgMjU2LCAxQURDLCAyREFDcyAqLwotCTB4MDIsCS8qIEFDTElOSzogQUNMSU5LLCBwYWNrZWQgKi8KLQkweDAwLAkvKiBJMlM6IC0gKi8KLQkweDQxLAkvKiBTUERJRjogLSAqLwotCTB4ZmYsCS8qIEdQSU9fRElSICovCi0JMHhmZiwJLyogR1BJT19ESVIxICovCi0JMHgwMCwJLyogLSAqLwotCTB4ZmYsCS8qIEdQSU9fTUFTSyAqLwotCTB4ZmYsCS8qIEdQSU9fTUFTSzEgKi8KLQkweDAwLAkvKiAtICovCi0JMHgwMCwJLyogR1BJT19TVEFURSAqLwotCTB4MDAsCS8qIEdQSU9fU1RBVEUxICovCi0JMHgwMCwJLyogLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc24yNXBfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKKwlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgwMSwJLyogY2xvY2sgMjU2LCAxQURDLCAyREFDcyAqLworCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDAyLAkvKiBBQ0xJTkssIHBhY2tlZCAqLworCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweDAwLAkvKiAtICovCisJW0lDRV9FRVAyX1NQRElGXSAgICAgICA9IDB4NDEsCS8qIC0gKi8KKwlbSUNFX0VFUDJfR1BJT19ESVJdICAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIxXSAgID0gMHhmZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIyXSAgID0gMHgwMCwJLyogLSAqLworCVtJQ0VfRUVQMl9HUElPX01BU0tdICAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX01BU0sxXSAgPSAweGZmLAorCVtJQ0VfRUVQMl9HUElPX01BU0syXSAgPSAweDAwLAkvKiAtICovCisJW0lDRV9FRVAyX0dQSU9fU1RBVEVdICA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUxXSA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MDAsCS8qIC0gKi8KIH07CiAKIAogLyogZW50cnkgcG9pbnQgKi8KLXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyMF9tb2JvX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK2NvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyMF9tb2JvX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjBfU1VCREVWSUNFX0s4WDgwMCwKIAkJLm5hbWUgPSAiQWxiYXRyb24gSzhYODAwIFBybyBJSSIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi92dDE3MjBfbW9iby5oIGIvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uaAppbmRleCAwYjFiMGVlLi43MGFmM2FkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi92dDE3MjBfbW9iby5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Z0MTcyMF9tb2JvLmgKQEAgLTM2LDYgKzM2LDYgQEAKICNkZWZpbmUgVlQxNzIwX1NVQkRFVklDRV85Q0pTCQkweDBmMjcyMzI3CiAjZGVmaW5lIFZUMTcyMF9TVUJERVZJQ0VfU04yNVAJCTB4OTcxMjM2NTAKIAotZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjBfbW9ib19jYXJkc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjBfbW9ib19jYXJkc1tdOwogCiAjZW5kaWYgLyogX19TT1VORF9WVDE3MjBfTU9CT19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi93dG0uYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3d0bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzA2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi93dG0uYwpAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqCUFMU0EgZHJpdmVyIGZvciBJQ0Vuc2VtYmxlIFZUMTcyNCAoRW52eTI0SFQpCisgKgkKKyAqCUxvd2xldmVsIGZ1bmN0aW9ucyBmb3IgRWdvIFN5cyBXYXZldGVybWluYWwgMTkyTQorICoKKyAqCQlDb3B5cmlnaHQgKGMpIDIwMDYgR3VlZGV6IENsZW1lbnQgPGtsZW0uZGV2QGdtYWlsLmNvbT4KKyAqCQlTb21lIGZ1bmN0aW9ucyBhcmUgdGFrZW4gZnJvbSB0aGUgUHJvZGlneTE5MiBkcml2ZXIKKyAqCQlzb3VyY2UKKyAqCQkKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCQorICovCQorCisKKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisKKyNpbmNsdWRlICJpY2UxNzEyLmgiCisjaW5jbHVkZSAiZW52eTI0aHQuaCIKKyNpbmNsdWRlICJ3dG0uaCIKKyNpbmNsdWRlICJzdGFjOTQ2eC5oIgorCisKKy8qCisgKgkyKkFEQyA2KkRBQyBubzEgcmluZ2J1ZmZlciByL3cgb24gaTJjIGJ1cyAKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN0YWM5NDYwX3B1dChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgaW50IHJlZywgCisJCQkJCQl1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlzbmRfdnQxNzI0X3dyaXRlX2kyYyhpY2UsIFNUQUM5NDYwX0kyQ19BRERSLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBzdGFjOTQ2MF9nZXQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIGludCByZWcpCit7CisJcmV0dXJuIHNuZF92dDE3MjRfcmVhZF9pMmMoaWNlLCBTVEFDOTQ2MF9JMkNfQUREUiwgcmVnKTsKK30KKworLyoKKyAqCTIqQURDIDIqREFDIG5vMiByaW5nYnVmZmVyIHIvdyBvbiBpMmMgYnVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFjOTQ2MF8yX3B1dChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSwgaW50IHJlZywKKwkJCQkJCXVuc2lnbmVkIGNoYXIgdmFsKQoreworCXNuZF92dDE3MjRfd3JpdGVfaTJjKGljZSwgU1RBQzk0NjBfMl9JMkNfQUREUiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgc3RhYzk0NjBfMl9nZXQoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIGludCByZWcpCit7CisJcmV0dXJuIHNuZF92dDE3MjRfcmVhZF9pMmMoaWNlLCBTVEFDOTQ2MF8yX0kyQ19BRERSLCByZWcpOworfQorCisKKy8qCisgKglEQUMgbXV0ZSBjb250cm9sCisgKi8KK3N0YXRpYyBpbnQgc3RhYzk0NjBfZGFjX211dGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfZGFjX211dGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCSAgICAgICAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlpbnQgaWR4LCBpZDsKKworCWlmIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgeworCQlpZHggPSBTVEFDOTQ2WF9NQVNURVJfVk9MVU1FOworCQlpZCA9IDA7CisJfSBlbHNlIHsKKwkJaWQgPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwkJaWR4ID0gaWQgKyBTVEFDOTQ2WF9MRl9WT0xVTUU7CisJfQorCWlmIChpZCA8IDYpCisJCXZhbCA9IHN0YWM5NDYwX2dldChpY2UsIGlkeCk7CisJZWxzZSAKKwkJdmFsID0gc3RhYzk0NjBfMl9nZXQoaWNlLGlkeCAtIDYpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKH52YWwgPj4gNykgJiAweDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfZGFjX211dGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCSAgICAgICAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIG5ldywgb2xkOworCWludCBpZCwgaWR4OworCWludCBjaGFuZ2U7CisKKwlpZiAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpIHsKKwkJaWR4ID0gU1RBQzk0NlhfTUFTVEVSX1ZPTFVNRTsKKwkJb2xkID0gc3RhYzk0NjBfZ2V0KGljZSwgaWR4KTsKKwkJbmV3ID0gKH51Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTw8IDcgJiAweDgwKSB8CisJCSAgICAgICAJCQkJCShvbGQgJiB+MHg4MCk7CisJCWNoYW5nZSA9IChuZXcgIT0gb2xkKTsKKwkJaWYgKGNoYW5nZSkgeworCQkJc3RhYzk0NjBfcHV0KGljZSwgaWR4LCBuZXcpOworCQkJc3RhYzk0NjBfMl9wdXQoaWNlLCBpZHgsIG5ldyk7CisJCX0KKwl9IGVsc2UgeworCQlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCQlpZHggPSBpZCArIFNUQUM5NDZYX0xGX1ZPTFVNRTsKKwkJaWYgKGlkIDwgNikKKwkJCW9sZCA9IHN0YWM5NDYwX2dldChpY2UsIGlkeCk7CisJCWVsc2UgCisJCQlvbGQgPSBzdGFjOTQ2MF8yX2dldChpY2UsIGlkeCAtIDYpOworCQluZXcgPSAofnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdPDwgNyAmIDB4ODApIHwKKwkJCQkJCQkob2xkICYgfjB4ODApOworCQljaGFuZ2UgPSAobmV3ICE9IG9sZCk7CisJCWlmIChjaGFuZ2UpIHsKKwkJCWlmIChpZCA8IDYpCisJCQkgICAgICAgCXN0YWM5NDYwX3B1dChpY2UsIGlkeCwgbmV3KTsKKwkJCWVsc2UKKwkJCSAgICAgICAJc3RhYzk0NjBfMl9wdXQoaWNlLCBpZHggLSA2LCBuZXcpOworCQl9CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiAJREFDIHZvbHVtZSBhdHRlbnVhdGlvbiBtaXhlciBjb250cm9sCisgKi8KK3N0YXRpYyBpbnQgc3RhYzk0NjBfZGFjX3ZvbF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCSAgICAgICAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsJCQkvKiBtdXRlICovCisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHg3ZjsJCS8qIDBkQiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5NDYwX2RhY192b2xfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCSAgICAgICAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaWR4LCBpZDsKKwl1bnNpZ25lZCBjaGFyIHZvbDsKKworCWlmIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgeworCQlpZHggPSBTVEFDOTQ2WF9NQVNURVJfVk9MVU1FOworCQlpZCA9IDA7CisJfSBlbHNlIHsKKwkJaWQgPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwkJaWR4ID0gaWQgKyBTVEFDOTQ2WF9MRl9WT0xVTUU7CisJfQorCWlmIChpZCA8IDYpCisJCXZvbCA9IHN0YWM5NDYwX2dldChpY2UsIGlkeCkgJiAweDdmOworCWVsc2UgCisJCXZvbCA9IHN0YWM5NDYwXzJfZ2V0KGljZSwgaWR4IC0gNikgJiAweDdmOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMHg3ZiAtIHZvbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTQ2MF9kYWNfdm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGlkeCwgaWQ7CisJdW5zaWduZWQgY2hhciB0bXAsIG92b2wsIG52b2w7CisJaW50IGNoYW5nZTsKKworCWlmIChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgeworCQlpZHggPSBTVEFDOTQ2WF9NQVNURVJfVk9MVU1FOworCQludm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJCXRtcCA9IHN0YWM5NDYwX2dldChpY2UsIGlkeCk7CisJCW92b2wgPSAweDdmIC0gKHRtcCAmIDB4N2YpOworCQljaGFuZ2UgPSAob3ZvbCAhPSBudm9sKTsKKwkJaWYgKGNoYW5nZSkgeworCQkJIHN0YWM5NDYwX3B1dChpY2UsIGlkeCwgKDB4N2YgLSBudm9sKSB8ICh0bXAgJiAweDgwKSk7CisJCQkgc3RhYzk0NjBfMl9wdXQoaWNlLCBpZHgsICgweDdmIC0gbnZvbCkgfCAodG1wICYgMHg4MCkpOworCQl9CisJfSBlbHNlIHsKKwkJaWQgPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwkJaWR4ID0gaWQgKyBTVEFDOTQ2WF9MRl9WT0xVTUU7CisJCW52b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJaWYgKGlkIDwgNikKKwkJCXRtcCA9IHN0YWM5NDYwX2dldChpY2UsIGlkeCk7CisJCWVsc2UgCisJCQl0bXAgPSBzdGFjOTQ2MF8yX2dldChpY2UsIGlkeCAtIDYpOworCQlvdm9sID0gMHg3ZiAtICh0bXAgJiAweDdmKTsKKwkJY2hhbmdlID0gKG92b2wgIT0gbnZvbCk7CisJCWlmIChjaGFuZ2UpIHsKKwkJCWlmIChpZCA8IDYpCisJCQkJc3RhYzk0NjBfcHV0KGljZSwgaWR4LCAoMHg3ZiAtIG52b2wpIHwKKwkJCQkJICAgICAgIAkJKHRtcCAmIDB4ODApKTsKKwkJCWVsc2UgCisJCQkJc3RhYzk0NjBfMl9wdXQoaWNlLCBpZHgtNiwgKDB4N2YgLSBudm9sKSB8CisJCQkJCSAgICAgICAJCQkodG1wICYgMHg4MCkpOworCQl9CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKiBBREMgbXV0ZSBjb250cm9sCisgKi8KK3N0YXRpYyBpbnQgc3RhYzk0NjBfYWRjX211dGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfbXV0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgdmFsOworCWludCBpLCBpZDsKKwkKKwlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCWlmIChpZCA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJCXZhbCA9IHN0YWM5NDYwX2dldChpY2UsIFNUQUM5NDZYX01JQ19MX1ZPTFVNRSArIGkpOworCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPSB+dmFsPj43ICYgMHgxOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQkJdmFsID0gc3RhYzk0NjBfMl9nZXQoaWNlLCBTVEFDOTQ2WF9NSUNfTF9WT0xVTUUgKyBpKTsKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gfnZhbD4+NyAmIDB4MTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgbmV3LCBvbGQ7CisJaW50IGksIHJlZywgaWQ7CisJaW50IGNoYW5nZTsKKwkKKwlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCWlmIChpZCA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJCXJlZyA9IFNUQUM5NDZYX01JQ19MX1ZPTFVNRSArIGk7CisJCQlvbGQgPSBzdGFjOTQ2MF9nZXQoaWNlLCByZWcpOworCQkJbmV3ID0gKH51Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXTw8NyYweDgwKSB8CisJCQkgICAgICAgCQkJCQkob2xkJn4weDgwKTsKKwkJCWNoYW5nZSA9IChuZXcgIT0gb2xkKTsKKwkJCWlmIChjaGFuZ2UpCisJCQkJc3RhYzk0NjBfcHV0KGljZSwgcmVnLCBuZXcpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQkJcmVnID0gU1RBQzk0NlhfTUlDX0xfVk9MVU1FICsgaTsKKwkJCW9sZCA9IHN0YWM5NDYwXzJfZ2V0KGljZSwgcmVnKTsKKwkJCW5ldyA9ICh+dWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV08PDcmMHg4MCkgfAorCQkJICAgICAgIAkJCQkJKG9sZCZ+MHg4MCk7CisJCQljaGFuZ2UgPSAobmV3ICE9IG9sZCk7CisJCQlpZiAoY2hhbmdlKQorCQkJCXN0YWM5NDYwXzJfcHV0KGljZSwgcmVnLCBuZXcpOworCQl9CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qCisgKkFEQyBnYWluIG1peGVyIGNvbnRyb2wKKyAqLworc3RhdGljIGludCBzdGFjOTQ2MF9hZGNfdm9sX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMjsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwkJLyogMGRCICovCisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHgwZjsJLyogMjIuNWRCICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfYWRjX3ZvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBpLCByZWcsIGlkOworCXVuc2lnbmVkIGNoYXIgdm9sOworCQorCWlkID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJaWYgKGlkID09IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQkJcmVnID0gU1RBQzk0NlhfTUlDX0xfVk9MVU1FICsgaTsKKwkJCXZvbCA9IHN0YWM5NDYwX2dldChpY2UsIHJlZykgJiAweDBmOworCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPSAweDBmIC0gdm9sOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQkJcmVnID0gU1RBQzk0NlhfTUlDX0xfVk9MVU1FICsgaTsKKwkJCXZvbCA9IHN0YWM5NDYwXzJfZ2V0KGljZSwgcmVnKSAmIDB4MGY7CisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IDB4MGYgLSB2b2w7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfYWRjX3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGksIHJlZywgaWQ7CisJdW5zaWduZWQgY2hhciBvdm9sLCBudm9sOworCWludCBjaGFuZ2U7CisJCisJaWQgPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKKwlpZiAoaWQgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCQlyZWcgPSBTVEFDOTQ2WF9NSUNfTF9WT0xVTUUgKyBpOworCQkJbnZvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldOworCQkJb3ZvbCA9IDB4MGYgLSBzdGFjOTQ2MF9nZXQoaWNlLCByZWcpOworCQkJY2hhbmdlID0gKChvdm9sICYgMHgwZikgIT0gbnZvbCk7CisJCQlpZiAoY2hhbmdlKQorCQkJCXN0YWM5NDYwX3B1dChpY2UsIHJlZywgKDB4MGYgLSBudm9sKSB8CisJCQkJCSAgICAgICAJCShvdm9sICYgfjB4MGYpKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJCXJlZyA9IFNUQUM5NDZYX01JQ19MX1ZPTFVNRSArIGk7CisJCQludm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV07CisJCQlvdm9sID0gMHgwZiAtIHN0YWM5NDYwXzJfZ2V0KGljZSwgcmVnKTsKKwkJCWNoYW5nZSA9ICgob3ZvbCAmIDB4MGYpICE9IG52b2wpOworCQkJaWYgKGNoYW5nZSkKKwkJCQlzdGFjOTQ2MF8yX3B1dChpY2UsIHJlZywgKDB4MGYgLSBudm9sKSB8CisJCQkJCSAgICAgICAJCShvdm9sICYgfjB4MGYpKTsKKwkJfQorCX0KKwlyZXR1cm4gY2hhbmdlOworfQorCisvKgorICogTUlDIC8gTElORSBzd2l0Y2ggZm9uY3Rpb24KKyAqLworCitzdGF0aWMgaW50IHN0YWM5NDYwX21pY19zd19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCSAgICAgICAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5NDYwX21pY19zd19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciB2YWw7CisJaW50IGlkOworCQkKKwlpZCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOworCWlmIChpZCA9PSAwKQorCSAgICAgICAJdmFsID0gc3RhYzk0NjBfZ2V0KGljZSwgU1RBQzk0NlhfR0VORVJBTF9QVVJQT1NFKTsKKwllbHNlCisJICAgICAgIAl2YWwgPSBzdGFjOTQ2MF8yX2dldChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB+dmFsPj43ICYgMHgxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YWM5NDYwX21pY19zd19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciBuZXcsIG9sZDsKKwlpbnQgY2hhbmdlLCBpZDsKKworCWlkID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJaWYgKGlkID09IDApCisJICAgICAgIAlvbGQgPSBzdGFjOTQ2MF9nZXQoaWNlLCBTVEFDOTQ2WF9HRU5FUkFMX1BVUlBPU0UpOworCWVsc2UKKwkgICAgICAgCW9sZCA9IHN0YWM5NDYwXzJfZ2V0KGljZSwgU1RBQzk0NlhfR0VORVJBTF9QVVJQT1NFKTsKKwluZXcgPSAofnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdPDwgNyAmIDB4ODApIHwgKG9sZCAmIH4weDgwKTsKKwljaGFuZ2UgPSAobmV3ICE9IG9sZCk7CisJaWYgKGNoYW5nZSkgeworCQlpZiAoaWQgPT0gMCkKKwkJICAgICAgIAlzdGFjOTQ2MF9wdXQoaWNlLCBTVEFDOTQ2WF9HRU5FUkFMX1BVUlBPU0UsIG5ldyk7CisJCWVsc2UKKwkJICAgICAgIAlzdGFjOTQ2MF8yX3B1dChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSwgbmV3KTsKKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworLyoKKyAqIENvbnRyb2wgdGFicworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RhYzk2NDBfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAorCQkuaW5mbyA9IHN0YWM5NDYwX2RhY19tdXRlX2luZm8sCisJCS5nZXQgPSBzdGFjOTQ2MF9kYWNfbXV0ZV9nZXQsCisJCS5wdXQgPSBzdGFjOTQ2MF9kYWNfbXV0ZV9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gMQorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsCisJCS5pbmZvID0gc3RhYzk0NjBfZGFjX3ZvbF9pbmZvLAorCQkuZ2V0ID0gc3RhYzk0NjBfZGFjX3ZvbF9nZXQsCisJCS5wdXQgPSBzdGFjOTQ2MF9kYWNfdm9sX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiTUlDL0xpbmUgc3dpdGNoIiwKKwkJLmNvdW50ID0gMiwKKwkJLmluZm8gPSBzdGFjOTQ2MF9taWNfc3dfaW5mbywKKwkJLmdldCA9IHN0YWM5NDYwX21pY19zd19nZXQsCisJCS5wdXQgPSBzdGFjOTQ2MF9taWNfc3dfcHV0LAorCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJEQUMgU3dpdGNoIiwKKwkJLmNvdW50ID0gOCwKKwkJLmluZm8gPSBzdGFjOTQ2MF9kYWNfbXV0ZV9pbmZvLAorCQkuZ2V0ID0gc3RhYzk0NjBfZGFjX211dGVfZ2V0LAorCQkucHV0ID0gc3RhYzk0NjBfZGFjX211dGVfcHV0LAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiREFDIFZvbHVtZSIsCisJCS5jb3VudCA9IDgsCisJCS5pbmZvID0gc3RhYzk0NjBfZGFjX3ZvbF9pbmZvLAorCQkuZ2V0ID0gc3RhYzk0NjBfZGFjX3ZvbF9nZXQsCisJCS5wdXQgPSBzdGFjOTQ2MF9kYWNfdm9sX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkFEQyBTd2l0Y2giLAorCQkuY291bnQgPSAyLAorCQkuaW5mbyA9IHN0YWM5NDYwX2FkY19tdXRlX2luZm8sCisJCS5nZXQgPSBzdGFjOTQ2MF9hZGNfbXV0ZV9nZXQsCisJCS5wdXQgPSBzdGFjOTQ2MF9hZGNfbXV0ZV9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJBREMgVm9sdW1lIiwKKwkJLmNvdW50ID0gMiwKKwkJLmluZm8gPSBzdGFjOTQ2MF9hZGNfdm9sX2luZm8sCisJCS5nZXQgPSBzdGFjOTQ2MF9hZGNfdm9sX2dldCwKKwkJLnB1dCA9IHN0YWM5NDYwX2FkY192b2xfcHV0LAorCisJfQkKK307CisKKworCisvKklOSVQqLworc3RhdGljIGludCBfX2RldmluaXQgd3RtX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhYzk2NDBfY29udHJvbHMpOyBpKyspIHsKKwkJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLAorCQkJCXNuZF9jdGxfbmV3MSgmc3RhYzk2NDBfY29udHJvbHNbaV0sIGljZSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3dG1faW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgc3RhY19pbml0c19wcm9kaWd5W10gPSB7CisJCVNUQUM5NDZYX1JFU0VULCAwLAorCQkodW5zaWduZWQgc2hvcnQpLTEKKwl9OworCXVuc2lnbmVkIHNob3J0ICpwOworCQkKKwkvKldUTSAxOTJNKi8KKwlpY2UtPm51bV90b3RhbF9kYWNzID0gODsKKwlpY2UtPm51bV90b3RhbF9hZGNzID0gNDsKKwlpY2UtPmZvcmNlX3JkbWExID0gMTsKKworCS8qaW5pdGlhbGl6ZSBjb2RlYyovCisJcCA9IHN0YWNfaW5pdHNfcHJvZGlneTsKKwlmb3IgKDsgKnAgIT0gKHVuc2lnbmVkIHNob3J0KS0xOyBwICs9IDIpIHsKKwkJc3RhYzk0NjBfcHV0KGljZSwgcFswXSwgcFsxXSk7CisJCXN0YWM5NDYwXzJfcHV0KGljZSwgcFswXSwgcFsxXSk7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHd0bV9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworCTB4NDcsCS8qU1lTQ09ORjogY2xvY2sgMTkyS0h6LCA0QURDLCA4REFDICovCisJMHg4MCwJLyogQUNMSU5LIDogSTJTICovCisJMHhmOCwJLyogSTJTOiB2b2w7IDk2aywgMjRiaXQsIDE5MmsgKi8KKwkweGMxCS8qU1BESUY6IG91dC1lbiwgc3BpZGYgZXh0IG91dCovLAorCTB4OWYsCS8qIEdQSU9fRElSICovCisJMHhmZiwJLyogR1BJT19ESVIxICovCisJMHg3ZiwJLyogR1BJT19ESVIyICovCisJMHg5ZiwJLyogR1BJT19NQVNLICovCisJMHhmZiwJLyogR1BJT19NQVNLMSAqLworCTB4N2YsCS8qIEdQSU9fTUFTSzIgKi8KKwkweDE2LAkvKiBHUElPX1NUQVRFICovCisJMHg4MCwJLyogR1BJT19TVEFURTEgKi8KKwkweDAwLAkvKiBHUElPX1NUQVRFMiAqLworfTsKKworCisvKmVudHJ5IHBvaW50Ki8KK3N0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF93dG1fY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfV1RNLAorCQkubmFtZSA9ICJFU0kgV2F2ZXRlcm1pbmFsIDE5Mk0iLAorCQkubW9kZWwgPSAiV1QxOTJNIiwKKwkJLmNoaXBfaW5pdCA9IHd0bV9pbml0LAorCQkuYnVpbGRfY29udHJvbHMgPSB3dG1fYWRkX2NvbnRyb2xzLAorCQkuZWVwcm9tX3NpemUgPSBzaXplb2Yod3RtX2VlcHJvbSksCisJCS5lZXByb21fZGF0YSA9IHd0bV9lZXByb20sCisJfSwKKwl7fSAvKnRlcm1pbmF0b3IqLworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3d0bS5oIGIvc291bmQvcGNpL2ljZTE3MTIvd3RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhMzk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3d0bS5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX19TT1VORF9XVE1fSAorI2RlZmluZSBfX1NPVU5EX1dUTV9ICisKKy8qIElEICovCisjZGVmaW5lIFdUTV9ERVZJQ0VfREVTQwkJIntFR08gU1lTIElOQyxXYXZlVGVybWluYWwgMTkyTX0sIgorI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX1dUTQkweDM2NDk1MzQ1CS8qIFdUMTkyTSB2ZXIxLjAgKi8KKworLyoKKyAqY2hpcCBhZGRyZXNzZXMgb24gSTJDIGJ1cworICovCisKKyNkZWZpbmUJQUs0MTE0X0FERFIJCTB4MjAJLypTL1BESUYgcmVjZWl2ZXIqLworI2RlZmluZSBTVEFDOTQ2MF9JMkNfQUREUgkweDU0CS8qIEFEQyoyIHwgREFDKjYgKi8JCisjZGVmaW5lIFNUQUM5NDYwXzJfSTJDX0FERFIJMHg1NgkvKiBBREN8REFDICoyICovCQorCisKK2V4dGVybiBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfd3RtX2NhcmRzW107CisKKyNlbmRpZiAvKiBfX1NPVU5EX1dUTV9IICovCisKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jIGIvc291bmQvcGNpL2ludGVsOHgwLmMKaW5kZXggMzBhYWE2MC4uYTI4OWFiZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ludGVsOHgwLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwLmMKQEAgLTcxLDYgKzcxLDcgQEAKIHN0YXRpYyBpbnQgYnVnZ3lfc2VtYXBob3JlOwogc3RhdGljIGludCBidWdneV9pcnEgPSAtMTsgLyogYXV0by1jaGVjayAqLwogc3RhdGljIGludCB4Ym94Oworc3RhdGljIGludCBzcGRpZl9hY2xpbmsgPSAtMTsKIAogbW9kdWxlX3BhcmFtKGluZGV4LCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBJbnRlbCBpOHgwIHNvdW5kY2FyZC4iKTsKQEAgLTg2LDYgKzg3LDggQEAKIE1PRFVMRV9QQVJNX0RFU0MoYnVnZ3lfaXJxLCAiRW5hYmxlIHdvcmthcm91bmQgZm9yIGJ1Z2d5IGludGVycnVwdHMgb24gc29tZSBtb3RoZXJib2FyZHMuIik7CiBtb2R1bGVfcGFyYW0oeGJveCwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHhib3gsICJTZXQgdG8gMSBmb3IgWGJveCwgaWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCB0aGUgQUMnOTcgY29kZWMgZGV0ZWN0aW9uLiIpOworbW9kdWxlX3BhcmFtKHNwZGlmX2FjbGluaywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3BkaWZfYWNsaW5rLCAiUy9QRElGIG92ZXIgQUMtbGluay4iKTsKIAogLyoganVzdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwogc3RhdGljIGludCBlbmFibGU7CkBAIC0zNjgsMTIgKzM3MSw4IEBACiAKIAlpbnQgaXJxOwogCi0JdW5zaWduZWQgaW50IG1taW87Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCXZvaWQgX19pb21lbSAqcmVtYXBfYWRkcjsKLQl1bnNpZ25lZCBpbnQgYm1fbW1pbzsKLQl1bnNpZ25lZCBsb25nIGJtYWRkcjsKLQl2b2lkIF9faW9tZW0gKnJlbWFwX2JtYWRkcjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJdm9pZCBfX2lvbWVtICpibWFkZHI7CiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKQEAgLTQ0Niw3MiArNDQ1LDQ4IEBACiAgKiAgTG93bGV2ZWwgSS9PIC0gYnVzbWFzdGVyCiAgKi8KIAotc3RhdGljIHU4IGlnZXRieXRlKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTggaWdldGJ5dGUoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0KQogewotCWlmIChjaGlwLT5ibV9tbWlvKQotCQlyZXR1cm4gcmVhZGIoY2hpcC0+cmVtYXBfYm1hZGRyICsgb2Zmc2V0KTsKLQllbHNlCi0JCXJldHVybiBpbmIoY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKKwlyZXR1cm4gaW9yZWFkOChjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdTE2IGlnZXR3b3JkKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTE2IGlnZXR3b3JkKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCkKIHsKLQlpZiAoY2hpcC0+Ym1fbW1pbykKLQkJcmV0dXJuIHJlYWR3KGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlyZXR1cm4gaW53KGNoaXAtPmJtYWRkciArIG9mZnNldCk7CisJcmV0dXJuIGlvcmVhZDE2KGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB1MzIgaWdldGR3b3JkKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTMyIGlnZXRkd29yZChzdHJ1Y3QgaW50ZWw4eDAgKmNoaXAsIHUzMiBvZmZzZXQpCiB7Ci0JaWYgKGNoaXAtPmJtX21taW8pCi0JCXJldHVybiByZWFkbChjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJcmV0dXJuIGlubChjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworCXJldHVybiBpb3JlYWQzMihjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCBpcHV0Ynl0ZShzdHJ1Y3QgaW50ZWw4eDAgKmNoaXAsIHUzMiBvZmZzZXQsIHU4IHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHV0Ynl0ZShzdHJ1Y3QgaW50ZWw4eDAgKmNoaXAsIHUzMiBvZmZzZXQsIHU4IHZhbCkKIHsKLQlpZiAoY2hpcC0+Ym1fbW1pbykKLQkJd3JpdGViKHZhbCwgY2hpcC0+cmVtYXBfYm1hZGRyICsgb2Zmc2V0KTsKLQllbHNlCi0JCW91dGIodmFsLCBjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworCWlvd3JpdGU4KHZhbCwgY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIHZvaWQgaXB1dHdvcmQoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0LCB1MTYgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIGlwdXR3b3JkKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCwgdTE2IHZhbCkKIHsKLQlpZiAoY2hpcC0+Ym1fbW1pbykKLQkJd3JpdGV3KHZhbCwgY2hpcC0+cmVtYXBfYm1hZGRyICsgb2Zmc2V0KTsKLQllbHNlCi0JCW91dHcodmFsLCBjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworCWlvd3JpdGUxNih2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwdXRkd29yZChzdHJ1Y3QgaW50ZWw4eDAgKmNoaXAsIHUzMiBvZmZzZXQsIHUzMiB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgaXB1dGR3b3JkKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCwgdTMyIHZhbCkKIHsKLQlpZiAoY2hpcC0+Ym1fbW1pbykKLQkJd3JpdGVsKHZhbCwgY2hpcC0+cmVtYXBfYm1hZGRyICsgb2Zmc2V0KTsKLQllbHNlCi0JCW91dGwodmFsLCBjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworCWlvd3JpdGUzMih2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKIC8qCiAgKiAgTG93bGV2ZWwgSS9PIC0gQUMnOTcgcmVnaXN0ZXJzCiAgKi8KIAotc3RhdGljIHUxNiBpYWdldHdvcmQoc3RydWN0IGludGVsOHgwICpjaGlwLCB1MzIgb2Zmc2V0KQorc3RhdGljIGlubGluZSB1MTYgaWFnZXR3b3JkKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCkKIHsKLQlpZiAoY2hpcC0+bW1pbykKLQkJcmV0dXJuIHJlYWR3KGNoaXAtPnJlbWFwX2FkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJcmV0dXJuIGludyhjaGlwLT5hZGRyICsgb2Zmc2V0KTsKKwlyZXR1cm4gaW9yZWFkMTYoY2hpcC0+YWRkciArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlhcHV0d29yZChzdHJ1Y3QgaW50ZWw4eDAgKmNoaXAsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgaWFwdXR3b3JkKHN0cnVjdCBpbnRlbDh4MCAqY2hpcCwgdTMyIG9mZnNldCwgdTE2IHZhbCkKIHsKLQlpZiAoY2hpcC0+bW1pbykKLQkJd3JpdGV3KHZhbCwgY2hpcC0+cmVtYXBfYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlvdXR3KHZhbCwgY2hpcC0+YWRkciArIG9mZnNldCk7CisJaW93cml0ZTE2KHZhbCwgY2hpcC0+YWRkciArIG9mZnNldCk7CiB9CiAKIC8qCkBAIC0xNjA2LDEwICsxNTgxLDE0IEBACiAJY2FzZSBERVZJQ0VfSU5URUxfSUNINDoKIAkJdGJsID0gaW50ZWxfcGNtczsKIAkJdGJsc2l6ZSA9IEFSUkFZX1NJWkUoaW50ZWxfcGNtcyk7CisJCWlmIChzcGRpZl9hY2xpbmspCisJCQl0YmxzaXplLS07CiAJCWJyZWFrOwogCWNhc2UgREVWSUNFX05GT1JDRToKIAkJdGJsID0gbmZvcmNlX3BjbXM7CiAJCXRibHNpemUgPSBBUlJBWV9TSVpFKG5mb3JjZV9wY21zKTsKKwkJaWYgKHNwZGlmX2FjbGluaykKKwkJCXRibHNpemUtLTsKIAkJYnJlYWs7CiAJY2FzZSBERVZJQ0VfQUxJOgogCQl0YmwgPSBhbGlfcGNtczsKQEAgLTIwNjgsMjQgKzIwNDcsMjYgQEAKIAl9OwogCiAJY2hpcC0+c3BkaWZfaWR4ID0gLTE7IC8qIHVzZSBQQ01PVVQgKG9yIGRpc2FibGVkKSAqLwotCXN3aXRjaCAoY2hpcC0+ZGV2aWNlX3R5cGUpIHsKLQljYXNlIERFVklDRV9ORk9SQ0U6Ci0JCWNoaXAtPnNwZGlmX2lkeCA9IE5WRF9TUEJBUjsKLQkJYnJlYWs7Ci0JY2FzZSBERVZJQ0VfQUxJOgotCQljaGlwLT5zcGRpZl9pZHggPSBBTElEX0FDOTdTUERJRk9VVDsKLQkJYnJlYWs7Ci0JY2FzZSBERVZJQ0VfSU5URUxfSUNINDoKLQkJY2hpcC0+c3BkaWZfaWR4ID0gSUNIRF9TUEJBUjsKLQkJYnJlYWs7Ci0JfTsKKwlpZiAoIXNwZGlmX2FjbGluaykgeworCQlzd2l0Y2ggKGNoaXAtPmRldmljZV90eXBlKSB7CisJCWNhc2UgREVWSUNFX05GT1JDRToKKwkJCWNoaXAtPnNwZGlmX2lkeCA9IE5WRF9TUEJBUjsKKwkJCWJyZWFrOworCQljYXNlIERFVklDRV9BTEk6CisJCQljaGlwLT5zcGRpZl9pZHggPSBBTElEX0FDOTdTUERJRk9VVDsKKwkJCWJyZWFrOworCQljYXNlIERFVklDRV9JTlRFTF9JQ0g0OgorCQkJY2hpcC0+c3BkaWZfaWR4ID0gSUNIRF9TUEJBUjsKKwkJCWJyZWFrOworCQl9OworCX0KIAogCWNoaXAtPmluX2FjOTdfaW5pdCA9IDE7CiAJCiAJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOwogCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKIAlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF9pbnRlbDh4MF9taXhlcl9mcmVlX2FjOTc7Ci0JYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX01PREVNOworCWFjOTcuc2NhcHMgPSBBQzk3X1NDQVBfU0tJUF9NT0RFTSB8IEFDOTdfU0NBUF9QT1dFUl9TQVZFOwogCWlmIChjaGlwLT54Ym94KQogCQlhYzk3LnNjYXBzIHw9IEFDOTdfU0NBUF9ERVRFQ1RfQllfVkVORE9SOwogCWlmIChjaGlwLT5kZXZpY2VfdHlwZSAhPSBERVZJQ0VfQUxJKSB7CkBAIC0yMjAxLDExICsyMTgyLDExIEBACiAJCWlmICgoaWdldGR3b3JkKGNoaXAsIElDSFJFRyhHTE9CX1NUQSkpICYgSUNIX1NBTVBMRV9DQVApID09IElDSF9TQU1QTEVfMTZfMjApCiAJCQljaGlwLT5zbXAyMGJpdCA9IDE7CiAJfQotCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfTkZPUkNFKSB7CisJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9ORk9SQ0UgJiYgIXNwZGlmX2FjbGluaykgewogCQkvKiA0OGtIeiBvbmx5ICovCiAJCWNoaXAtPmljaGRbY2hpcC0+c3BkaWZfaWR4XS5wY20tPnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDA7CiAJfQotCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfSU5URUxfSUNINCkgeworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfSU5URUxfSUNINCAmJiAhc3BkaWZfYWNsaW5rKSB7CiAJCS8qIHVzZSBzbG90IDEwLzExIGZvciBTUERJRiAqLwogCQl1MzIgdmFsOwogCQl2YWwgPSBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfQ05UKSkgJiB+SUNIX1BDTV9TUERJRl9NQVNLOwpAQCAtMjMzMyw3ICsyMzE0LDcgQEAKIAkJLyogdW5tdXRlIHRoZSBvdXRwdXQgb24gU0lTNzAxMiAqLwogCQlpcHV0d29yZChjaGlwLCAweDRjLCBpZ2V0d29yZChjaGlwLCAweDRjKSB8IDEpOwogCX0KLQlpZiAoY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX05GT1JDRSkgeworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfTkZPUkNFICYmICFzcGRpZl9hY2xpbmspIHsKIAkJLyogZW5hYmxlIFNQRElGIGludGVycnVwdCAqLwogCQl1bnNpZ25lZCBpbnQgdmFsOwogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoY2hpcC0+cGNpLCAweDRjLCAmdmFsKTsKQEAgLTI0MjYsNyArMjQwNyw3IEBACiAJLyogcmVzZXQgY2hhbm5lbHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+YmRiYXJzX2NvdW50OyBpKyspCiAJCWlwdXRieXRlKGNoaXAsIElDSF9SRUdfT0ZGX0NSICsgY2hpcC0+aWNoZFtpXS5yZWdfb2Zmc2V0LCBJQ0hfUkVTRVRSRUdTKTsKLQlpZiAoY2hpcC0+ZGV2aWNlX3R5cGUgPT0gREVWSUNFX05GT1JDRSkgeworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfTkZPUkNFICYmICFzcGRpZl9hY2xpbmspIHsKIAkJLyogc3RvcCB0aGUgc3BkaWYgaW50ZXJydXB0ICovCiAJCXVuc2lnbmVkIGludCB2YWw7CiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjaGlwLT5wY2ksIDB4NGMsICZ2YWwpOwpAQCAtMjQ0MywxMCArMjQyNCwxMCBAQAogCQkJZmlsbF9ub2NhY2hlKGNoaXAtPmJkYmFycy5hcmVhLCBjaGlwLT5iZGJhcnMuYnl0ZXMsIDApOwogCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPmJkYmFycyk7CiAJfQotCWlmIChjaGlwLT5yZW1hcF9hZGRyKQotCQlpb3VubWFwKGNoaXAtPnJlbWFwX2FkZHIpOwotCWlmIChjaGlwLT5yZW1hcF9ibWFkZHIpCi0JCWlvdW5tYXAoY2hpcC0+cmVtYXBfYm1hZGRyKTsKKwlpZiAoY2hpcC0+YWRkcikKKwkJcGNpX2lvdW5tYXAoY2hpcC0+cGNpLCBjaGlwLT5hZGRyKTsKKwlpZiAoY2hpcC0+Ym1hZGRyKQorCQlwY2lfaW91bm1hcChjaGlwLT5wY2ksIGNoaXAtPmJtYWRkcik7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOwogCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOwogCWtmcmVlKGNoaXApOwpAQCAtMjUyMCw3ICsyNTAxLDcgQEAKIAlzbmRfaW50ZWw4eDBfY2hpcF9pbml0KGNoaXAsIDApOwogCiAJLyogcmUtaW5pdGlhbGl6ZSBtaXhlciBzdHVmZiAqLwotCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfSU5URUxfSUNINCkgeworCWlmIChjaGlwLT5kZXZpY2VfdHlwZSA9PSBERVZJQ0VfSU5URUxfSUNINCAmJiAhc3BkaWZfYWNsaW5rKSB7CiAJCS8qIGVuYWJsZSBzZXBhcmF0ZSBTRElOcyBmb3IgSUNINCAqLwogCQlpcHV0Ynl0ZShjaGlwLCBJQ0hSRUcoU0RNKSwgY2hpcC0+c2RtX3NhdmVkKTsKIAkJLyogdXNlIHNsb3QgMTAvMTEgZm9yIFNQRElGICovCkBAIC0yNzkzLDM1ICsyNzc0LDI3IEBACiAKIAlpZiAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX0FMSSkgewogCQkvKiBBTEk1NDU1IGhhcyBubyBhYzk3IHJlZ2lvbiAqLwotCQljaGlwLT5ibWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKwkJY2hpcC0+Ym1hZGRyID0gcGNpX2lvbWFwKHBjaSwgMCwgMCk7CiAJCWdvdG8gcG9ydF9pbml0ZWQ7CiAJfQogCi0JaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwY2ksIDIpICYgSU9SRVNPVVJDRV9NRU0pIHsJLyogSUNINCBhbmQgTmZvcmNlICovCi0JCWNoaXAtPm1taW8gPSAxOwotCQljaGlwLT5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7Ci0JCWNoaXAtPnJlbWFwX2FkZHIgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+YWRkciwKLQkJCQkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAyKSk7Ci0JCWlmIChjaGlwLT5yZW1hcF9hZGRyID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkFDJzk3IHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7Ci0JCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfSBlbHNlIHsKLQkJY2hpcC0+YWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGNpLCAyKSAmIElPUkVTT1VSQ0VfTUVNKSAvKiBJQ0g0IGFuZCBOZm9yY2UgKi8KKwkJY2hpcC0+YWRkciA9IHBjaV9pb21hcChwY2ksIDIsIDApOworCWVsc2UKKwkJY2hpcC0+YWRkciA9IHBjaV9pb21hcChwY2ksIDAsIDApOworCWlmICghY2hpcC0+YWRkcikgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOworCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FSU87CiAJfQotCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGNpLCAzKSAmIElPUkVTT1VSQ0VfTUVNKSB7CS8qIElDSDQgKi8KLQkJY2hpcC0+Ym1fbW1pbyA9IDE7Ci0JCWNoaXAtPmJtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDMpOwotCQljaGlwLT5yZW1hcF9ibWFkZHIgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+Ym1hZGRyLAotCQkJCQkJICAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMykpOwotCQlpZiAoY2hpcC0+cmVtYXBfYm1hZGRyID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIkNvbnRyb2xsZXIgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKLQkJCXNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9IGVsc2UgewotCQljaGlwLT5ibWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAxKTsKKwlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBjaSwgMykgJiBJT1JFU09VUkNFX01FTSkgLyogSUNINCAqLworCQljaGlwLT5ibWFkZHIgPSBwY2lfaW9tYXAocGNpLCAzLCAwKTsKKwllbHNlCisJCWNoaXAtPmJtYWRkciA9IHBjaV9pb21hcChwY2ksIDEsIDApOworCWlmICghY2hpcC0+Ym1hZGRyKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIkNvbnRyb2xsZXIgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKKwkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUlPOwogCX0KIAogIHBvcnRfaW5pdGVkOgpAQCAtMjk2NCw2ICsyOTM3LDI5IEBACiAJeyAwLCBOVUxMIH0sCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgc3BkaWZfYWNsaW5rX2RlZmF1bHRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTQ3YiwgMHgxYzFhLCAiQVNVUyBLTjgiLCAxKSwKKwl7IH0gLyogZW5kICovCit9OworCisvKiBsb29rIHVwIHdoaXRlL2JsYWNrIGxpc3QgZm9yIFNQRElGIG92ZXIgYWMtbGluayAqLworc3RhdGljIGludCBfX2RldmluaXQgY2hlY2tfZGVmYXVsdF9zcGRpZl9hY2xpbmsoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwljb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqdzsKKworCXcgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChwY2ksIHNwZGlmX2FjbGlua19kZWZhdWx0cyk7CisJaWYgKHcpIHsKKwkJaWYgKHctPnZhbHVlKQorCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJpbnRlbDh4MDogVXNpbmcgU1BESUYgb3ZlciAiCisJCQkJICAgICJBQy1MaW5rIGZvciAlc1xuIiwgdy0+bmFtZSk7CisJCWVsc2UKKwkJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaW50ZWw4eDA6IFVzaW5nIGludGVncmF0ZWQgIgorCQkJCSAgICAiU1BESUYgRE1BIGZvciAlc1xuIiwgdy0+bmFtZSk7CisJCXJldHVybiB3LT52YWx1ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlbDh4MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAogCQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQogewpAQCAtMjk3NiwxNiArMjk3MiwxOCBAQAogCWlmIChjYXJkID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc3dpdGNoIChwY2lfaWQtPmRyaXZlcl9kYXRhKSB7Ci0JY2FzZSBERVZJQ0VfTkZPUkNFOgotCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiTkZPUkNFIik7Ci0JCWJyZWFrOwotCWNhc2UgREVWSUNFX0lOVEVMX0lDSDQ6Ci0JCXN0cmNweShjYXJkLT5kcml2ZXIsICJJQ0g0Iik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXN0cmNweShjYXJkLT5kcml2ZXIsICJJQ0giKTsKLQkJYnJlYWs7CisJaWYgKHNwZGlmX2FjbGluayA8IDApCisJCXNwZGlmX2FjbGluayA9IGNoZWNrX2RlZmF1bHRfc3BkaWZfYWNsaW5rKHBjaSk7CisKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiSUNIIik7CisJaWYgKCFzcGRpZl9hY2xpbmspIHsKKwkJc3dpdGNoIChwY2lfaWQtPmRyaXZlcl9kYXRhKSB7CisJCWNhc2UgREVWSUNFX05GT1JDRToKKwkJCXN0cmNweShjYXJkLT5kcml2ZXIsICJORk9SQ0UiKTsKKwkJCWJyZWFrOworCQljYXNlIERFVklDRV9JTlRFTF9JQ0g0OgorCQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIklDSDQiKTsKKwkJfQogCX0KIAogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJJbnRlbCBJQ0giKTsKQEAgLTMwMjUsOCArMzAyMyw4IEBACiAJc25kX2ludGVsOHgwX3Byb2NfaW5pdChjaGlwKTsKIAogCXNucHJpbnRmKGNhcmQtPmxvbmduYW1lLCBzaXplb2YoY2FyZC0+bG9uZ25hbWUpLAotCQkgIiVzIHdpdGggJXMgYXQgJSNseCwgaXJxICVpIiwgY2FyZC0+c2hvcnRuYW1lLAotCQkgc25kX2FjOTdfZ2V0X3Nob3J0X25hbWUoY2hpcC0+YWM5N1swXSksIGNoaXAtPmFkZHIsIGNoaXAtPmlycSk7CisJCSAiJXMgd2l0aCAlcyBhdCBpcnEgJWkiLCBjYXJkLT5zaG9ydG5hbWUsCisJCSBzbmRfYWM5N19nZXRfc2hvcnRfbmFtZShjaGlwLT5hYzk3WzBdKSwgY2hpcC0+aXJxKTsKIAogCWlmICghIGFjOTdfY2xvY2spCiAJCWludGVsOHgwX21lYXN1cmVfYWM5N19jbG9jayhjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYyBiL3NvdW5kL3BjaS9pbnRlbDh4MG0uYwppbmRleCAwOWRjZjkyLi5jMTU1ZTFmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCkBAIC0xOTYsMTIgKzE5Niw4IEBACiAKIAlpbnQgaXJxOwogCi0JdW5zaWduZWQgaW50IG1taW87Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCXZvaWQgX19pb21lbSAqcmVtYXBfYWRkcjsKLQl1bnNpZ25lZCBpbnQgYm1fbW1pbzsKLQl1bnNpZ25lZCBsb25nIGJtYWRkcjsKLQl2b2lkIF9faW9tZW0gKnJlbWFwX2JtYWRkcjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJdm9pZCBfX2lvbWVtICpibWFkZHI7CiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKQEAgLTI1Myw3MiArMjQ5LDQ4IEBACiAgKiAgTG93bGV2ZWwgSS9PIC0gYnVzbWFzdGVyCiAgKi8KIAotc3RhdGljIHU4IGlnZXRieXRlKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHU4IGlnZXRieXRlKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQpCiB7Ci0JaWYgKGNoaXAtPmJtX21taW8pCi0JCXJldHVybiByZWFkYihjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJcmV0dXJuIGluYihjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworCXJldHVybiBpb3JlYWQ4KGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyB1MTYgaWdldHdvcmQoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTE2IGlnZXR3b3JkKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQpCiB7Ci0JaWYgKGNoaXAtPmJtX21taW8pCi0JCXJldHVybiByZWFkdyhjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJcmV0dXJuIGludyhjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworCXJldHVybiBpb3JlYWQxNihjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdTMyIGlnZXRkd29yZChzdHJ1Y3QgaW50ZWw4eDBtICpjaGlwLCB1MzIgb2Zmc2V0KQorc3RhdGljIGlubGluZSB1MzIgaWdldGR3b3JkKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQpCiB7Ci0JaWYgKGNoaXAtPmJtX21taW8pCi0JCXJldHVybiByZWFkbChjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJcmV0dXJuIGlubChjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworCXJldHVybiBpb3JlYWQzMihjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCBpcHV0Ynl0ZShzdHJ1Y3QgaW50ZWw4eDBtICpjaGlwLCB1MzIgb2Zmc2V0LCB1OCB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgaXB1dGJ5dGUoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCwgdTggdmFsKQogewotCWlmIChjaGlwLT5ibV9tbWlvKQotCQl3cml0ZWIodmFsLCBjaGlwLT5yZW1hcF9ibWFkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJb3V0Yih2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7CisJaW93cml0ZTgodmFsLCBjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCBpcHV0d29yZChzdHJ1Y3QgaW50ZWw4eDBtICpjaGlwLCB1MzIgb2Zmc2V0LCB1MTYgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIGlwdXR3b3JkKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCiB7Ci0JaWYgKGNoaXAtPmJtX21taW8pCi0JCXdyaXRldyh2YWwsIGNoaXAtPnJlbWFwX2JtYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlvdXR3KHZhbCwgY2hpcC0+Ym1hZGRyICsgb2Zmc2V0KTsKKwlpb3dyaXRlMTYodmFsLCBjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCBpcHV0ZHdvcmQoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHV0ZHdvcmQoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCwgdTMyIHZhbCkKIHsKLQlpZiAoY2hpcC0+Ym1fbW1pbykKLQkJd3JpdGVsKHZhbCwgY2hpcC0+cmVtYXBfYm1hZGRyICsgb2Zmc2V0KTsKLQllbHNlCi0JCW91dGwodmFsLCBjaGlwLT5ibWFkZHIgKyBvZmZzZXQpOworCWlvd3JpdGUzMih2YWwsIGNoaXAtPmJtYWRkciArIG9mZnNldCk7CiB9CiAKIC8qCiAgKiAgTG93bGV2ZWwgSS9PIC0gQUMnOTcgcmVnaXN0ZXJzCiAgKi8KIAotc3RhdGljIHUxNiBpYWdldHdvcmQoc3RydWN0IGludGVsOHgwbSAqY2hpcCwgdTMyIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTE2IGlhZ2V0d29yZChzdHJ1Y3QgaW50ZWw4eDBtICpjaGlwLCB1MzIgb2Zmc2V0KQogewotCWlmIChjaGlwLT5tbWlvKQotCQlyZXR1cm4gcmVhZHcoY2hpcC0+cmVtYXBfYWRkciArIG9mZnNldCk7Ci0JZWxzZQotCQlyZXR1cm4gaW53KGNoaXAtPmFkZHIgKyBvZmZzZXQpOworCXJldHVybiBpb3JlYWQxNihjaGlwLT5hZGRyICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIHZvaWQgaWFwdXR3b3JkKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgaWFwdXR3b3JkKHN0cnVjdCBpbnRlbDh4MG0gKmNoaXAsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCiB7Ci0JaWYgKGNoaXAtPm1taW8pCi0JCXdyaXRldyh2YWwsIGNoaXAtPnJlbWFwX2FkZHIgKyBvZmZzZXQpOwotCWVsc2UKLQkJb3V0dyh2YWwsIGNoaXAtPmFkZHIgKyBvZmZzZXQpOworCWlvd3JpdGUxNih2YWwsIGNoaXAtPmFkZHIgKyBvZmZzZXQpOwogfQogCiAvKgpAQCAtODU4LDcgKzgzMCw3IEBACiAJbWVtc2V0KCZhYzk3LCAwLCBzaXplb2YoYWM5NykpOwogCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKIAlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF9pbnRlbDh4MF9taXhlcl9mcmVlX2FjOTc7Ci0JYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX0FVRElPOworCWFjOTcuc2NhcHMgPSBBQzk3X1NDQVBfU0tJUF9BVURJTyB8IEFDOTdfU0NBUF9QT1dFUl9TQVZFOwogCiAJZ2xvYl9zdGEgPSBpZ2V0ZHdvcmQoY2hpcCwgSUNIUkVHKEdMT0JfU1RBKSk7CiAKQEAgLTEwMTksMTAgKzk5MSwxMCBAQAogICAgICAgX19od19lbmQ6CiAJaWYgKGNoaXAtPmJkYmFycy5hcmVhKQogCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPmJkYmFycyk7Ci0JaWYgKGNoaXAtPnJlbWFwX2FkZHIpCi0JCWlvdW5tYXAoY2hpcC0+cmVtYXBfYWRkcik7Ci0JaWYgKGNoaXAtPnJlbWFwX2JtYWRkcikKLQkJaW91bm1hcChjaGlwLT5yZW1hcF9ibWFkZHIpOworCWlmIChjaGlwLT5hZGRyKQorCQlwY2lfaW91bm1hcChjaGlwLT5wY2ksIGNoaXAtPmFkZHIpOworCWlmIChjaGlwLT5ibWFkZHIpCisJCXBjaV9pb3VubWFwKGNoaXAtPnBjaSwgY2hpcC0+Ym1hZGRyKTsKIAlpZiAoY2hpcC0+aXJxID49IDApCiAJCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcCk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOwpAQCAtMTE3MywzNSArMTE0NSwyNyBAQAogCiAJaWYgKGRldmljZV90eXBlID09IERFVklDRV9BTEkpIHsKIAkJLyogQUxJNTQ1NSBoYXMgbm8gYWM5NyByZWdpb24gKi8KLQkJY2hpcC0+Ym1hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CisJCWNoaXAtPmJtYWRkciA9IHBjaV9pb21hcChwY2ksIDAsIDApOwogCQlnb3RvIHBvcnRfaW5pdGVkOwogCX0KIAotCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGNpLCAyKSAmIElPUkVTT1VSQ0VfTUVNKSB7CS8qIElDSDQgYW5kIE5mb3JjZSAqLwotCQljaGlwLT5tbWlvID0gMTsKLQkJY2hpcC0+YWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDIpOwotCQljaGlwLT5yZW1hcF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmFkZHIsCi0JCQkJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMikpOwotCQlpZiAoY2hpcC0+cmVtYXBfYWRkciA9PSBOVUxMKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJBQyc5NyBzcGFjZSBpb3JlbWFwIHByb2JsZW1cbiIpOwotCQkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0gZWxzZSB7Ci0JCWNoaXAtPmFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKKwlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBjaSwgMikgJiBJT1JFU09VUkNFX01FTSkgLyogSUNINCBhbmQgTmZvcmNlICovCisJCWNoaXAtPmFkZHIgPSBwY2lfaW9tYXAocGNpLCAyLCAwKTsKKwllbHNlCisJCWNoaXAtPmFkZHIgPSBwY2lfaW9tYXAocGNpLCAwLCAwKTsKKwlpZiAoIWNoaXAtPmFkZHIpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiQUMnOTcgc3BhY2UgaW9yZW1hcCBwcm9ibGVtXG4iKTsKKwkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7CisJCXJldHVybiAtRUlPOwogCX0KLQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBjaSwgMykgJiBJT1JFU09VUkNFX01FTSkgewkvKiBJQ0g0ICovCi0JCWNoaXAtPmJtX21taW8gPSAxOwotCQljaGlwLT5ibWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAzKTsKLQkJY2hpcC0+cmVtYXBfYm1hZGRyID0gaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmJtYWRkciwKLQkJCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihwY2ksIDMpKTsKLQkJaWYgKGNoaXAtPnJlbWFwX2JtYWRkciA9PSBOVUxMKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDb250cm9sbGVyIHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7Ci0JCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfSBlbHNlIHsKLQkJY2hpcC0+Ym1hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMSk7CisJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwY2ksIDMpICYgSU9SRVNPVVJDRV9NRU0pIC8qIElDSDQgKi8KKwkJY2hpcC0+Ym1hZGRyID0gcGNpX2lvbWFwKHBjaSwgMywgMCk7CisJZWxzZQorCQljaGlwLT5ibWFkZHIgPSBwY2lfaW9tYXAocGNpLCAxLCAwKTsKKwlpZiAoIWNoaXAtPmJtYWRkcikgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDb250cm9sbGVyIHNwYWNlIGlvcmVtYXAgcHJvYmxlbVxuIik7CisJCXNuZF9pbnRlbDh4MF9mcmVlKGNoaXApOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKICBwb3J0X2luaXRlZDoKQEAgLTEzMzksOCArMTMwMyw4IEBACiAJCiAJc25kX2ludGVsOHgwbV9wcm9jX2luaXQoY2hpcCk7CiAKLQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHgsIGlycSAlaSIsCi0JCWNhcmQtPnNob3J0bmFtZSwgY2hpcC0+YWRkciwgY2hpcC0+aXJxKTsKKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgaXJxICVpIiwKKwkJY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5pcnEpOwogCiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYyBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCmluZGV4IDM0NWVlZmUuLjIxZDA4OTlhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYworKysgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CkBAIC0yNjMsNyArMjY0LDE1IEBACiAjZGVmaW5lIENPTU1BTkRfQUNLX0RFTEFZICAgMTMgICAgICAgICAvLyBudW1iZXIgb2YgUlRDIHRpY2tzIHRvIHdhaXQgZm9yIGFuIGFja25vd2xlZGdlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZnJvbSB0aGUgY2FyZCBhZnRlciBzZW5kaW5nIGEgY29tbWFuZC4KIAorI2RlZmluZSBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCiAjaW5jbHVkZSAia29yZzEyMTItZmlybXdhcmUuaCIKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgc3RhdGljX2RzcF9jb2RlID0geworCS5kYXRhID0gKHU4ICopZHNwQ29kZSwKKwkuc2l6ZSA9IHNpemVvZiBkc3BDb2RlCit9OworI2VuZGlmCiAKIGVudW0gQ2xvY2tTb3VyY2VJbmRleCB7CiAgICBLMTIxMl9DTEtJRFhfQWRhdEF0NDRfMUsgPSAwLCAgICAvLyBzZWxlY3RzIHNvdXJjZSBhcyBBREFUIGF0IDQ0LjEga0h6CkBAIC0zNDUsOCArMzU0LDYgQEAKICAgICAgICAgc3RydWN0IHNuZF9kbWFfYnVmZmVyIGRtYV9yZWM7CiAJc3RydWN0IHNuZF9kbWFfYnVmZmVyIGRtYV9zaGFyZWQ7CiAKLSAgICAgICAgdTMyIGRzcENvZGVTaXplOwotCiAJdTMyIERhdGFCdWZzU2l6ZTsKIAogICAgICAgICBzdHJ1Y3QgS29yZ0F1ZGlvQnVmZmVyICAqIHBsYXlEYXRhQnVmc1B0cjsKQEAgLTEyMjMsOCArMTIzMCw2IEBACiAKICAgICAgICAgc25kX2tvcmcxMjEyX3NldENhcmRTdGF0ZShrb3JnMTIxMiwgSzEyMTJfU1RBVEVfRFNQX0lOX1BST0NFU1MpOwogCi0gICAgICAgIG1lbWNweShrb3JnMTIxMi0+ZG1hX2RzcC5hcmVhLCBkc3BDb2RlLCBrb3JnMTIxMi0+ZHNwQ29kZVNpemUpOwotCiAgICAgICAgIHJjID0gc25kX2tvcmcxMjEyX1NlbmQxMjEyQ29tbWFuZChrb3JnMTIxMiwgSzEyMTJfREJfU3RhcnREU1BEb3dubG9hZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcHBlcldvcmRTd2FwKGtvcmcxMjEyLT5kbWFfZHNwLmFkZHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOwpAQCAtMjE1Niw2ICsyMTYxLDcgQEAKICAgICAgICAgdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgaW9wb3J0X3NpemUsIGlvbWVtX3NpemUsIGlvbWVtMl9zaXplOwogICAgICAgICBzdHJ1Y3Qgc25kX2tvcmcxMjEyICoga29yZzEyMTI7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpkc3BfY29kZTsKIAogICAgICAgICBzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsKICAgICAgICAgICAgICAgICAuZGV2X2ZyZWUgPSBzbmRfa29yZzEyMTJfZGV2X2ZyZWUsCkBAIC0yMzI5LDggKzIzMzUsNiBAQAogCiAjZW5kaWYgLy8gSzEyMTJfTEFSR0VBTExPQwogCi0gICAgICAgIGtvcmcxMjEyLT5kc3BDb2RlU2l6ZSA9IHNpemVvZiAoZHNwQ29kZSk7Ci0KICAgICAgICAga29yZzEyMTItPlZvbHVtZVRhYmxlUGh5ID0ga29yZzEyMTItPnNoYXJlZEJ1ZmZlclBoeSArCiAJCW9mZnNldG9mKHN0cnVjdCBLb3JnU2hhcmVkQnVmZmVyLCB2b2x1bWVEYXRhKTsKICAgICAgICAga29yZzEyMTItPlJvdXRpbmdUYWJsZVBoeSA9IGtvcmcxMjEyLT5zaGFyZWRCdWZmZXJQaHkgKwpAQCAtMjMzOCwxNyArMjM0Miw0MCBAQAogICAgICAgICBrb3JnMTIxMi0+QWRhdFRpbWVDb2RlUGh5ID0ga29yZzEyMTItPnNoYXJlZEJ1ZmZlclBoeSArCiAJCW9mZnNldG9mKHN0cnVjdCBLb3JnU2hhcmVkQnVmZmVyLCBBZGF0VGltZUNvZGUpOwogCisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZHNwX2NvZGUsICJrb3JnL2sxMjEyLmRzcCIsICZwY2ktPmRldik7CisJaWYgKGVyciA8IDApIHsKKwkJcmVsZWFzZV9maXJtd2FyZShkc3BfY29kZSk7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCQlkc3BfY29kZSA9ICZzdGF0aWNfZHNwX2NvZGU7CisjZWxzZQorCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJmaXJtd2FyZSBub3QgYXZhaWxhYmxlXG4iKTsKKwkJc25kX2tvcmcxMjEyX2ZyZWUoa29yZzEyMTIpOworCQlyZXR1cm4gZXJyOworI2VuZGlmCisJfQorCiAJaWYgKHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLCBzbmRfZG1hX3BjaV9kYXRhKHBjaSksCi0JCQkJa29yZzEyMTItPmRzcENvZGVTaXplLCAma29yZzEyMTItPmRtYV9kc3ApIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJrb3JnMTIxMjogY2FuIG5vdCBhbGxvY2F0ZSBkc3AgY29kZSBtZW1vcnkgKCVkIGJ5dGVzKVxuIiwga29yZzEyMTItPmRzcENvZGVTaXplKTsKKwkJCQlkc3BfY29kZS0+c2l6ZSwgJmtvcmcxMjEyLT5kbWFfZHNwKSA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAia29yZzEyMTI6IGNhbm5vdCBhbGxvY2F0ZSBkc3AgY29kZSBtZW1vcnkgKCV6ZCBieXRlcylcbiIsIGRzcF9jb2RlLT5zaXplKTsKICAgICAgICAgICAgICAgICBzbmRfa29yZzEyMTJfZnJlZShrb3JnMTIxMik7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCQlpZiAoZHNwX2NvZGUgIT0gJnN0YXRpY19kc3BfY29kZSkKKyNlbmRpZgorCQkJcmVsZWFzZV9maXJtd2FyZShkc3BfY29kZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgIH0KIAogICAgICAgICBLMTIxMl9ERUJVR19QUklOVEsoIksxMjEyX0RFQlVHOiBEU1AgQ29kZSBhcmVhID0gMHglcCAoMHglMDh4KSAlZCBieXRlcyBbJXNdXG4iLAotCQkgICBrb3JnMTIxMi0+ZG1hX2RzcC5hcmVhLCBrb3JnMTIxMi0+ZG1hX2RzcC5hZGRyLCBrb3JnMTIxMi0+ZHNwQ29kZVNpemUsCisJCSAgIGtvcmcxMjEyLT5kbWFfZHNwLmFyZWEsIGtvcmcxMjEyLT5kbWFfZHNwLmFkZHIsIGRzcF9jb2RlLT5zaXplLAogCQkgICBzdGF0ZU5hbWVba29yZzEyMTItPmNhcmRTdGF0ZV0pOwogCisJbWVtY3B5KGtvcmcxMjEyLT5kbWFfZHNwLmFyZWEsIGRzcF9jb2RlLT5kYXRhLCBkc3BfY29kZS0+c2l6ZSk7CisKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisJaWYgKGRzcF9jb2RlICE9ICZzdGF0aWNfZHNwX2NvZGUpCisjZW5kaWYKKwkJcmVsZWFzZV9maXJtd2FyZShkc3BfY29kZSk7CisKIAlyYyA9IHNuZF9rb3JnMTIxMl9TZW5kMTIxMkNvbW1hbmQoa29yZzEyMTIsIEsxMjEyX0RCX1JlYm9vdENhcmQsIDAsIDAsIDAsIDApOwogCiAJaWYgKHJjKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21hZXN0cm8zLmMgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwppbmRleCA2ZWZlNmQ1Li40NTI2OTA0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWFlc3RybzMuYworKysgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpAQCAtNDgsNiArNDksNyBAQAogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCiBNT0RVTEVfQVVUSE9SKCJaYWNoIEJyb3duIDx6YWJAemFiYm8ubmV0PiwgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJFU1MgTWFlc3RybzMgUENJIik7CkBAIC03NjgsMjEgKzc3MCw2IEBACiAvKgogICovCiAKLS8qIHF1aXJrIGxpc3RzICovCi1zdHJ1Y3QgbTNfcXVpcmsgewotCWNvbnN0IGNoYXIgKm5hbWU7CS8qIGRldmljZSBuYW1lICovCi0JdTE2IHZlbmRvciwgZGV2aWNlOwkvKiBzdWJzeXN0ZW0gaWRzICovCi0JaW50IGFtcF9ncGlvOwkJLyogZ3BpbyBwaW4gIyAgZm9yIGV4dGVybmFsIGFtcCwgLTEgPSBkZWZhdWx0ICovCi0JaW50IGlyZGFfd29ya2Fyb3VuZDsJLyogbm9uLXplcm8gaWYgYXZvaWQgdG8gdG91Y2ggMHgxMCBvbiBHUElPX0RJUkVDVElPTgotCQkJCSAgIChlLmcuIGZvciBJckRBIG9uIERlbGwgSW5zcGlyb25zKSAqLwotfTsKLQotc3RydWN0IG0zX2h2X3F1aXJrIHsKLQl1MTYgdmVuZG9yLCBkZXZpY2UsIHN1YnN5c3RlbV92ZW5kb3IsIHN1YnN5c3RlbV9kZXZpY2U7Ci0JdTMyIGNvbmZpZzsJCS8qIEFMTEVHUk9fQ09ORklHIGhhcmR3YXJlIHZvbHVtZSBiaXRzICovCi0JaW50IGlzX29tbmlib29rOwkvKiBEbyBIUCBPbW5pQm9vayBHUElPIG1hZ2ljPyAqLwotfTsKLQogc3RydWN0IG0zX2xpc3QgewogCWludCBjdXJsZW47CiAJaW50IG1lbV9hZGRyOwpAQCAtODMwLDggKzgxNyw2IEBACiAJc3RydWN0IHNuZF9wY20gKnBjbTsKIAogCXN0cnVjdCBwY2lfZGV2ICpwY2k7Ci0JY29uc3Qgc3RydWN0IG0zX3F1aXJrICpxdWlyazsKLQljb25zdCBzdHJ1Y3QgbTNfaHZfcXVpcmsgKmh2X3F1aXJrOwogCiAJaW50IGRhY3NfYWN0aXZlOwogCWludCB0aW1lcl91c2VyczsKQEAgLTg0NSw3ICs4MzAsMTEgQEAKIAl1OCByZXNldF9zdGF0ZTsKIAogCWludCBleHRlcm5hbF9hbXA7Ci0JaW50IGFtcF9ncGlvOworCWludCBhbXBfZ3BpbzsJLyogZ3BpbyBwaW4gIyAgZm9yIGV4dGVybmFsIGFtcCwgLTEgPSBkZWZhdWx0ICovCisJdW5zaWduZWQgaW50IGh2X2NvbmZpZzsJCS8qIGhhcmR3YXJlLXZvbHVtZSBjb25maWcgYml0cyAqLworCXVuc2lnbmVkIGlyZGFfd29ya2Fyb3VuZCA6MTsJLyogYXZvaWQgdG8gdG91Y2ggMHgxMCBvbiBHUElPX0RJUkVDVElPTgorCQkJCQkgICAoZS5nLiBmb3IgSXJEQSBvbiBEZWxsIEluc3Bpcm9ucykgKi8KKwl1bnNpZ25lZCBpc19vbW5pYm9vayA6MTsJLyogRG8gSFAgT21uaUJvb2sgR1BJTyBtYWdpYz8gKi8KIAogCS8qIG1pZGkgKi8KIAlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOwpAQCAtODY0LDYgKzg1Myw5IEBACiAjaWZkZWYgQ09ORklHX1BNCiAJdTE2ICpzdXNwZW5kX21lbTsKICNlbmRpZgorCisJY29uc3Qgc3RydWN0IGZpcm13YXJlICphc3NwX2tlcm5lbF9pbWFnZTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmFzc3BfbWluaXNyY19pbWFnZTsKIH07CiAKIC8qCkBAIC04OTEsMTI3ICs4ODMsMTA0IEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbmRfbTNfaWRzKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBtM19xdWlyayBtM19xdWlya19saXN0W10gPSB7Ci0JLyogcGFuYXNvbmljIENGLTI4ICJ0b3VnaGJvb2siICovCi0JewotCQkubmFtZSA9ICJQYW5hc29uaWMgQ0YtMjgiLAotCQkudmVuZG9yID0gMHgxMGY3LAotCQkuZGV2aWNlID0gMHg4MzNlLAotCQkuYW1wX2dwaW8gPSAweDBkLAotCX0sCi0JLyogcGFuYXNvbmljIENGLTcyICJ0b3VnaGJvb2siICovCi0JewotCQkubmFtZSA9ICJQYW5hc29uaWMgQ0YtNzIiLAotCQkudmVuZG9yID0gMHgxMGY3LAotCQkuZGV2aWNlID0gMHg4MzNkLAotCQkuYW1wX2dwaW8gPSAweDBkLAotCX0sCi0JLyogRGVsbCBJbnNwaXJvbiA0MDAwICovCi0JewotCQkubmFtZSA9ICJEZWxsIEluc3Bpcm9uIDQwMDAiLAotCQkudmVuZG9yID0gMHgxMDI4LAotCQkuZGV2aWNlID0gMHgwMGIwLAotCQkuYW1wX2dwaW8gPSAtMSwKLQkJLmlyZGFfd29ya2Fyb3VuZCA9IDEsCi0JfSwKLQkvKiBEZWxsIEluc3Bpcm9uIDgwMDAgKi8KLQl7Ci0JCS5uYW1lID0gIkRlbGwgSW5zcGlyb24gODAwMCIsCi0JCS52ZW5kb3IgPSAweDEwMjgsCi0JCS5kZXZpY2UgPSAweDAwYTQsCi0JCS5hbXBfZ3BpbyA9IC0xLAotCQkuaXJkYV93b3JrYXJvdW5kID0gMSwKLQl9LAotCS8qIERlbGwgSW5zcGlyb24gODEwMCAqLwotCXsKLQkJLm5hbWUgPSAiRGVsbCBJbnNwaXJvbiA4MTAwIiwKLQkJLnZlbmRvciA9IDB4MTAyOCwKLQkJLmRldmljZSA9IDB4MDBlNiwKLQkJLmFtcF9ncGlvID0gLTEsCi0JCS5pcmRhX3dvcmthcm91bmQgPSAxLAotCX0sCi0JLyogTkVDIExNODAwSi83ICovCi0JewotCQkubmFtZSA9ICJORUMgTE04MDBKLzciLAotCQkudmVuZG9yID0gMHgxMDMzLAotCQkuZGV2aWNlID0gMHg4MGYxLAotCQkuYW1wX2dwaW8gPSAweDAzLAotCX0sCi0JLyogTEVHRU5EIFpoYW9ZYW5nIDMxMDBDRiAqLwotCXsKLQkJLm5hbWUgPSAiTEVHRU5EIFpoYW9ZYW5nIDMxMDBDRiIsCi0JCS52ZW5kb3IgPSAweDE1MDksCi0JCS5kZXZpY2UgPSAweDE3NDAsCi0JCS5hbXBfZ3BpbyA9IDB4MDMsCi0JfSwKLQkvKiBFTkQgKi8KLQl7IE5VTEwgfQorc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIG0zX2FtcF9xdWlya19saXN0W10gX19kZXZpbml0ZGF0YSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTBmNywgMHg4MzNlLCAiUGFuYXNvbmljIENGLTI4IiwgMHgwZCksCisJU05EX1BDSV9RVUlSSygweDEwZjcsIDB4ODMzZCwgIlBhbmFzb25pYyBDRi03MiIsIDB4MGQpLAorCVNORF9QQ0lfUVVJUksoMHgxMDMzLCAweDgwZjEsICJORUMgTE04MDBKLzciLCAweDAzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTUwOSwgMHgxNzQwLCAiTEVHRU5EIFpoYW9ZYW5nIDMxMDBDRiIsIDB4MDMpLAorCXsgfSAvKiBFTkQgKi8KIH07CiAKLS8qIFRoZXNlIHZhbHVlcyBjYW1lIGZyb20gdGhlIFdpbmRvd3MgZHJpdmVyLiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBtM19odl9xdWlyayBtM19odl9xdWlya19saXN0W10gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgbTNfaXJkYV9xdWlya19saXN0W10gX19kZXZpbml0ZGF0YSA9IHsKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMGIwLCAiRGVsbCBJbnNwaXJvbiA0MDAwIiwgMSksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDBhNCwgIkRlbGwgSW5zcGlyb24gODAwMCIsIDEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAwZTYsICJEZWxsIEluc3Bpcm9uIDgxMDAiLCAxKSwKKwl7IH0gLyogRU5EICovCit9OworCisvKiBoYXJkd2FyZSB2b2x1bWUgcXVpcmtzICovCitzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgbTNfaHZfcXVpcmtfbGlzdFtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJLyogQWxsZWdybyBjaGlwcyAqLwotCXsgMHgxMjVELCAweDE5ODgsIDB4MEUxMSwgMHgwMDJFLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgwRTExLCAweDAwOTQsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDBFMTEsIDB4QjExMiwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MEUxMSwgMHhCMTE0LCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxMDNDLCAweDAwMTIsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwM0MsIDB4MDAxOCwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTAzQywgMHgwMDFDLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxMDNDLCAweDAwMUQsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwM0MsIDB4MDAxRSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTA3QiwgMHgzMzUwLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxMEY3LCAweDgzMzgsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwRjcsIDB4ODMzQywgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTBGNywgMHg4MzNELCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxMEY3LCAweDgzM0UsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwRjcsIDB4ODMzRiwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTNCRCwgMHgxMDE4LCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxM0JELCAweDEwMTksIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEzQkQsIDB4MTAxQSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTRGRiwgMHgwRjAzLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxNEZGLCAweDBGMDQsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE0RkYsIDB4MEYwNSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTU2RCwgMHhCNDAwLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxNTZELCAweEI3OTUsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE1NkQsIDB4Qjc5NywgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCwgMCB9LAotCXsgMHgxMjVELCAweDE5ODgsIDB4MTU2RCwgMHhDNzAwLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dELCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxMDMzLCAweDgwRjEsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QgfCBSRURVQ0VEX0RFQk9VTkNFLCAwIH0sCi0JeyAweDEyNUQsIDB4MTk4OCwgMHgxMDNDLCAweDAwMUEsIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QgfCBSRURVQ0VEX0RFQk9VTkNFLCAwIH0sIC8qIEhQIE9tbmlCb29rIDYxMDAgKi8KLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwN0IsIDB4MzQwQSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwN0IsIDB4MzQ1MCwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwOUYsIDB4MzEzNCwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwOUYsIDB4MzE2MSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE0NEQsIDB4MzI4MCwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE0NEQsIDB4MzI4MSwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE0NEQsIDB4QzAwMiwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE0NEQsIDB4QzAwMywgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE1MDksIDB4MTc0MCwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE2MTAsIDB4MDAxMCwgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwNDIsIDB4MTA0MiwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDEwN0IsIDB4OTUwMCwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE0RkYsIDB4MEYwNiwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE1NTgsIDB4ODU4NiwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTg4LCAweDE2MUYsIDB4MjAxMSwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKKwlTTkRfUENJX1FVSVJLKDB4MEUxMSwgMHgwMDJFLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MEUxMSwgMHgwMDk0LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MEUxMSwgMHhCMTEyLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MEUxMSwgMHhCMTE0LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzQywgMHgwMDEyLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzQywgMHgwMDE4LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzQywgMHgwMDFDLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzQywgMHgwMDFELCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzQywgMHgwMDFFLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3QiwgMHgzMzUwLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBGNywgMHg4MzM4LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBGNywgMHg4MzNDLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBGNywgMHg4MzNELCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBGNywgMHg4MzNFLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBGNywgMHg4MzNGLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTNCRCwgMHgxMDE4LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTNCRCwgMHgxMDE5LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTNCRCwgMHgxMDFBLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTRGRiwgMHgwRjAzLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTRGRiwgMHgwRjA0LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTRGRiwgMHgwRjA1LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU2RCwgMHhCNDAwLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU2RCwgMHhCNzk1LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU2RCwgMHhCNzk3LCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTU2RCwgMHhDNzAwLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzMywgMHg4MEYxLCBOVUxMLAorCQkgICAgICBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwM0MsIDB4MDAxQSwgTlVMTCwgLyogSFAgT21uaUJvb2sgNjEwMCAqLworCQkgICAgICBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwN0IsIDB4MzQwQSwgTlVMTCwKKwkJICAgICAgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdCLCAweDM0NTAsIE5VTEwsCisJCSAgICAgIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA5RiwgMHgzMTM0LCBOVUxMLAorCQkgICAgICBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDEwOUYsIDB4MzE2MSwgTlVMTCwKKwkJICAgICAgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxNDRELCAweDMyODAsIE5VTEwsCisJCSAgICAgIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ0RCwgMHgzMjgxLCBOVUxMLAorCQkgICAgICBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDE0NEQsIDB4QzAwMiwgTlVMTCwKKwkJICAgICAgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxNDRELCAweEMwMDMsIE5VTEwsCisJCSAgICAgIEhWX0NUUkxfRU5BQkxFIHwgSFZfQlVUVE9OX0ZST01fR0QgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTUwOSwgMHgxNzQwLCBOVUxMLAorCQkgICAgICBIVl9DVFJMX0VOQUJMRSB8IEhWX0JVVFRPTl9GUk9NX0dEIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDE2MTAsIDB4MDAxMCwgTlVMTCwKKwkJICAgICAgSFZfQ1RSTF9FTkFCTEUgfCBIVl9CVVRUT05fRlJPTV9HRCB8IFJFRFVDRURfREVCT1VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQyLCAweDEwNDIsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3QiwgMHg5NTAwLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE0RkYsIDB4MEYwNiwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNTU4LCAweDg1ODYsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTYxRiwgMHgyMDExLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCiAJLyogTWFlc3RybzMgY2hpcHMgKi8KLQl7IDB4MTI1RCwgMHgxOTk4LCAweDEwM0MsIDB4MDAwRSwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTk4LCAweDEwM0MsIDB4MDAxMCwgSFZfQ1RSTF9FTkFCTEUsIDEgfSwgLyogSFAgT21uaUJvb2sgNjAwMCAqLwotCXsgMHgxMjVELCAweDE5OTgsIDB4MTAzQywgMHgwMDExLCBIVl9DVFJMX0VOQUJMRSwgMSB9LCAvKiBIUCBPbW5pQm9vayA1MDAgKi8KLQl7IDB4MTI1RCwgMHgxOTk4LCAweDEwM0MsIDB4MDAxQiwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTk4LCAweDEwNEQsIDB4ODBBNiwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTk4LCAweDEwNEQsIDB4ODBBQSwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTk4LCAweDEwN0IsIDB4NTMwMCwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTk4LCAweDExMEEsIDB4MTk5OCwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTk4LCAweDEzQkQsIDB4MTAxNSwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTk4LCAweDEzQkQsIDB4MTAxQywgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTk4LCAweDEzQkQsIDB4MTgwMiwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTk4LCAweDE1OTksIDB4MDcxNSwgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTk4LCAweDU2NDMsIDB4NTY0MywgSFZfQ1RSTF9FTkFCTEUsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTlBLCAweDE0NEQsIDB4MzI2MCwgSFZfQ1RSTF9FTkFCTEUgfCBSRURVQ0VEX0RFQk9VTkNFLCAwIH0sCi0JeyAweDEyNUQsIDB4MTk5QSwgMHgxNDRELCAweDMyNjEsIEhWX0NUUkxfRU5BQkxFIHwgUkVEVUNFRF9ERUJPVU5DRSwgMCB9LAotCXsgMHgxMjVELCAweDE5OUEsIDB4MTQ0RCwgMHhDMDAwLCBIVl9DVFJMX0VOQUJMRSB8IFJFRFVDRURfREVCT1VOQ0UsIDAgfSwKLQl7IDB4MTI1RCwgMHgxOTlBLCAweDE0NEQsIDB4QzAwMSwgSFZfQ1RSTF9FTkFCTEUgfCBSRURVQ0VEX0RFQk9VTkNFLCAwIH0sCi0JeyAwIH0KKwlTTkRfUENJX1FVSVJLKDB4MTAzQywgMHgwMDBFLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDEwM0MsIDB4MDAxMCwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNDLCAweDAwMTEsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzQywgMHgwMDFCLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDEwNEQsIDB4ODBBNiwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDRELCAweDgwQUEsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3QiwgMHg1MzAwLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDExMEEsIDB4MTk5OCwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxM0JELCAweDEwMTUsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTNCRCwgMHgxMDFDLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDEzQkQsIDB4MTgwMiwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNTk5LCAweDA3MTUsIE5VTEwsIEhWX0NUUkxfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4NTY0MywgMHg1NjQzLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE0NEQsIDB4MzI2MCwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ0RCwgMHgzMjYxLCBOVUxMLCBIVl9DVFJMX0VOQUJMRSB8IFJFRFVDRURfREVCT1VOQ0UpLAorCVNORF9QQ0lfUVVJUksoMHgxNDRELCAweEMwMDAsIE5VTEwsIEhWX0NUUkxfRU5BQkxFIHwgUkVEVUNFRF9ERUJPVU5DRSksCisJU05EX1BDSV9RVUlSSygweDE0NEQsIDB4QzAwMSwgTlVMTCwgSFZfQ1RSTF9FTkFCTEUgfCBSRURVQ0VEX0RFQk9VTkNFKSwKKwl7IH0gLyogRU5EICovCit9OworCisvKiBIUCBPbW5pYm9vayBxdWlya3MgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBtM19vbW5pYm9va19xdWlya19saXN0W10gX19kZXZpbml0ZGF0YSA9IHsKKwlTTkRfUENJX1FVSVJLX0lEKDB4MTAzYywgMHgwMDEwKSwgLyogSFAgT21uaUJvb2sgNjAwMCAqLworCVNORF9QQ0lfUVVJUktfSUQoMHgxMDNjLCAweDAwMTEpLCAvKiBIUCBPbW5pQm9vayA1MDAgKi8KKwl7IH0gLyogRU5EICovCiB9OwogCiAvKgpAQCAtMjA1MCw3ICsyMDE5LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKIAkJZGlyID0gaW53KGlvICsgR1BJT19ESVJFQ1RJT04pOwotCQlpZiAoISBjaGlwLT5xdWlyayB8fCAhIGNoaXAtPnF1aXJrLT5pcmRhX3dvcmthcm91bmQpCisJCWlmICghY2hpcC0+aXJkYV93b3JrYXJvdW5kKQogCQkJZGlyIHw9IDB4MTA7IC8qIGFzc3VtaW5nIHBjaSBidXMgbWFzdGVyPyAqLwogCiAJCXNuZF9tM19yZW1vdGVfY29kZWNfY29uZmlnKGlvLCAwKTsKQEAgLTIxMzIsNiArMjEwMSwxMCBAQAogfQogCiAKKyNkZWZpbmUgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCiAvKgogICogRFNQIENvZGUgaW1hZ2VzCiAgKi8KQEAgLTIyNjAsNiArMjIzMywzMCBAQAogICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSBhc3NwX2tlcm5lbCA9IHsKKwkuZGF0YSA9ICh1OCAqKWFzc3Bfa2VybmVsX2ltYWdlLAorCS5zaXplID0gc2l6ZW9mIGFzc3Bfa2VybmVsX2ltYWdlCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSBhc3NwX21pbmlzcmMgPSB7CisJLmRhdGEgPSAodTggKilhc3NwX21pbmlzcmNfaW1hZ2UsCisJLnNpemUgPSBzaXplb2YgYXNzcF9taW5pc3JjX2ltYWdlCit9OworCisjZW5kaWYgLyogRklSTVdBUkVfSU5fVEhFX0tFUk5FTCAqLworCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX20zX2NvbnZlcnRfZnJvbV9sZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KSB7IH0KKyNlbHNlCitzdGF0aWMgdm9pZCBzbmRfbTNfY29udmVydF9mcm9tX2xlKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCit7CisJaW50IGk7CisJdTE2ICpkYXRhID0gKHUxNiAqKWZ3LT5kYXRhOworCisJZm9yIChpID0gMDsgaSA8IGZ3LT5zaXplIC8gMjsgKytpKQorCQlsZTE2X3RvX2NwdXMoJmRhdGFbaV0pOworfQorI2VuZGlmCisKIAogLyoKICAqIGluaXRpYWxpemUgQVNTUApAQCAtMjI3NCw2ICsyMjcxLDcgQEAKIHN0YXRpYyB2b2lkIHNuZF9tM19hc3NwX2luaXQoc3RydWN0IHNuZF9tMyAqY2hpcCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKKwl1MTYgKmRhdGE7CiAKIAkvKiB6ZXJvIGtlcm5lbCBkYXRhICovCiAJZm9yIChpID0gMDsgaSA8IChSRVZfQl9EQVRBX01FTU9SWV9VTklUX0xFTkdUSCAqIE5VTV9VTklUU19LRVJORUxfREFUQSkgLyAyOyBpKyspCkBAIC0yMjkxLDEwICsyMjg5LDEwIEBACiAJCQkgIEtEQVRBX0RNQV9YRkVSMCk7CiAKIAkvKiB3cml0ZSBrZXJuZWwgaW50byBjb2RlIG1lbW9yeS4uICovCi0JZm9yIChpID0gMCA7IGkgPCBBUlJBWV9TSVpFKGFzc3Bfa2VybmVsX2ltYWdlKTsgaSsrKSB7CisJZGF0YSA9ICh1MTYgKiljaGlwLT5hc3NwX2tlcm5lbF9pbWFnZS0+ZGF0YTsKKwlmb3IgKGkgPSAwIDsgaSAqIDIgPCBjaGlwLT5hc3NwX2tlcm5lbF9pbWFnZS0+c2l6ZTsgaSsrKSB7CiAJCXNuZF9tM19hc3NwX3dyaXRlKGNoaXAsIE1FTVRZUEVfSU5URVJOQUxfQ09ERSwgCi0JCQkJICBSRVZfQl9DT0RFX01FTU9SWV9CRUdJTiArIGksIAotCQkJCSAgYXNzcF9rZXJuZWxfaW1hZ2VbaV0pOworCQkJCSAgUkVWX0JfQ09ERV9NRU1PUllfQkVHSU4gKyBpLCBkYXRhW2ldKTsKIAl9CiAKIAkvKgpAQCAtMjMwMywxMCArMjMwMSwxMCBAQAogCSAqIGRyb3AgaXQgdGhlcmUuICBJdCBzZWVtcyB0aGF0IHRoZSBtaW5pc3JjIGRvZXNuJ3QKIAkgKiBuZWVkIHZlY3RvcnMsIHNvIHdlIHdvbid0IGJvdGhlciB3aXRoIHRoZW0uLgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFzc3BfbWluaXNyY19pbWFnZSk7IGkrKykgeworCWRhdGEgPSAodTE2ICopY2hpcC0+YXNzcF9taW5pc3JjX2ltYWdlLT5kYXRhOworCWZvciAoaSA9IDA7IGkgKiAyIDwgY2hpcC0+YXNzcF9taW5pc3JjX2ltYWdlLT5zaXplOyBpKyspIHsKIAkJc25kX20zX2Fzc3Bfd3JpdGUoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9DT0RFLCAKLQkJCQkgIDB4NDAwICsgaSwgCi0JCQkJICBhc3NwX21pbmlzcmNfaW1hZ2VbaV0pOworCQkJCSAgMHg0MDAgKyBpLCBkYXRhW2ldKTsKIAl9CiAKIAkvKgpAQCAtMjQ0NCw3ICsyNDQyLDcgQEAKIAkgICAgICAgRElTQUJMRV9MRUdBQ1kpOwogCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIFBDSV9MRUdBQ1lfQVVESU9fQ1RSTCwgdyk7CiAKLQlpZiAoY2hpcC0+aHZfcXVpcmsgJiYgY2hpcC0+aHZfcXVpcmstPmlzX29tbmlib29rKSB7CisJaWYgKGNoaXAtPmlzX29tbmlib29rKSB7CiAJCS8qCiAJCSAqIFZvbHVtZSBidXR0b25zIG9uIHNvbWUgSFAgT21uaUJvb2sgbGFwdG9wcyBkb24ndCB3b3JrCiAJCSAqIGNvcnJlY3RseS4gVGhpcyBtYWtlcyB0aGVtIHdvcmsgZm9yIHRoZSBtb3N0IHBhcnQuCkBAIC0yNDYxLDggKzI0NTksNyBAQAogCX0KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQUxMRUdST19DT05GSUcsICZuKTsKIAluICY9IH4oSFZfQ1RSTF9FTkFCTEUgfCBSRURVQ0VEX0RFQk9VTkNFIHwgSFZfQlVUVE9OX0ZST01fR0QpOwotCWlmIChjaGlwLT5odl9xdWlyaykKLQkJbiB8PSBjaGlwLT5odl9xdWlyay0+Y29uZmlnOworCW4gfD0gY2hpcC0+aHZfY29uZmlnOwogCS8qIEZvciBzb21lIHJlYXNvbiB3ZSBtdXN0IGFsd2F5cyB1c2UgcmVkdWNlZCBkZWJvdW5jZS4gKi8KIAluIHw9IFJFRFVDRURfREVCT1VOQ0U7CiAJbiB8PSBQTV9DVFJMX0VOQUJMRSB8IENMS19ESVZfQllfNDkgfCBVU0VfUENJX1RJTUlORzsKQEAgLTI1MTAsNyArMjUwNyw3IEBACiAKIAkvKiBUT0RPOiBNUFU0MDEgbm90IHN1cHBvcnRlZCB5ZXQgKi8KIAl2YWwgPSBBU1NQX0lOVF9FTkFCTEUgLyp8IE1QVTQwMV9JTlRfRU5BQkxFKi87Ci0JaWYgKGNoaXAtPmh2X3F1aXJrICYmIChjaGlwLT5odl9xdWlyay0+Y29uZmlnICYgSFZfQ1RSTF9FTkFCTEUpKQorCWlmIChjaGlwLT5odl9jb25maWcgJiBIVl9DVFJMX0VOQUJMRSkKIAkJdmFsIHw9IEhWX0lOVF9FTkFCTEU7CiAJb3V0dyh2YWwsIGlvICsgSE9TVF9JTlRfQ1RSTCk7CiAJb3V0YihpbmIoaW8gKyBBU1NQX0NPTlRST0xfQykgfCBBU1NQX0hPU1RfSU5UX0VOQUJMRSwKQEAgLTI1NTMsNiArMjU1MCwxNSBAQAogCWlmIChjaGlwLT5pb2Jhc2UpCiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKIAorI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKwlpZiAoY2hpcC0+YXNzcF9rZXJuZWxfaW1hZ2UgIT0gJmFzc3Bfa2VybmVsKQorI2VuZGlmCisJCXJlbGVhc2VfZmlybXdhcmUoY2hpcC0+YXNzcF9rZXJuZWxfaW1hZ2UpOworI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKwlpZiAoY2hpcC0+YXNzcF9taW5pc3JjX2ltYWdlICE9ICZhc3NwX21pbmlzcmMpCisjZW5kaWYKKwkJcmVsZWFzZV9maXJtd2FyZShjaGlwLT5hc3NwX21pbmlzcmNfaW1hZ2UpOworCiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CiAJa2ZyZWUoY2hpcCk7CiAJcmV0dXJuIDA7CkBAIC0yNjY1LDggKzI2NzEsNyBAQAogewogCXN0cnVjdCBzbmRfbTMgKmNoaXA7CiAJaW50IGksIGVycjsKLQljb25zdCBzdHJ1Y3QgbTNfcXVpcmsgKnF1aXJrOwotCWNvbnN0IHN0cnVjdCBtM19odl9xdWlyayAqaHZfcXVpcms7CisJY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnF1aXJrOwogCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0gewogCQkuZGV2X2ZyZWUgPQlzbmRfbTNfZGV2X2ZyZWUsCiAJfTsKQEAgLTI3MDYsMzQgKzI3MTEsMzIgQEAKIAljaGlwLT5wY2kgPSBwY2k7CiAJY2hpcC0+aXJxID0gLTE7CiAKLQlmb3IgKHF1aXJrID0gbTNfcXVpcmtfbGlzdDsgcXVpcmstPnZlbmRvcjsgcXVpcmsrKykgewotCQlpZiAocGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IHF1aXJrLT52ZW5kb3IgJiYKLQkJICAgIHBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSBxdWlyay0+ZGV2aWNlKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJtYWVzdHJvMzogZW5hYmxlZCBoYWNrIGZvciAnJXMnXG4iLCBxdWlyay0+bmFtZSk7Ci0JCQljaGlwLT5xdWlyayA9IHF1aXJrOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlmb3IgKGh2X3F1aXJrID0gbTNfaHZfcXVpcmtfbGlzdDsgaHZfcXVpcmstPnZlbmRvcjsgaHZfcXVpcmsrKykgewotCQlpZiAocGNpLT52ZW5kb3IgPT0gaHZfcXVpcmstPnZlbmRvciAmJgotCQkgICAgcGNpLT5kZXZpY2UgPT0gaHZfcXVpcmstPmRldmljZSAmJgotCQkgICAgcGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IGh2X3F1aXJrLT5zdWJzeXN0ZW1fdmVuZG9yICYmCi0JCSAgICBwY2ktPnN1YnN5c3RlbV9kZXZpY2UgPT0gaHZfcXVpcmstPnN1YnN5c3RlbV9kZXZpY2UpIHsKLQkJCWNoaXAtPmh2X3F1aXJrID0gaHZfcXVpcms7Ci0JCQlicmVhazsKLQkJfQotCX0KLQogCWNoaXAtPmV4dGVybmFsX2FtcCA9IGVuYWJsZV9hbXA7CiAJaWYgKGFtcF9ncGlvID49IDAgJiYgYW1wX2dwaW8gPD0gMHgwZikKIAkJY2hpcC0+YW1wX2dwaW8gPSBhbXBfZ3BpbzsKLQllbHNlIGlmIChjaGlwLT5xdWlyayAmJiBjaGlwLT5xdWlyay0+YW1wX2dwaW8gPj0gMCkKLQkJY2hpcC0+YW1wX2dwaW8gPSBjaGlwLT5xdWlyay0+YW1wX2dwaW87Ci0JZWxzZSBpZiAoY2hpcC0+YWxsZWdyb19mbGFnKQotCQljaGlwLT5hbXBfZ3BpbyA9IEdQT19FWFRfQU1QX0FMTEVHUk87Ci0JZWxzZSAvKiBwcmVzdW1hYmx5IHRoaXMgaXMgZm9yIGFsbCAnbWFlc3RybzMncy4uICovCi0JCWNoaXAtPmFtcF9ncGlvID0gR1BPX0VYVF9BTVBfTTM7CisJZWxzZSB7CisJCXF1aXJrID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBtM19hbXBfcXVpcmtfbGlzdCk7CisJCWlmIChxdWlyaykgeworCQkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJtYWVzdHJvMzogc2V0IGFtcC1ncGlvICIKKwkJCQkgICAgImZvciAnJXMnXG4iLCBxdWlyay0+bmFtZSk7CisJCQljaGlwLT5hbXBfZ3BpbyA9IHF1aXJrLT52YWx1ZTsKKwkJfSBlbHNlIGlmIChjaGlwLT5hbGxlZ3JvX2ZsYWcpCisJCQljaGlwLT5hbXBfZ3BpbyA9IEdQT19FWFRfQU1QX0FMTEVHUk87CisJCWVsc2UgLyogcHJlc3VtYWJseSB0aGlzIGlzIGZvciBhbGwgJ21hZXN0cm8zJ3MuLiAqLworCQkJY2hpcC0+YW1wX2dwaW8gPSBHUE9fRVhUX0FNUF9NMzsKKwl9CisKKwlxdWlyayA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgbTNfaXJkYV9xdWlya19saXN0KTsKKwlpZiAocXVpcmspIHsKKwkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJtYWVzdHJvMzogZW5hYmxlZCBpcmRhIHdvcmthcm91bmQgIgorCQkJICAgICJmb3IgJyVzJ1xuIiwgcXVpcmstPm5hbWUpOworCQljaGlwLT5pcmRhX3dvcmthcm91bmQgPSAxOworCX0KKwlxdWlyayA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgbTNfaHZfcXVpcmtfbGlzdCk7CisJaWYgKHF1aXJrKQorCQljaGlwLT5odl9jb25maWcgPSBxdWlyay0+dmFsdWU7CisJaWYgKHNuZF9wY2lfcXVpcmtfbG9va3VwKHBjaSwgbTNfb21uaWJvb2tfcXVpcmtfbGlzdCkpCisJCWNoaXAtPmlzX29tbmlib29rID0gMTsKIAogCWNoaXAtPm51bV9zdWJzdHJlYW1zID0gTlJfRFNQUzsKIAljaGlwLT5zdWJzdHJlYW1zID0ga2NhbGxvYyhjaGlwLT5udW1fc3Vic3RyZWFtcywgc2l6ZW9mKHN0cnVjdCBtM19kbWEpLApAQCAtMjc0NCw2ICsyNzQ3LDMwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmNoaXAtPmFzc3Bfa2VybmVsX2ltYWdlLAorCQkJICAgICAgICJlc3MvbWFlc3RybzNfYXNzcF9rZXJuZWwuZnciLCAmcGNpLT5kZXYpOworCWlmIChlcnIgPCAwKSB7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCQljaGlwLT5hc3NwX2tlcm5lbF9pbWFnZSA9ICZhc3NwX2tlcm5lbDsKKyNlbHNlCisJCXNuZF9tM19mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworI2VuZGlmCisJfSBlbHNlCisJCXNuZF9tM19jb252ZXJ0X2Zyb21fbGUoY2hpcC0+YXNzcF9rZXJuZWxfaW1hZ2UpOworCisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmY2hpcC0+YXNzcF9taW5pc3JjX2ltYWdlLAorCQkJICAgICAgICJlc3MvbWFlc3RybzNfYXNzcF9taW5pc3JjLmZ3IiwgJnBjaS0+ZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKwkJY2hpcC0+YXNzcF9taW5pc3JjX2ltYWdlID0gJmFzc3BfbWluaXNyYzsKKyNlbHNlCisJCXNuZF9tM19mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworI2VuZGlmCisJfSBlbHNlCisJCXNuZF9tM19jb252ZXJ0X2Zyb21fbGUoY2hpcC0+YXNzcF9taW5pc3JjX2ltYWdlKTsKKwogCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksIGNhcmQtPmRyaXZlcikpIDwgMCkgewogCQlzbmRfbTNfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X21peGVyLmMgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9taXhlci5jCmluZGV4IDEzZGUwZjcuLmQ3ZDE1YzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X21peGVyLmMKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfbWl4ZXIuYwpAQCAtMzg5LDcgKzM4OSw3IEBACiAJcmV0dXJuIGNoYW5nZWQ7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9hbmFsb2csIC05NjAwLCA1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYW5hbG9nLCAtOTYwMCwgNTAsIDApOwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWl4YXJ0X2NvbnRyb2xfYW5hbG9nX2xldmVsID0gewogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLApAQCAtODcyLDcgKzg3Miw3IEBACiAJcmV0dXJuIGNoYW5nZWQ7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9kaWdpdGFsLCAtMTA5NTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9kaWdpdGFsLCAtMTA5NTAsIDUwLCAwKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9taXhhcnRfcGNtX3ZvbCA9CiB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCmluZGV4IDg3OWUzMWEuLjAzYjNhNDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCisrKyBiL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jCkBAIC0xNjI4LDIzICsxNjI4LDE1IEBACiB9CiAKIAotc3RydWN0IG5tMjU2X3F1aXJrIHsKLQl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7Ci0JdW5zaWduZWQgc2hvcnQgZGV2aWNlOwotCWludCB0eXBlOwotfTsKLQogZW51bSB7IE5NX0JMQUNLTElTVEVELCBOTV9SRVNFVF9XT1JLQVJPVU5ELCBOTV9SRVNFVF9XT1JLQVJPVU5EXzIgfTsKIAotc3RhdGljIHN0cnVjdCBubTI1Nl9xdWlyayBubTI1Nl9xdWlya3NbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIG5tMjU2X3F1aXJrc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJLyogSFAgb21uaWJvb2sgNDE1MCBoYXMgY3M0MjMyIGNvZGVjIGludGVybmFsbHkgKi8KLQl7IC52ZW5kb3IgPSAweDEwM2MsIC5kZXZpY2UgPSAweDAwMDcsIC50eXBlID0gTk1fQkxBQ0tMSVNURUQgfSwKLQkvKiBTb255IFBDRy1GMzA1ICovCi0JeyAudmVuZG9yID0gMHgxMDRkLCAuZGV2aWNlID0gMHg4MDQxLCAudHlwZSA9IE5NX1JFU0VUX1dPUktBUk9VTkQgfSwKLQkvKiBEZWxsIExhdGl0dWRlIExTICovCi0JeyAudmVuZG9yID0gMHgxMDI4LCAuZGV2aWNlID0gMHgwMDgwLCAudHlwZSA9IE5NX1JFU0VUX1dPUktBUk9VTkQgfSwKLQkvKiBEZWxsIExhdGl0dWRlIENTeCAqLwotCXsgLnZlbmRvciA9IDB4MTAyOCwgLmRldmljZSA9IDB4MDA5MSwgLnR5cGUgPSBOTV9SRVNFVF9XT1JLQVJPVU5EXzIgfSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgwMDA3LCAiSFAgb21uaWJvb2sgNDE1MCIsIE5NX0JMQUNLTElTVEVEKSwKKwkvKiBSZXNldCB3b3JrYXJvdW5kcyB0byBhdm9pZCBsb2NrLXVwcyAqLworCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgwNDEsICJTb255IFBDRy1GMzA1IiwgTk1fUkVTRVRfV09SS0FST1VORCksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDA4MCwgIkRlbGwgTGF0aXR1ZGUgTFMiLCBOTV9SRVNFVF9XT1JLQVJPVU5EKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMDkxLCAiRGVsbCBMYXRpdHVkZSBDU3giLCBOTV9SRVNFVF9XT1JLQVJPVU5EXzIpLAogCXsgfSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCkBAIC0xNjU1LDI2ICsxNjQ3LDIyIEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBubTI1NiAqY2hpcDsKIAlpbnQgZXJyOwotCXN0cnVjdCBubTI1Nl9xdWlyayAqcTsKLQl1MTYgc3Vic3lzdGVtX3ZlbmRvciwgc3Vic3lzdGVtX2RldmljZTsKKwljb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqcTsKIAotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZzdWJzeXN0ZW1fdmVuZG9yKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIFBDSV9TVUJTWVNURU1fSUQsICZzdWJzeXN0ZW1fZGV2aWNlKTsKLQotCWZvciAocSA9IG5tMjU2X3F1aXJrczsgcS0+dmVuZG9yOyBxKyspIHsKLQkJaWYgKHEtPnZlbmRvciA9PSBzdWJzeXN0ZW1fdmVuZG9yICYmIHEtPmRldmljZSA9PSBzdWJzeXN0ZW1fZGV2aWNlKSB7Ci0JCQlzd2l0Y2ggKHEtPnR5cGUpIHsKLQkJCWNhc2UgTk1fQkxBQ0tMSVNURUQ6Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAibm0yNTY6IFRoZSBkZXZpY2UgaXMgYmxhY2tsaXN0ZWQuICIKLQkJCQkgICAgICAgIkxvYWRpbmcgc3RvcHBlZFxuIik7Ci0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQljYXNlIE5NX1JFU0VUX1dPUktBUk9VTkRfMjoKLQkJCQlyZXNldF93b3JrYXJvdW5kXzIgPSAxOwotCQkJCS8qIEZhbGwtdGhyb3VnaCAqLwotCQkJY2FzZSBOTV9SRVNFVF9XT1JLQVJPVU5EOgotCQkJCXJlc2V0X3dvcmthcm91bmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQorCXEgPSBzbmRfcGNpX3F1aXJrX2xvb2t1cChwY2ksIG5tMjU2X3F1aXJrcyk7CisJaWYgKHEpIHsKKwkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJubTI1NjogRW5hYmxlZCBxdWlyayBmb3IgJXMuXG4iLCBxLT5uYW1lKTsKKwkJc3dpdGNoIChxLT52YWx1ZSkgeworCQljYXNlIE5NX0JMQUNLTElTVEVEOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAibm0yNTY6IFRoZSBkZXZpY2UgaXMgYmxhY2tsaXN0ZWQuICIKKwkJCSAgICAgICAiTG9hZGluZyBzdG9wcGVkXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQljYXNlIE5NX1JFU0VUX1dPUktBUk9VTkRfMjoKKwkJCXJlc2V0X3dvcmthcm91bmRfMiA9IDE7CisJCQkvKiBGYWxsLXRocm91Z2ggKi8KKwkJY2FzZSBOTV9SRVNFVF9XT1JLQVJPVU5EOgorCQkJcmVzZXRfd29ya2Fyb3VuZCA9IDE7CisJCQlicmVhazsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX21peGVyLmMgYi9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfbWl4ZXIuYwppbmRleCBiMTMzYWQ5Li5kOWNjOGQyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfbWl4ZXIuYworKysgYi9zb3VuZC9wY2kvcGN4aHIvcGN4aHJfbWl4ZXIuYwpAQCAtNDQsOCArNDQsOCBAQAogI2RlZmluZSBQQ1hIUl9BTkFMT0dfUExBWUJBQ0tfTEVWRUxfTUFYICAxMjgJLyogICAgMC4wIGRCICovCiAjZGVmaW5lIFBDWEhSX0FOQUxPR19QTEFZQkFDS19aRVJPX0xFVkVMIDEwNAkvKiAgLTI0LjAgZEIgKCAwLjAgZEIgLSBmaXggbGV2ZWwgKzI0LjAgZEIgKSAqLwogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYW5hbG9nX2NhcHR1cmUsIC05NjAwLCA1MCwgMCk7Ci1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYW5hbG9nX3BsYXliYWNrLCAtMTI4MDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYW5hbG9nX2NhcHR1cmUsIC05NjAwLCA1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYW5hbG9nX3BsYXliYWNrLCAtMTI4MDAsIDEwMCwgMCk7CiAKIHN0YXRpYyBpbnQgcGN4aHJfdXBkYXRlX2FuYWxvZ19hdWRpb19sZXZlbChzdHJ1Y3Qgc25kX3BjeGhyICpjaGlwLCBpbnQgaXNfY2FwdHVyZSwgaW50IGNoYW5uZWwpCiB7CkBAIC0xOTUsNyArMTk1LDcgQEAKICNkZWZpbmUgUENYSFJfRElHSVRBTF9MRVZFTF9NQVgJCTB4MWZmCS8qICsxOCBkQiAqLwogI2RlZmluZSBQQ1hIUl9ESUdJVEFMX1pFUk9fTEVWRUwJMHgxYjcJLyogIDAgZEIgKi8KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RpZ2l0YWwsIC0xMDk1MCwgNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RpZ2l0YWwsIC0xMDk1MCwgNTAsIDApOwogCiAjZGVmaW5lIE1PUkVfVEhBTl9PTkVfU1RSRUFNX0xFVkVMCTB4MDAwMDAxCiAjZGVmaW5lIFZBTElEX1NUUkVBTV9QQU5fTEVWRUxfTUFTSwkweDgwMDAwMApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCmluZGV4IDYzODM5ODcuLjg5YjNjN2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKQEAgLTgwLDYgKzgwLDcgQEAKIC8qIFdyaXRlIHJlZ2lzdGVycy4gVGhlc2UgYXJlIGRlZmluZWQgYXMgYnl0ZS1vZmZzZXRzIGZyb20gdGhlIGlvYmFzZSB2YWx1ZS4KICAqLwogI2RlZmluZSBIRFNQX3Jlc2V0UG9pbnRlciAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSERTUF9mcmVxUmVnCQkJMAogI2RlZmluZSBIRFNQX291dHB1dEJ1ZmZlckFkZHJlc3MJMzIKICNkZWZpbmUgSERTUF9pbnB1dEJ1ZmZlckFkZHJlc3MJCTM2CiAjZGVmaW5lIEhEU1BfY29udHJvbFJlZ2lzdGVyCQk2NApAQCAtNDY5LDYgKzQ3MCw3IEBACiAJc3RydWN0IHBjaV9kZXYgICAgICAgKnBjaTsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICpzcGRpZl9jdGw7CiAgICAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICBtaXhlcl9tYXRyaXhbSERTUF9NQVRSSVhfTUlYRVJfU0laRV07CisJdW5zaWduZWQgaW50ICAgICAgICAgIGRkc192YWx1ZTsgLyogbGFzdCB2YWx1ZSB3cml0dGVuIHRvIGZyZXEgcmVnaXN0ZXIgKi8KIH07CiAKIC8qIFRoZXNlIHRhYmxlcyBtYXAgdGhlIEFMU0EgY2hhbm5lbHMgMS4uTiB0byB0aGUgY2hhbm5lbHMgdGhhdCB3ZQpAQCAtNTk4LDYgKzYwMCw3IEBACiAJCXJldHVybiAoNjQgKiBvdXQpICsgKDMyICsgKGluKSk7CiAJY2FzZSAweDk2OgogCWNhc2UgMHg5NzoKKwljYXNlIDB4OTg6CiAJCXJldHVybiAoMzIgKiBvdXQpICsgKDE2ICsgKGluKSk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuICg1MiAqIG91dCkgKyAoMjYgKyAoaW4pKTsKQEAgLTYxMSw2ICs2MTQsNyBAQAogCQlyZXR1cm4gKDY0ICogb3V0KSArIGluOwogCWNhc2UgMHg5NjoKIAljYXNlIDB4OTc6CisJY2FzZSAweDk4OgogCQlyZXR1cm4gKDMyICogb3V0KSArIGluOwogCWRlZmF1bHQ6CiAJCXJldHVybiAoNTIgKiBvdXQpICsgaW47CkBAIC05MzgsNiArOTQyLDExIEBACiBzdGF0aWMgdm9pZCBoZHNwX3Jlc2V0X2h3X3BvaW50ZXIoc3RydWN0IGhkc3AgKmhkc3ApCiB7CiAJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9yZXNldFBvaW50ZXIsIDApOworCWlmIChoZHNwLT5pb190eXBlID09IEg5NjMyICYmIGhkc3AtPmZpcm13YXJlX3JldiA+PSAxNTIpCisJCS8qIEhEU1BfcmVzZXRQb2ludGVyID0gSERTUF9mcmVxUmVnLCB3aGljaCBpcyBzdHJhbmdlIGFuZAorCQkgKiByZXF1aXJlcyAoPykgdG8gd3JpdGUgYWdhaW4gRERTIHZhbHVlIGFmdGVyIGEgcmVzZXQgcG9pbnRlcgorCQkgKiAoYXQgbGVhc3QsIGl0IHdvcmtzIGxpa2UgdGhpcykgKi8KKwkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9mcmVxUmVnLCBoZHNwLT5kZHNfdmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZCBoZHNwX3N0YXJ0X2F1ZGlvKHN0cnVjdCBoZHNwICpzKQpAQCAtOTgyLDYgKzk5MSwzMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBoZHNwX3NldF9kZHNfdmFsdWUoc3RydWN0IGhkc3AgKmhkc3AsIGludCByYXRlKQoreworCXU2NCBuOworCXUzMiByOworCQorCWlmIChyYXRlID49IDExMjAwMCkKKwkJcmF0ZSAvPSA0OworCWVsc2UgaWYgKHJhdGUgPj0gNTYwMDApCisJCXJhdGUgLz0gMjsKKworCS8qIFJNRSBzYXlzIG4gPSAxMDQ4NTc2MDAwMDAwMDAsIGJ1dCBpbiB0aGUgd2luZG93cyBNQURJIGRyaXZlciwgSSBzZWU6CisvLwlyZXR1cm4gMTA0ODU3NjAwMDAwMDAwIC8gcmF0ZTsgLy8gMTAwIE1IegorCXJldHVybiAxMTAxMDA0ODAwMDAwMDAgLyByYXRlOyAvLyAxMDUgTUh6CisgICAgICAgICovCSAgIAorCW4gPSAxMDQ4NTc2MDAwMDAwMDBVTEw7ICAvKiAgPSAgMl4yMCAqIDEwXjggKi8KKwlkaXY2NF8zMigmbiwgcmF0ZSwgJnIpOworCS8qIG4gc2hvdWxkIGJlIGxlc3MgdGhhbiAyXjMyIGZvciBiZWluZyB3cml0dGVuIHRvIEZSRVEgcmVnaXN0ZXIgKi8KKwlzbmRfYXNzZXJ0KChuID4+IDMyKSA9PSAwKTsKKwkvKiBIRFNQX2ZyZXFSZWcgYW5kIEhEU1BfcmVzZXRQb2ludGVyIGFyZSB0aGUgc2FtZSwgc28ga2VlcCB0aGUgRERTCisJICAgdmFsdWUgdG8gd3JpdGUgaXQgYWZ0ZXIgYSByZXNldCAqLworCWhkc3AtPmRkc192YWx1ZSA9IG47CisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2ZyZXFSZWcsIGhkc3AtPmRkc192YWx1ZSk7Cit9CisKIHN0YXRpYyBpbnQgaGRzcF9zZXRfcmF0ZShzdHJ1Y3QgaGRzcCAqaGRzcCwgaW50IHJhdGUsIGludCBjYWxsZWRfaW50ZXJuYWxseSkKIHsKIAlpbnQgcmVqZWN0X2lmX29wZW4gPSAwOwpAQCAtMTA5MCw2ICsxMTIzLDEwIEBACiAJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSByYXRlX2JpdHM7CiAJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CiAKKwkvKiBGb3IgSERTUDk2MzIgcmV2IDE1MiwgbmVlZCB0byBzZXQgRERTIHZhbHVlIGluIEZSRVEgcmVnaXN0ZXIgKi8KKwlpZiAoaGRzcC0+aW9fdHlwZSA9PSBIOTYzMiAmJiBoZHNwLT5maXJtd2FyZV9yZXYgPj0gMTUyKQorCQloZHNwX3NldF9kZHNfdmFsdWUoaGRzcCwgcmF0ZSk7CisKIAlpZiAocmF0ZSA+PSAxMjgwMDApIHsKIAkJaGRzcC0+Y2hhbm5lbF9tYXAgPSBjaGFubmVsX21hcF9IOTYzMl9xczsKIAl9IGVsc2UgaWYgKHJhdGUgPiA0ODAwMCkgewpAQCAtNDk0Myw2ICs0OTgwLDcgQEAKIAloZHNwLT5pcnEgPSBwY2ktPmlycTsKIAloZHNwLT5wcmVjaXNlX3B0ciA9IDA7CiAJaGRzcC0+dXNlX21pZGlfdGFza2xldCA9IDE7CisJaGRzcC0+ZGRzX3ZhbHVlID0gMDsKIAogCWlmICgoZXJyID0gc25kX2hkc3BfaW5pdGlhbGl6ZV9tZW1vcnkoaGRzcCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCmluZGV4IDA1NDdmNmYuLmUwMjE1YWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwpAQCAtNiw2ICs2LDggQEAKICAqICAgICAgY29kZSBiYXNlZCBvbiBoZHNwLmMgICBQYXVsIERhdmlzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyY3VzIEFuZGVyc3NvbgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRob21hcyBDaGFyYm9ubmVsCisgKiAgICAgIE1vZGlmaWVkIDIwMDYtMDYtMDEgZm9yIEFFUzMyIHN1cHBvcnQgYnkgUmVteSBCcnVubworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZW15LmJydW5vQHRyaW5ub3YuY29tPgogICoKICAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTc3LDcgKzc5LDggQEAKIAogTU9EVUxFX0FVVEhPUgogICAgICAgKCJXaW5mcmllZCBSaXRzY2ggPHJpdHNjaF9BVF9pZW0uYXQ+LCBQYXVsIERhdmlzIDxwYXVsQGxpbnV4YXVkaW9zeXN0ZW1zLmNvbT4sICIKLSAgICAgICAiTWFyY3VzIEFuZGVyc3NvbiwgVGhvbWFzIENoYXJib25uZWwgPHRob21hc0B1bmRhdGEub3JnPiIpOworICAgICAgICJNYXJjdXMgQW5kZXJzc29uLCBUaG9tYXMgQ2hhcmJvbm5lbCA8dGhvbWFzQHVuZGF0YS5vcmc+LCAiCisgICAgICAgIlJlbXkgQnJ1bm8gPHJlbXkuYnJ1bm9AdHJpbm5vdi5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlJNRSBIRFNQTSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7Uk1FIEhEU1BNLU1BREl9fSIpOwpAQCAtMTA3LDcgKzExMCwxMiBAQAogLyogLS0tIFJlYWQgcmVnaXN0ZXJzLiAtLS0KICAgIFRoZXNlIGFyZSBkZWZpbmVkIGFzIGJ5dGUtb2Zmc2V0cyBmcm9tIHRoZSBpb2Jhc2UgdmFsdWUgKi8KICNkZWZpbmUgSERTUE1fc3RhdHVzUmVnaXN0ZXIgICAgMAotI2RlZmluZSBIRFNQTV9zdGF0dXNSZWdpc3RlcjIgIDk2CisvKiNkZWZpbmUgSERTUE1fc3RhdHVzUmVnaXN0ZXIyICA5NiAqLworLyogYWZ0ZXIgUk1FIFdpbmRvd3MgZHJpdmVyIHNvdXJjZXMsIHN0YXR1czIgaXMgNC1ieXRlIHdvcmQgIyA0OCA9IHdvcmQgYXQKKyAqIG9mZnNldCAxOTIsIGZvciBBRVMzMiAqYW5kKiBNQURJCisgKiA9PiBuZWVkIHRvIGNoZWNrIHRoYXQgb2Zmc2V0IDE5MiBpcyB3b3JraW5nIG9uIE1BREkgKi8KKyNkZWZpbmUgSERTUE1fc3RhdHVzUmVnaXN0ZXIyICAxOTIKKyNkZWZpbmUgSERTUE1fdGltZWNvZGVSZWdpc3RlciAxMjgKIAogI2RlZmluZSBIRFNQTV9taWRpRGF0YUluMCAgICAgMzYwCiAjZGVmaW5lIEhEU1BNX21pZGlEYXRhSW4xICAgICAzNjQKQEAgLTE0MCwzNyArMTQ4LDUwIEBACiAjZGVmaW5lIEhEU1BNX0ZyZXF1ZW5jeTAgICgxPDw2KSAgLyogMD00NC4xa0h6Lzg4LjJrSHogMT00OGtIei85NmtIeiAqLwogI2RlZmluZSBIRFNQTV9GcmVxdWVuY3kxICAoMTw8NykgIC8qIDA9MzJrSHovNjRrSHogKi8KICNkZWZpbmUgSERTUE1fRG91YmxlU3BlZWQgKDE8PDgpICAvKiAwPW5vcm1hbCBzcGVlZCwgMT1kb3VibGUgc3BlZWQgKi8KLSNkZWZpbmUgSERTUE1fUXVhZFNwZWVkICAgKDE8PDMxKSAvKiBxdWFkIHNwZWVkIGJpdCwgbm90IGltcGxlbWVudGVkIG5vdyAqLworI2RlZmluZSBIRFNQTV9RdWFkU3BlZWQgICAoMTw8MzEpIC8qIHF1YWQgc3BlZWQgYml0ICovCiAKKyNkZWZpbmUgSERTUE1fUHJvZmVzc2lvbmFsICgxPDw5KSAvKiBQcm9mZXNzaW9uYWwgKi8gLyogQUVTMzIgT05MWSAqLwogI2RlZmluZSBIRFNQTV9UWF82NGNoICAgICAoMTw8MTApIC8qIE91dHB1dCA2NGNoYW5uZWwgTU9ERT0xLAotCQkJCSAgICAgNTZjaGFubmVsTU9ERT0wICovCisJCQkJICAgICA1NmNoYW5uZWxNT0RFPTAgKi8gLyogTUFESSBPTkxZKi8KKyNkZWZpbmUgSERTUE1fRW1waGFzaXMgICAgKDE8PDEwKSAvKiBFbXBoYXNpcyAqLyAvKiBBRVMzMiBPTkxZICovCiAKICNkZWZpbmUgSERTUE1fQXV0b0lucCAgICAgKDE8PDExKSAvKiBBdXRvIElucHV0ICh0YWtlb3ZlcikgPT0gU2FmZSBNb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW9mZiwgMT1vbiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW9mZiwgMT1vbiAgKi8gLyogTUFESSBPTkxZICovCisjZGVmaW5lIEhEU1BNX0RvbGJ5ICAgICAgICgxPDwxMSkgLyogRG9sYnkgPSAiTm9uQXVkaW8iID8/ICovIC8qIEFFUzMyIE9OTFkgKi8KIAotI2RlZmluZSBIRFNQTV9JbnB1dFNlbGVjdDAgKDE8PDE0KSAvKiBJbnB1dCBzZWxlY3QgMD0gb3B0aWNhbCwgMT1jb2F4ICovCisjZGVmaW5lIEhEU1BNX0lucHV0U2VsZWN0MCAoMTw8MTQpIC8qIElucHV0IHNlbGVjdCAwPSBvcHRpY2FsLCAxPWNvYXggKi8gLyogTUFESSBPTkxZKi8KICNkZWZpbmUgSERTUE1fSW5wdXRTZWxlY3QxICgxPDwxNSkgLyogc2hvdWxkIGJlIDAgKi8KIAogI2RlZmluZSBIRFNQTV9TeW5jUmVmMCAgICAgKDE8PDE2KSAvKiAwPVdPcmQsIDE9TUFESSAqLwotI2RlZmluZSBIRFNQTV9TeW5jUmVmMSAgICAgKDE8PDE3KSAvKiBzaG91bGQgYmUgMCAqLworI2RlZmluZSBIRFNQTV9TeW5jUmVmMSAgICAgKDE8PDE3KSAvKiBmb3IgQUVTMzI6IFN5bmNSZWZOIGNvZGVzIHRoZSBBRVMgIyAqLworI2RlZmluZSBIRFNQTV9TeW5jUmVmMiAgICAgKDE8PDEzKQorI2RlZmluZSBIRFNQTV9TeW5jUmVmMyAgICAgKDE8PDI1KQogCisjZGVmaW5lIEhEU1BNX1NNVVggICAgICAgICAoMTw8MTgpIC8qIEZyYW1lID8/PyAqLyAvKiBNQURJIE9OWSAqLwogI2RlZmluZSBIRFNQTV9jbHJfdG1zICAgICAgKDE8PDE5KSAvKiBjbGVhciB0cmFjayBtYXJrZXIsIGRvIG5vdCB1c2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFUyBhZGRpdGlvbmFsIGJpdHMgaW4KIAkJCQkgICAgICBsb3dlciA1IEF1ZGlvZGF0YWJpdHMgPz8/ICovCisjZGVmaW5lIEhEU1BNX3RheGlfcmVzZXQgICAoMTw8MjApIC8qID8/PyAqLyAvKiBNQURJIE9OTFkgPyAqLworI2RlZmluZSBIRFNQTV9XQ0s0OCAgICAgICAgKDE8PDIwKSAvKiBGcmFtZSA/Pz8gPSBIRFNQTV9TTVVYICovIC8qIEFFUzMyIE9OTFkgKi8KIAogI2RlZmluZSBIRFNQTV9NaWRpMEludGVycnVwdEVuYWJsZSAoMTw8MjIpCiAjZGVmaW5lIEhEU1BNX01pZGkxSW50ZXJydXB0RW5hYmxlICgxPDwyMykKIAogI2RlZmluZSBIRFNQTV9MaW5lT3V0ICgxPDwyNCkgLyogQW5hbG9nIE91dCBvbiBjaGFubmVsIDYzLzY0IG9uPTEsIG11dGU9MCAqLwogCisjZGVmaW5lIEhEU1BNX0RTX0RvdWJsZVdpcmUgKDE8PDI2KSAvKiBBRVMzMiBPTkxZICovCisjZGVmaW5lIEhEU1BNX1FTX0RvdWJsZVdpcmUgKDE8PDI3KSAvKiBBRVMzMiBPTkxZICovCisjZGVmaW5lIEhEU1BNX1FTX1F1YWRXaXJlICAgKDE8PDI4KSAvKiBBRVMzMiBPTkxZICovCisKKyNkZWZpbmUgSERTUE1fd2Nsa19zZWwgKDE8PDMwKQogCiAvKiAtLS0gYml0IGhlbHBlciBkZWZpbmVzICovCiAjZGVmaW5lIEhEU1BNX0xhdGVuY3lNYXNrICAgIChIRFNQTV9MYXRlbmN5MHxIRFNQTV9MYXRlbmN5MXxIRFNQTV9MYXRlbmN5MikKLSNkZWZpbmUgSERTUE1fRnJlcXVlbmN5TWFzayAgKEhEU1BNX0ZyZXF1ZW5jeTB8SERTUE1fRnJlcXVlbmN5MSkKKyNkZWZpbmUgSERTUE1fRnJlcXVlbmN5TWFzayAgKEhEU1BNX0ZyZXF1ZW5jeTB8SERTUE1fRnJlcXVlbmN5MXxIRFNQTV9Eb3VibGVTcGVlZHxIRFNQTV9RdWFkU3BlZWQpCiAjZGVmaW5lIEhEU1BNX0lucHV0TWFzayAgICAgIChIRFNQTV9JbnB1dFNlbGVjdDB8SERTUE1fSW5wdXRTZWxlY3QxKQogI2RlZmluZSBIRFNQTV9JbnB1dE9wdGljYWwgICAwCiAjZGVmaW5lIEhEU1BNX0lucHV0Q29heGlhbCAgIChIRFNQTV9JbnB1dFNlbGVjdDApCi0jZGVmaW5lIEhEU1BNX1N5bmNSZWZNYXNrICAgIChIRFNQTV9TeW5jUmVmMHxIRFNQTV9TeW5jUmVmMSkKKyNkZWZpbmUgSERTUE1fU3luY1JlZk1hc2sgICAgKEhEU1BNX1N5bmNSZWYwfEhEU1BNX1N5bmNSZWYxfEhEU1BNX1N5bmNSZWYyfEhEU1BNX1N5bmNSZWYzKQogI2RlZmluZSBIRFNQTV9TeW5jUmVmX1dvcmQgICAwCiAjZGVmaW5lIEhEU1BNX1N5bmNSZWZfTUFESSAgIChIRFNQTV9TeW5jUmVmMCkKIApAQCAtMTgzLDYgKzIwNCw5IEBACiAjZGVmaW5lIEhEU1BNX0ZyZXF1ZW5jeTY0S0h6ICAgKEhEU1BNX0RvdWJsZVNwZWVkfEhEU1BNX0ZyZXF1ZW5jeTApCiAjZGVmaW5lIEhEU1BNX0ZyZXF1ZW5jeTg4XzJLSHogKEhEU1BNX0RvdWJsZVNwZWVkfEhEU1BNX0ZyZXF1ZW5jeTEpCiAjZGVmaW5lIEhEU1BNX0ZyZXF1ZW5jeTk2S0h6ICAgKEhEU1BNX0RvdWJsZVNwZWVkfEhEU1BNX0ZyZXF1ZW5jeTF8SERTUE1fRnJlcXVlbmN5MCkKKyNkZWZpbmUgSERTUE1fRnJlcXVlbmN5MTI4S0h6ICAgKEhEU1BNX1F1YWRTcGVlZHxIRFNQTV9GcmVxdWVuY3kwKQorI2RlZmluZSBIRFNQTV9GcmVxdWVuY3kxNzZfNEtIeiAgIChIRFNQTV9RdWFkU3BlZWR8SERTUE1fRnJlcXVlbmN5MSkKKyNkZWZpbmUgSERTUE1fRnJlcXVlbmN5MTkyS0h6ICAgKEhEU1BNX1F1YWRTcGVlZHxIRFNQTV9GcmVxdWVuY3kxfEhEU1BNX0ZyZXF1ZW5jeTApCiAKIC8qIC0tLSBmb3IgaW50ZXJuYWwgZGlzY3JpbWluYXRpb24gKi8KICNkZWZpbmUgSERTUE1fQ0xPQ0tfU09VUkNFX0FVVE9TWU5DICAgICAgICAgIDAJLyogU2FtcGxlIENsb2NrIFNvdXJjZXMgKi8KQEAgLTIyOSw3ICsyNTMsOCBAQAogI2RlZmluZSBIRFNQTV9CSUdFTkRJQU5fTU9ERSAgKDE8PDkpCiAjZGVmaW5lIEhEU1BNX1JEX01VTFRJUExFICAgICAoMTw8MTApCiAKLS8qIC0tLSBTdGF0dXMgUmVnaXN0ZXIgYml0cyAtLS0gKi8KKy8qIC0tLSBTdGF0dXMgUmVnaXN0ZXIgYml0cyAtLS0gKi8gLyogTUFESSBPTkxZICovIC8qIEJpdHMgZGVmaW5lZCBoZXJlIGFuZAorICAgICB0aGF0IGRvIG5vdCBjb25mbGljdCB3aXRoIHNwZWNpZmljIGJpdHMgZm9yIEFFUzMyIHNlZW0gdG8gYmUgdmFsaWQgYWxzbyBmb3IgdGhlIEFFUzMyICovCiAjZGVmaW5lIEhEU1BNX2F1ZGlvSVJRUGVuZGluZyAgICAoMTw8MCkJLyogSVJRIGlzIGhpZ2ggYW5kIHBlbmRpbmcgKi8KICNkZWZpbmUgSERTUE1fUlhfNjRjaCAgICAgICAgICAgICgxPDwxKQkvKiBJbnB1dCA2NGNoYW4uIE1PREU9MSwgNTZjaG4uIE1PREU9MCAqLwogI2RlZmluZSBIRFNQTV9BQl9pbnQgICAgICAgICAgICAgKDE8PDIpCS8qIElucHV0Q2hhbm5lbCBPcHQ9MCwgQ29heD0xIChsaWtlIGlucDApICovCkBAIC0yNjMsNyArMjg4LDcgQEAKICNkZWZpbmUgSERTUE1fbWFkaUZyZXExNzZfNCAoSERTUE1fbWFkaUZyZXEzKQogI2RlZmluZSBIRFNQTV9tYWRpRnJlcTE5MiAgIChIRFNQTV9tYWRpRnJlcTN8SERTUE1fbWFkaUZyZXEwKQogCi0vKiBTdGF0dXMyIFJlZ2lzdGVyIGJpdHMgKi8KKy8qIFN0YXR1czIgUmVnaXN0ZXIgYml0cyAqLyAvKiBNQURJIE9OTFkgKi8KIAogI2RlZmluZSBIRFNQTV92ZXJzaW9uMCAoMTw8MCkJLyogbm90IHJlYWx5IGRlZmluZWQgYnV0IEkgZ3Vlc3MgKi8KICNkZWZpbmUgSERTUE1fdmVyc2lvbjEgKDE8PDEpCS8qIGluIGZvcm1lciBjYXJkcyBpdCB3YXMgPz8/ICovCkBAIC0yOTcsNiArMzIyLDU2IEBACiAjZGVmaW5lIEhEU1BNX1NlbFN5bmNSZWZfTUFESSAgICAgIChIRFNQTV9TZWxTeW5jUmVmMCkKICNkZWZpbmUgSERTUE1fU2VsU3luY1JlZl9OVkFMSUQgICAgKEhEU1BNX1NlbFN5bmNSZWYwfEhEU1BNX1NlbFN5bmNSZWYxfEhEU1BNX1NlbFN5bmNSZWYyKQogCisvKgorICAgRm9yIEFFUzMyLCBiaXRzIGZvciBzdGF0dXMsIHN0YXR1czIgYW5kIHRpbWVjb2RlIGFyZSBkaWZmZXJlbnQKKyovCisvKiBzdGF0dXMgKi8KKyNkZWZpbmUgSERTUE1fQUVTMzJfd2NMb2NrCTB4MDIwMDAwMAorI2RlZmluZSBIRFNQTV9BRVMzMl93Y0ZyZXFfYml0ICAyMgorLyogKHN0YXR1cyA+PiBIRFNQTV9BRVMzMl93Y0ZyZXFfYml0KSAmIDB4RiBnaXZlcyBXQyBmcmVxdWVuY3kgKGNmIGZ1bmN0aW9uIAorICBIRFNQTV9iaXQyZnJlcSAqLworI2RlZmluZSBIRFNQTV9BRVMzMl9zeW5jcmVmX2JpdCAgMTYKKy8qIChzdGF0dXMgPj4gSERTUE1fQUVTMzJfc3luY3JlZl9iaXQpICYgMHhGIGdpdmVzIHN5bmMgc291cmNlICovCisKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9XT1JEIDAKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMxIDEKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMyIDIKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMzIDMKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM0IDQKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM1IDUKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM2IDYKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM3IDcKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM4IDgKKyNkZWZpbmUgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9OT05FIC0xCisKKy8qICBzdGF0dXMyICovCisvKiBIRFNQTV9Mb2NrQUVTX2JpdCBpcyBnaXZlbiBieSBIRFNQTV9Mb2NrQUVTID4+IChBRVMjIC0gMSkgKi8KKyNkZWZpbmUgSERTUE1fTG9ja0FFUyAgIDB4ODAKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzEgIDB4ODAKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzIgIDB4NDAKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzMgIDB4MjAKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzQgIDB4MTAKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzUgIDB4OAorI2RlZmluZSBIRFNQTV9Mb2NrQUVTNiAgMHg0CisjZGVmaW5lIEhEU1BNX0xvY2tBRVM3ICAweDIKKyNkZWZpbmUgSERTUE1fTG9ja0FFUzggIDB4MQorLyoKKyAgIFRpbWVjb2RlCisgICBBZnRlciB3aW5kb3dzIGRyaXZlciBzb3VyY2VzLCBiaXRzIDQqaSB0byA0KmkrMyBnaXZlIHRoZSBpbnB1dCBmcmVxdWVuY3kgb24KKyAgIEFFUyBpKzEKKyBiaXRzIDMyMTAKKyAgICAgIDAwMDEgIDMya0h6CisgICAgICAwMDEwICA0NC4xa0h6CisgICAgICAwMDExICA0OGtIegorICAgICAgMDEwMCAgNjRrSHoKKyAgICAgIDAxMDEgIDg4LjJrSHoKKyAgICAgIDAxMTAgIDk2a0h6CisgICAgICAwMTExICAxMjhrSHoKKyAgICAgIDEwMDAgIDE3Ni40a0h6CisgICAgICAxMDAxICAxOTJrSHoKKyAgTkI6IFRpbWVjb2RlIHJlZ2lzdGVyIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIG9uIEFFUzMyIGNhcmQgcmV2aXNpb24gMjMwCisqLworCiAvKiBNaXhlciBWYWx1ZXMgKi8KICNkZWZpbmUgVU5JVFlfR0FJTiAgICAgICAgICAzMjc2OAkvKiA9IDY1NTM2LzIgKi8KICNkZWZpbmUgTUlOVVNfSU5GSU5JVFlfR0FJTiAwCkBAIC0zMTQsMTAgKzM4OSwxNCBAQAogICAgc2l6ZSBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMsIGFuZAogICAgYWxzbyB0aGUgbGF0ZW5jeSB0byB1c2UuIAogICAgZm9yIG9uZSBkaXJlY3Rpb24gISEhCisgICA9PiBuZWVkIHRvIG11cGx0aXBseSBieSAyISEKICovCi0jZGVmaW5lIEhEU1BNX0RNQV9BUkVBX0JZVEVTIChIRFNQTV9NQVhfQ0hBTk5FTFMgKiBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUykKKyNkZWZpbmUgSERTUE1fRE1BX0FSRUFfQllURVMgKDIgKiBIRFNQTV9NQVhfQ0hBTk5FTFMgKiBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUykKICNkZWZpbmUgSERTUE1fRE1BX0FSRUFfS0lMT0JZVEVTIChIRFNQTV9ETUFfQVJFQV9CWVRFUy8xMDI0KQogCisvKiByZXZpc2lvbnMgPj0gMjMwIGluZGljYXRlIEFFUzMyIGNhcmQgKi8KKyNkZWZpbmUgSERTUE1fQUVTUkVWSVNJT04gMjMwCisKIHN0cnVjdCBoZHNwbV9taWRpIHsKIAlzdHJ1Y3QgaGRzcG0gKmhkc3BtOwogCWludCBpZDsKQEAgLTMzNiw3ICs0MTUsOSBAQAogICAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBsYXliYWNrX3N1YnN0cmVhbTsgLyogYW5kL29yIGNhcHR1cmUgc3RyZWFtICovCiAKIAljaGFyICpjYXJkX25hbWU7CSAgICAgLyogZm9yIHByb2NpbmZvICovCi0JdW5zaWduZWQgc2hvcnQgZmlybXdhcmVfcmV2OyAvKiBkb250IGtub3cgaWYgcmVsZXZhbnQgKi8KKwl1bnNpZ25lZCBzaG9ydCBmaXJtd2FyZV9yZXY7IC8qIGRvbnQga25vdyBpZiByZWxldmFudCAoeWVzIGlmIEFFUzMyKSovCisKKwl1bnNpZ25lZCBjaGFyIGlzX2FlczMyOyAgICAvKiBpbmRpY2F0ZXMgaWYgY2FyZCBpcyBBRVMzMiAqLwogCiAJaW50IHByZWNpc2VfcHRyOwkvKiB1c2UgcHJlY2lzZSBwb2ludGVycywgdG8gYmUgdGVzdGVkICovCiAJaW50IG1vbml0b3Jfb3V0czsJLyogc2V0IHVwIG1vbml0b3Jpbmcgb3V0cyBpbml0IGZsYWcgKi8KQEAgLTQ1Myw2ICs1MzQsMTUgQEAKIHN0YXRpYyB2b2lkIGhkc3BtX3NldF9zZ2J1ZihzdHJ1Y3QgaGRzcG0gKiBoZHNwbSwgc3RydWN0IHNuZF9zZ19idWYgKnNnYnVmLAogCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnLCBpbnQgY2hhbm5lbHMpOwogCitzdGF0aWMgaW5saW5lIGludCBIRFNQTV9iaXQyZnJlcShpbnQgbikKK3sKKwlzdGF0aWMgaW50IGJpdDJmcmVxX3RhYltdID0geyAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsCisJCTk2MDAwLCAxMjgwMDAsIDE3NjQwMCwgMTkyMDAwIH07CisJaWYgKG4gPCAxIHx8IG4gPiA5KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYml0MmZyZXFfdGFiW25dOworfQorCiAvKiBXcml0ZS9yZWFkIHRvL2Zyb20gSERTUE0gd2l0aCBBZHJlc3NlcyBpbiBCeXRlcwogICAgbm90IHdvcmRzIGJ1dCBvbmx5IDMyQml0IHdyaXRlcyBhcmUgYWxsb3dlZCAqLwogCkBAIC01NDQsODYgKzYzNCwxMDUgQEAKIC8qIGNoZWNrIGZvciBleHRlcm5hbCBzYW1wbGUgcmF0ZSAqLwogc3RhdGljIGlubGluZSBpbnQgaGRzcG1fZXh0ZXJuYWxfc2FtcGxlX3JhdGUoc3RydWN0IGhkc3BtICogaGRzcG0pCiB7Ci0JdW5zaWduZWQgaW50IHN0YXR1czIgPSBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpOwotCXVuc2lnbmVkIGludCBzdGF0dXMgPSBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3Rlcik7Ci0JdW5zaWduZWQgaW50IHJhdGVfYml0czsKLQlpbnQgcmF0ZSA9IDA7CisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQl1bnNpZ25lZCBpbnQgc3RhdHVzMiA9IGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX3N0YXR1c1JlZ2lzdGVyMik7CisJCXVuc2lnbmVkIGludCBzdGF0dXMgPSBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3Rlcik7CisJCXVuc2lnbmVkIGludCB0aW1lY29kZSA9IGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX3RpbWVjb2RlUmVnaXN0ZXIpOwogCi0JLyogaWYgd29yZGNsb2NrIGhhcyBzeW5jZWQgZnJlcSBhbmQgd29yZGNsb2NrIGlzIHZhbGlkICovCi0JaWYgKChzdGF0dXMyICYgSERTUE1fd2NMb2NrKSAhPSAwICYmCi0JICAgIChzdGF0dXMgJiBIRFNQTV9TZWxTeW5jUmVmMCkgPT0gMCkgeworCQlpbnQgc3luY3JlZiA9IGhkc3BtX2F1dG9zeW5jX3JlZihoZHNwbSk7CiAKLQkJcmF0ZV9iaXRzID0gc3RhdHVzMiAmIEhEU1BNX3djRnJlcU1hc2s7CisJCWlmIChzeW5jcmVmID09IEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fV09SRCAmJgorCQkJCXN0YXR1cyAmIEhEU1BNX0FFUzMyX3djTG9jaykKKwkJCXJldHVybiBIRFNQTV9iaXQyZnJlcSgoc3RhdHVzID4+IEhEU1BNX0FFUzMyX3djRnJlcV9iaXQpICYgMHhGKTsKKwkJaWYgKHN5bmNyZWYgPj0gSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMxICYmCisJCQlzeW5jcmVmIDw9IEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fQUVTOCAmJgorCQkJc3RhdHVzMiAmIChIRFNQTV9Mb2NrQUVTID4+CisJCQkgICAgICAgICAgKHN5bmNyZWYgLSBIRFNQTV9BRVMzMl9BVVRPU1lOQ19GUk9NX0FFUzEpKSkKKwkJCXJldHVybiBIRFNQTV9iaXQyZnJlcSgodGltZWNvZGUgPj4KKwkJCSAgKDQqKHN5bmNyZWYtSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMxKSkpICYgMHhGKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IHN0YXR1czIgPSBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpOworCQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIpOworCQl1bnNpZ25lZCBpbnQgcmF0ZV9iaXRzOworCQlpbnQgcmF0ZSA9IDA7CiAKLQkJc3dpdGNoIChyYXRlX2JpdHMpIHsKLQkJY2FzZSBIRFNQTV93Y0ZyZXEzMjoKLQkJCXJhdGUgPSAzMjAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX3djRnJlcTQ0XzE6Ci0JCQlyYXRlID0gNDQxMDA7Ci0JCQlicmVhazsKLQkJY2FzZSBIRFNQTV93Y0ZyZXE0ODoKLQkJCXJhdGUgPSA0ODAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX3djRnJlcTY0OgotCQkJcmF0ZSA9IDY0MDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSERTUE1fd2NGcmVxODhfMjoKLQkJCXJhdGUgPSA4ODIwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX3djRnJlcTk2OgotCQkJcmF0ZSA9IDk2MDAwOwotCQkJYnJlYWs7Ci0JCQkvKiBRdWFkc3BlZWQgQml0IG1pc3NpbmcgPz8/PyAqLwotCQlkZWZhdWx0OgotCQkJcmF0ZSA9IDA7Ci0JCQlicmVhazsKKwkJLyogaWYgd29yZGNsb2NrIGhhcyBzeW5jZWQgZnJlcSBhbmQgd29yZGNsb2NrIGlzIHZhbGlkICovCisJCWlmICgoc3RhdHVzMiAmIEhEU1BNX3djTG9jaykgIT0gMCAmJgorCQkJCShzdGF0dXMgJiBIRFNQTV9TZWxTeW5jUmVmMCkgPT0gMCkgeworCisJCQlyYXRlX2JpdHMgPSBzdGF0dXMyICYgSERTUE1fd2NGcmVxTWFzazsKKworCQkJc3dpdGNoIChyYXRlX2JpdHMpIHsKKwkJCWNhc2UgSERTUE1fd2NGcmVxMzI6CisJCQkJcmF0ZSA9IDMyMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBIRFNQTV93Y0ZyZXE0NF8xOgorCQkJCXJhdGUgPSA0NDEwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSERTUE1fd2NGcmVxNDg6CisJCQkJcmF0ZSA9IDQ4MDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBIRFNQTV93Y0ZyZXE2NDoKKwkJCQlyYXRlID0gNjQwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhEU1BNX3djRnJlcTg4XzI6CisJCQkJcmF0ZSA9IDg4MjAwOworCQkJCWJyZWFrOworCQkJY2FzZSBIRFNQTV93Y0ZyZXE5NjoKKwkJCQlyYXRlID0gOTYwMDA7CisJCQkJYnJlYWs7CisJCQkJLyogUXVhZHNwZWVkIEJpdCBtaXNzaW5nID8/Pz8gKi8KKwkJCWRlZmF1bHQ6CisJCQkJcmF0ZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KLQl9CiAKLQkvKiBpZiByYXRlIGRldGVjdGVkIGFuZCBTeW5jcmVmIGlzIFdvcmQgdGhhbiBoYXZlIGl0LCB3b3JkIGhhcyBwcmlvcml0eSB0byBNQURJICovCi0JaWYgKHJhdGUgIT0gMAotCSAgICAmJiAoc3RhdHVzMiAmIEhEU1BNX1NlbFN5bmNSZWZNYXNrKSA9PSBIRFNQTV9TZWxTeW5jUmVmX1dPUkQpCisJCS8qIGlmIHJhdGUgZGV0ZWN0ZWQgYW5kIFN5bmNyZWYgaXMgV29yZCB0aGFuIGhhdmUgaXQsIHdvcmQgaGFzIHByaW9yaXR5IHRvIE1BREkgKi8KKwkJaWYgKHJhdGUgIT0gMCAmJgorCSAgICAgICAgICAgIChzdGF0dXMyICYgSERTUE1fU2VsU3luY1JlZk1hc2spID09IEhEU1BNX1NlbFN5bmNSZWZfV09SRCkKKwkJCXJldHVybiByYXRlOworCisJCS8qIG1hYnkgYSBtYWRpIGlucHV0ICh3aGljaCBpcyB0YWtlbiBpZiBzZWwgc3luYyBpcyBtYWRpKSAqLworCQlpZiAoc3RhdHVzICYgSERTUE1fbWFkaUxvY2spIHsKKwkJCXJhdGVfYml0cyA9IHN0YXR1cyAmIEhEU1BNX21hZGlGcmVxTWFzazsKKworCQkJc3dpdGNoIChyYXRlX2JpdHMpIHsKKwkJCWNhc2UgSERTUE1fbWFkaUZyZXEzMjoKKwkJCQlyYXRlID0gMzIwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhEU1BNX21hZGlGcmVxNDRfMToKKwkJCQlyYXRlID0gNDQxMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhEU1BNX21hZGlGcmVxNDg6CisJCQkJcmF0ZSA9IDQ4MDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBIRFNQTV9tYWRpRnJlcTY0OgorCQkJCXJhdGUgPSA2NDAwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSERTUE1fbWFkaUZyZXE4OF8yOgorCQkJCXJhdGUgPSA4ODIwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSERTUE1fbWFkaUZyZXE5NjoKKwkJCQlyYXRlID0gOTYwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhEU1BNX21hZGlGcmVxMTI4OgorCQkJCXJhdGUgPSAxMjgwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEhEU1BNX21hZGlGcmVxMTc2XzQ6CisJCQkJcmF0ZSA9IDE3NjQwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSERTUE1fbWFkaUZyZXExOTI6CisJCQkJcmF0ZSA9IDE5MjAwMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmF0ZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KIAkJcmV0dXJuIHJhdGU7Ci0KLQkvKiBtYWJ5IGEgbWFkaSBpbnB1dCAod2hpY2ggaXMgdGFrZW4gaWYgc2VsIHN5bmMgaXMgbWFkaSkgKi8KLQlpZiAoc3RhdHVzICYgSERTUE1fbWFkaUxvY2spIHsKLQkJcmF0ZV9iaXRzID0gc3RhdHVzICYgSERTUE1fbWFkaUZyZXFNYXNrOwotCi0JCXN3aXRjaCAocmF0ZV9iaXRzKSB7Ci0JCWNhc2UgSERTUE1fbWFkaUZyZXEzMjoKLQkJCXJhdGUgPSAzMjAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX21hZGlGcmVxNDRfMToKLQkJCXJhdGUgPSA0NDEwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX21hZGlGcmVxNDg6Ci0JCQlyYXRlID0gNDgwMDA7Ci0JCQlicmVhazsKLQkJY2FzZSBIRFNQTV9tYWRpRnJlcTY0OgotCQkJcmF0ZSA9IDY0MDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSERTUE1fbWFkaUZyZXE4OF8yOgotCQkJcmF0ZSA9IDg4MjAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSERTUE1fbWFkaUZyZXE5NjoKLQkJCXJhdGUgPSA5NjAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX21hZGlGcmVxMTI4OgotCQkJcmF0ZSA9IDEyODAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEhEU1BNX21hZGlGcmVxMTc2XzQ6Ci0JCQlyYXRlID0gMTc2NDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSERTUE1fbWFkaUZyZXExOTI6Ci0JCQlyYXRlID0gMTkyMDAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyYXRlID0gMDsKLQkJCWJyZWFrOwotCQl9CiAJfQotCXJldHVybiByYXRlOwogfQogCiAvKiBMYXRlbmN5IGZ1bmN0aW9uICovCkBAIC02NzYsNyArNzg1LDggQEAKIAlpbnQgbiA9IGhkc3BtLT5wZXJpb2RfYnl0ZXM7CiAJdm9pZCAqYnVmID0gaGRzcG0tPnBsYXliYWNrX2J1ZmZlcjsKIAotCXNuZF9hc3NlcnQoYnVmICE9IE5VTEwsIHJldHVybik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgSERTUE1fTUFYX0NIQU5ORUxTOyBpKyspIHsKIAkJbWVtc2V0KGJ1ZiwgMCwgbik7CkBAIC03MTYsNiArODI2LDcgQEAKIAlpbnQgY3VycmVudF9yYXRlOwogCWludCByYXRlX2JpdHM7CiAJaW50IG5vdF9zZXQgPSAwOworCWludCBpc19zaW5nbGUsIGlzX2RvdWJsZSwgaXNfcXVhZDsKIAogCS8qIEFTU1VNUFRJT046IGhkc3BtLT5sb2NrIGlzIGVpdGhlciBzZXQsIG9yIHRoZXJlIGlzIG5vIG5lZWQgZm9yCiAJICAgaXQgKGUuZy4gZHVyaW5nIG1vZHVsZSBpbml0aWFsaXphdGlvbikuCkBAIC03NjYsNDMgKzg3Nyw1NiBAQAogCSAgIGNoYW5nZXMgaW4gdGhlIHJlYWQvd3JpdGUgcm91dGluZXMuICAKIAkgKi8KIAorCWlzX3NpbmdsZSA9IChjdXJyZW50X3JhdGUgPD0gNDgwMDApOworCWlzX2RvdWJsZSA9IChjdXJyZW50X3JhdGUgPiA0ODAwMCAmJiBjdXJyZW50X3JhdGUgPD0gOTYwMDApOworCWlzX3F1YWQgPSAoY3VycmVudF9yYXRlID4gOTYwMDApOworCiAJc3dpdGNoIChyYXRlKSB7CiAJY2FzZSAzMjAwMDoKLQkJaWYgKGN1cnJlbnRfcmF0ZSA+IDQ4MDAwKSB7CisJCWlmICghaXNfc2luZ2xlKQogCQkJcmVqZWN0X2lmX29wZW4gPSAxOwotCQl9CiAJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTMyS0h6OwogCQlicmVhazsKIAljYXNlIDQ0MTAwOgotCQlpZiAoY3VycmVudF9yYXRlID4gNDgwMDApIHsKKwkJaWYgKCFpc19zaW5nbGUpCiAJCQlyZWplY3RfaWZfb3BlbiA9IDE7Ci0JCX0KIAkJcmF0ZV9iaXRzID0gSERTUE1fRnJlcXVlbmN5NDRfMUtIejsKIAkJYnJlYWs7CiAJY2FzZSA0ODAwMDoKLQkJaWYgKGN1cnJlbnRfcmF0ZSA+IDQ4MDAwKSB7CisJCWlmICghaXNfc2luZ2xlKQogCQkJcmVqZWN0X2lmX29wZW4gPSAxOwotCQl9CiAJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTQ4S0h6OwogCQlicmVhazsKIAljYXNlIDY0MDAwOgotCQlpZiAoY3VycmVudF9yYXRlIDw9IDQ4MDAwKSB7CisJCWlmICghaXNfZG91YmxlKQogCQkJcmVqZWN0X2lmX29wZW4gPSAxOwotCQl9CiAJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTY0S0h6OwogCQlicmVhazsKIAljYXNlIDg4MjAwOgotCQlpZiAoY3VycmVudF9yYXRlIDw9IDQ4MDAwKSB7CisJCWlmICghaXNfZG91YmxlKQogCQkJcmVqZWN0X2lmX29wZW4gPSAxOwotCQl9CiAJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTg4XzJLSHo7CiAJCWJyZWFrOwogCWNhc2UgOTYwMDA6Ci0JCWlmIChjdXJyZW50X3JhdGUgPD0gNDgwMDApIHsKKwkJaWYgKCFpc19kb3VibGUpCiAJCQlyZWplY3RfaWZfb3BlbiA9IDE7Ci0JCX0KIAkJcmF0ZV9iaXRzID0gSERTUE1fRnJlcXVlbmN5OTZLSHo7CiAJCWJyZWFrOworCWNhc2UgMTI4MDAwOgorCQlpZiAoIWlzX3F1YWQpCisJCQlyZWplY3RfaWZfb3BlbiA9IDE7CisJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTEyOEtIejsKKwkJYnJlYWs7CisJY2FzZSAxNzY0MDA6CisJCWlmICghaXNfcXVhZCkKKwkJCXJlamVjdF9pZl9vcGVuID0gMTsKKwkJcmF0ZV9iaXRzID0gSERTUE1fRnJlcXVlbmN5MTc2XzRLSHo7CisJCWJyZWFrOworCWNhc2UgMTkyMDAwOgorCQlpZiAoIWlzX3F1YWQpCisJCQlyZWplY3RfaWZfb3BlbiA9IDE7CisJCXJhdGVfYml0cyA9IEhEU1BNX0ZyZXF1ZW5jeTE5MktIejsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtODE5LDcgKzk0Myw3IEBACiAJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gcmF0ZV9iaXRzOwogCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKIAotCWlmIChyYXRlID4gNjQwMDApCisJaWYgKHJhdGUgPiA5NjAwMCAvKiA2NDAwMCovKQogCQloZHNwbS0+Y2hhbm5lbF9tYXAgPSBjaGFubmVsX21hcF9tYWRpX3FzOwogCWVsc2UgaWYgKHJhdGUgPiA0ODAwMCkKIAkJaGRzcG0tPmNoYW5uZWxfbWFwID0gY2hhbm5lbF9tYXBfbWFkaV9kczsKQEAgLTE0NTUsMTEgKzE1NzksMjcgQEAKIAkvKiBOb3RpY2UgdGhhdCB0aGlzIGxvb2tzIGF0IHRoZSByZXF1ZXN0ZWQgc3luYyBzb3VyY2UsCiAJICAgbm90IHRoZSBvbmUgYWN0dWFsbHkgaW4gdXNlLgogCSAqLwotCXN3aXRjaCAoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9TeW5jUmVmTWFzaykgewotCWNhc2UgSERTUE1fU3luY1JlZl9Xb3JkOgotCQlyZXR1cm4gSERTUE1fU1lOQ19GUk9NX1dPUkQ7Ci0JY2FzZSBIRFNQTV9TeW5jUmVmX01BREk6Ci0JCXJldHVybiBIRFNQTV9TWU5DX0ZST01fTUFESTsKKwlpZiAoaGRzcG0tPmlzX2FlczMyKSB7CisJCXN3aXRjaCAoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9TeW5jUmVmTWFzaykgeworCQkvKiBudW1iZXIgZ2l2ZXMgQUVTIGluZGV4LCBleGNlcHQgZm9yIDAgd2hpY2gKKwkJICAgY29ycmVzcG9uZHMgdG8gV29yZENsb2NrICovCisJCWNhc2UgMDogcmV0dXJuIDA7CisJCWNhc2UgSERTUE1fU3luY1JlZjA6IHJldHVybiAxOworCQljYXNlIEhEU1BNX1N5bmNSZWYxOiByZXR1cm4gMjsKKwkJY2FzZSBIRFNQTV9TeW5jUmVmMStIRFNQTV9TeW5jUmVmMDogcmV0dXJuIDM7CisJCWNhc2UgSERTUE1fU3luY1JlZjI6IHJldHVybiA0OworCQljYXNlIEhEU1BNX1N5bmNSZWYyK0hEU1BNX1N5bmNSZWYwOiByZXR1cm4gNTsKKwkJY2FzZSBIRFNQTV9TeW5jUmVmMitIRFNQTV9TeW5jUmVmMTogcmV0dXJuIDY7CisJCWNhc2UgSERTUE1fU3luY1JlZjIrSERTUE1fU3luY1JlZjErSERTUE1fU3luY1JlZjA6IHJldHVybiA3OworCQljYXNlIEhEU1BNX1N5bmNSZWYzOiByZXR1cm4gODsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9TeW5jUmVmTWFzaykgeworCQljYXNlIEhEU1BNX1N5bmNSZWZfV29yZDoKKwkJCXJldHVybiBIRFNQTV9TWU5DX0ZST01fV09SRDsKKwkJY2FzZSBIRFNQTV9TeW5jUmVmX01BREk6CisJCQlyZXR1cm4gSERTUE1fU1lOQ19GUk9NX01BREk7CisJCX0KIAl9CiAKIAlyZXR1cm4gSERTUE1fU1lOQ19GUk9NX1dPUkQ7CkBAIC0xNDY5LDE1ICsxNjA5LDQ5IEBACiB7CiAJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BNX1N5bmNSZWZNYXNrOwogCi0Jc3dpdGNoIChwcmVmKSB7Ci0JY2FzZSBIRFNQTV9TWU5DX0ZST01fTUFESToKLQkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUE1fU3luY1JlZl9NQURJOwotCQlicmVhazsKLQljYXNlIEhEU1BNX1NZTkNfRlJPTV9XT1JEOgotCQloZHNwbS0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQTV9TeW5jUmVmX1dvcmQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKKwlpZiAoaGRzcG0tPmlzX2FlczMyKSB7CisJCXN3aXRjaCAocHJlZikgeworCQljYXNlIDA6CisJCSAgICAgICBoZHNwbS0+Y29udHJvbF9yZWdpc3RlciB8PSAwOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgMToKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYwOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgMjoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYxOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgMzoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYxK0hEU1BNX1N5bmNSZWYwOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgNDoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYyOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgNToKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYyK0hEU1BNX1N5bmNSZWYwOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgNjoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYyK0hEU1BNX1N5bmNSZWYxOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgNzoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYyK0hEU1BNX1N5bmNSZWYxK0hEU1BNX1N5bmNSZWYwOworCQkgICAgICAgYnJlYWs7CisJCWNhc2UgODoKKwkJICAgICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWYzOworCQkgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgICAgICByZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHByZWYpIHsKKwkJY2FzZSBIRFNQTV9TWU5DX0ZST01fTUFESToKKwkJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1N5bmNSZWZfTUFESTsKKwkJCWJyZWFrOworCQljYXNlIEhEU1BNX1NZTkNfRlJPTV9XT1JEOgorCQkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUE1fU3luY1JlZl9Xb3JkOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJCX0KIAl9CiAJaGRzcG1fd3JpdGUoaGRzcG0sIEhEU1BNX2NvbnRyb2xSZWdpc3RlciwgaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpOwogCXJldHVybiAwOwpAQCAtMTQ4NiwxOCArMTY2MCwzNiBAQAogc3RhdGljIGludCBzbmRfaGRzcG1faW5mb19wcmVmX3N5bmNfcmVmKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewotCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyAiV29yZCIsICJNQURJIiB9OworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKLQl1aW5mby0+Y291bnQgPSAxOworCWlmIChoZHNwbS0+aXNfYWVzMzIpIHsKKwkJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7ICJXb3JkIiwgIkFFUzEiLCAiQUVTMiIsICJBRVMzIiwKKwkJCSJBRVM0IiwgIkFFUzUiLAkiQUVTNiIsICJBRVM3IiwgIkFFUzgiIH07CiAKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCQl1aW5mby0+Y291bnQgPSAxOwogCi0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCi0JCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQotCQkgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOwotCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAotCSAgICAgICB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gOTsKKworCQlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwkJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCisJCQkJdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCX0gZWxzZSB7CisJCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyAiV29yZCIsICJNQURJIiB9OworCisJCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCQl1aW5mby0+Y291bnQgPSAxOworCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKKworCQlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwkJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCisJCQkJdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUxNyw3ICsxNzA5LDcgQEAKIAlpbnQgY2hhbmdlLCBtYXg7CiAJdW5zaWduZWQgaW50IHZhbDsKIAotCW1heCA9IDI7CisJbWF4ID0gaGRzcG0tPmlzX2FlczMyID8gOSA6IDI7CiAKIAlpZiAoIXNuZF9oZHNwbV91c2VfaXNfZXhjbHVzaXZlKGhkc3BtKSkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTE1NDIsNDAgKzE3MzQsNjQgQEAKIAogc3RhdGljIGludCBoZHNwbV9hdXRvc3luY19yZWYoc3RydWN0IGhkc3BtICogaGRzcG0pCiB7Ci0JLyogVGhpcyBsb29rcyBhdCB0aGUgYXV0b3N5bmMgc2VsZWN0ZWQgc3luYyByZWZlcmVuY2UgKi8KLQl1bnNpZ25lZCBpbnQgc3RhdHVzMiA9IGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX3N0YXR1c1JlZ2lzdGVyMik7CisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIpOworCQl1bnNpZ25lZCBpbnQgc3luY3JlZiA9IChzdGF0dXMgPj4gSERTUE1fQUVTMzJfc3luY3JlZl9iaXQpICYgMHhGOworCQlpZiAoc3luY3JlZiA9PSAwKQorCQkJcmV0dXJuIEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fV09SRDsKKwkJaWYgKHN5bmNyZWYgPD0gOCkKKwkJCXJldHVybiBzeW5jcmVmOworCQlyZXR1cm4gSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9OT05FOworCX0gZWxzZSB7CisJCS8qIFRoaXMgbG9va3MgYXQgdGhlIGF1dG9zeW5jIHNlbGVjdGVkIHN5bmMgcmVmZXJlbmNlICovCisJCXVuc2lnbmVkIGludCBzdGF0dXMyID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIyKTsKIAotCXN3aXRjaCAoc3RhdHVzMiAmIEhEU1BNX1NlbFN5bmNSZWZNYXNrKSB7CisJCXN3aXRjaCAoc3RhdHVzMiAmIEhEU1BNX1NlbFN5bmNSZWZNYXNrKSB7CisJCWNhc2UgSERTUE1fU2VsU3luY1JlZl9XT1JEOgorCQkJcmV0dXJuIEhEU1BNX0FVVE9TWU5DX0ZST01fV09SRDsKKwkJY2FzZSBIRFNQTV9TZWxTeW5jUmVmX01BREk6CisJCQlyZXR1cm4gSERTUE1fQVVUT1NZTkNfRlJPTV9NQURJOworCQljYXNlIEhEU1BNX1NlbFN5bmNSZWZfTlZBTElEOgorCQkJcmV0dXJuIEhEU1BNX0FVVE9TWU5DX0ZST01fTk9ORTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CiAKLQljYXNlIEhEU1BNX1NlbFN5bmNSZWZfV09SRDoKLQkJcmV0dXJuIEhEU1BNX0FVVE9TWU5DX0ZST01fV09SRDsKLQotCWNhc2UgSERTUE1fU2VsU3luY1JlZl9NQURJOgotCQlyZXR1cm4gSERTUE1fQVVUT1NZTkNfRlJPTV9NQURJOwotCi0JY2FzZSBIRFNQTV9TZWxTeW5jUmVmX05WQUxJRDoKLQkJcmV0dXJuIEhEU1BNX0FVVE9TWU5DX0ZST01fTk9ORTsKLQotCWRlZmF1bHQ6CiAJCXJldHVybiAwOwogCX0KLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNuZF9oZHNwbV9pbmZvX2F1dG9zeW5jX3JlZihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKLQlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsgIldvcmRDbG9jayIsICJNQURJIiwgIk5vbmUiIH07CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCXVpbmZvLT5jb3VudCA9IDE7Ci0JdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOwotCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQotCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0KLQkJICAgIHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKLQlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKLQkgICAgICAgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCWlmIChoZHNwbS0+aXNfYWVzMzIpIHsKKwkJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7ICJXb3JkQ2xvY2siLCAiQUVTMSIsICJBRVMyIiwgIkFFUzMiLAorCQkJIkFFUzQiLAkiQUVTNSIsICJBRVM2IiwgIkFFUzciLCAiQUVTOCIsICJOb25lIn07CisKKwkJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJCXVpbmZvLT5jb3VudCA9IDE7CisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMTA7CisJCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9CisJCQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCQlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkJCQl0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJfQorCWVsc2UKKwl7CisJCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyAiV29yZENsb2NrIiwgIk1BREkiLCAiTm9uZSIgfTsKKworCQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwkJdWluZm8tPmNvdW50ID0gMTsKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOworCQlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwkJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCisJCQkJdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg0MSw2ICsyMDU3LDE5NSBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKKyNkZWZpbmUgSERTUE1fRU1QSEFTSVMoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX2VtcGhhc2lzLCBcCisgIC5nZXQgPSBzbmRfaGRzcG1fZ2V0X2VtcGhhc2lzLCBcCisgIC5wdXQgPSBzbmRfaGRzcG1fcHV0X2VtcGhhc2lzIFwKK30KKworc3RhdGljIGludCBoZHNwbV9lbXBoYXNpcyhzdHJ1Y3QgaGRzcG0gKiBoZHNwbSkKK3sKKwlyZXR1cm4gKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUE1fRW1waGFzaXMpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaGRzcG1fc2V0X2VtcGhhc2lzKHN0cnVjdCBoZHNwbSAqIGhkc3BtLCBpbnQgZW1wKQoreworCWlmIChlbXApCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX0VtcGhhc2lzOworCWVsc2UKKwkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BNX0VtcGhhc2lzOworCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9pbmZvX2VtcGhhc2lzKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX2dldF9lbXBoYXNpcyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlzcGluX2xvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3BtX2VtcGhhc2lzKGhkc3BtKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcG1fcHV0X2VtcGhhc2lzKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoIXNuZF9oZHNwbV91c2VfaXNfZXhjbHVzaXZlKGhkc3BtKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDE7CisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCWNoYW5nZSA9IChpbnQpIHZhbCAhPSBoZHNwbV9lbXBoYXNpcyhoZHNwbSk7CisJaGRzcG1fc2V0X2VtcGhhc2lzKGhkc3BtLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKyNkZWZpbmUgSERTUE1fRE9MQlkoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX2RvbGJ5LCBcCisgIC5nZXQgPSBzbmRfaGRzcG1fZ2V0X2RvbGJ5LCBcCisgIC5wdXQgPSBzbmRfaGRzcG1fcHV0X2RvbGJ5IFwKK30KKworc3RhdGljIGludCBoZHNwbV9kb2xieShzdHJ1Y3QgaGRzcG0gKiBoZHNwbSkKK3sKKwlyZXR1cm4gKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUE1fRG9sYnkpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaGRzcG1fc2V0X2RvbGJ5KHN0cnVjdCBoZHNwbSAqIGhkc3BtLCBpbnQgZG9sKQoreworCWlmIChkb2wpCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX0RvbGJ5OworCWVsc2UKKwkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfkhEU1BNX0RvbGJ5OworCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9pbmZvX2RvbGJ5KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX2dldF9kb2xieShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRzcG0gKmhkc3BtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBoZHNwbV9kb2xieShoZHNwbSk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX3B1dF9kb2xieShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRzcG0gKmhkc3BtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmICghc25kX2hkc3BtX3VzZV9pc19leGNsdXNpdmUoaGRzcG0pKQorCQlyZXR1cm4gLUVCVVNZOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgMTsKKwlzcGluX2xvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJY2hhbmdlID0gKGludCkgdmFsICE9IGhkc3BtX2RvbGJ5KGhkc3BtKTsKKwloZHNwbV9zZXRfZG9sYnkoaGRzcG0sIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworI2RlZmluZSBIRFNQTV9QUk9GRVNTSU9OQUwoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX3Byb2Zlc3Npb25hbCwgXAorICAuZ2V0ID0gc25kX2hkc3BtX2dldF9wcm9mZXNzaW9uYWwsIFwKKyAgLnB1dCA9IHNuZF9oZHNwbV9wdXRfcHJvZmVzc2lvbmFsIFwKK30KKworc3RhdGljIGludCBoZHNwbV9wcm9mZXNzaW9uYWwoc3RydWN0IGhkc3BtICogaGRzcG0pCit7CisJcmV0dXJuIChoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX1Byb2Zlc3Npb25hbCkgPyAxIDogMDsKK30KKworc3RhdGljIGludCBoZHNwbV9zZXRfcHJvZmVzc2lvbmFsKHN0cnVjdCBoZHNwbSAqIGhkc3BtLCBpbnQgZG9sKQoreworCWlmIChkb2wpCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1Byb2Zlc3Npb25hbDsKKwllbHNlCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQTV9Qcm9mZXNzaW9uYWw7CisJaGRzcG1fd3JpdGUoaGRzcG0sIEhEU1BNX2NvbnRyb2xSZWdpc3RlciwgaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX2luZm9fcHJvZmVzc2lvbmFsKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9nZXRfcHJvZmVzc2lvbmFsKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlzcGluX2xvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3BtX3Byb2Zlc3Npb25hbChoZHNwbSk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX3B1dF9wcm9mZXNzaW9uYWwoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoIXNuZF9oZHNwbV91c2VfaXNfZXhjbHVzaXZlKGhkc3BtKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDE7CisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCWNoYW5nZSA9IChpbnQpIHZhbCAhPSBoZHNwbV9wcm9mZXNzaW9uYWwoaGRzcG0pOworCWhkc3BtX3NldF9wcm9mZXNzaW9uYWwoaGRzcG0sIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKwogI2RlZmluZSBIRFNQTV9JTlBVVF9TRUxFQ1QoeG5hbWUsIHhpbmRleCkgXAogeyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAogICAubmFtZSA9IHhuYW1lLCBcCkBAIC0xOTEyLDYgKzIzMTcsMTYzIEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAorI2RlZmluZSBIRFNQTV9EU19XSVJFKHhuYW1lLCB4aW5kZXgpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIFwKKyAgLm5hbWUgPSB4bmFtZSwgXAorICAuaW5kZXggPSB4aW5kZXgsIFwKKyAgLmluZm8gPSBzbmRfaGRzcG1faW5mb19kc193aXJlLCBcCisgIC5nZXQgPSBzbmRfaGRzcG1fZ2V0X2RzX3dpcmUsIFwKKyAgLnB1dCA9IHNuZF9oZHNwbV9wdXRfZHNfd2lyZSBcCit9CisKK3N0YXRpYyBpbnQgaGRzcG1fZHNfd2lyZShzdHJ1Y3QgaGRzcG0gKiBoZHNwbSkKK3sKKwlyZXR1cm4gKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUE1fRFNfRG91YmxlV2lyZSkgPyAxIDogMDsKK30KKworc3RhdGljIGludCBoZHNwbV9zZXRfZHNfd2lyZShzdHJ1Y3QgaGRzcG0gKiBoZHNwbSwgaW50IGRzKQoreworCWlmIChkcykKKwkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUE1fRFNfRG91YmxlV2lyZTsKKwllbHNlCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQTV9EU19Eb3VibGVXaXJlOworCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9pbmZvX2RzX3dpcmUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyAiU2luZ2xlIiwgIkRvdWJsZSIgfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAyOworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCSAgICAgICB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcG1fZ2V0X2RzX3dpcmUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlzcGluX2xvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3BtX2RzX3dpcmUoaGRzcG0pOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9wdXRfZHNfd2lyZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoIXNuZF9oZHNwbV91c2VfaXNfZXhjbHVzaXZlKGhkc3BtKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDE7CisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCWNoYW5nZSA9IChpbnQpIHZhbCAhPSBoZHNwbV9kc193aXJlKGhkc3BtKTsKKwloZHNwbV9zZXRfZHNfd2lyZShoZHNwbSwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisjZGVmaW5lIEhEU1BNX1FTX1dJUkUoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX3FzX3dpcmUsIFwKKyAgLmdldCA9IHNuZF9oZHNwbV9nZXRfcXNfd2lyZSwgXAorICAucHV0ID0gc25kX2hkc3BtX3B1dF9xc193aXJlIFwKK30KKworc3RhdGljIGludCBoZHNwbV9xc193aXJlKHN0cnVjdCBoZHNwbSAqIGhkc3BtKQoreworCWlmIChoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX1FTX0RvdWJsZVdpcmUpCisJCXJldHVybiAxOworCWlmIChoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX1FTX1F1YWRXaXJlKQorCQlyZXR1cm4gMjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZHNwbV9zZXRfcXNfd2lyZShzdHJ1Y3QgaGRzcG0gKiBoZHNwbSwgaW50IG1vZGUpCit7CisJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfihIRFNQTV9RU19Eb3VibGVXaXJlIHwgSERTUE1fUVNfUXVhZFdpcmUpOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAxOgorCQloZHNwbS0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQTV9RU19Eb3VibGVXaXJlOworCQlicmVhazsKKwljYXNlIDI6CisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1FTX1F1YWRXaXJlOworCQlicmVhazsKKwl9CisJaGRzcG1fd3JpdGUoaGRzcG0sIEhEU1BNX2NvbnRyb2xSZWdpc3RlciwgaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX2luZm9fcXNfd2lyZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsgIlNpbmdsZSIsICJEb3VibGUiLCAiUXVhZCIgfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPQorCQkgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCSAgICAgICB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfaGRzcG1fZ2V0X3FzX3dpcmUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXNwaW5fbG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaGRzcG1fcXNfd2lyZShoZHNwbSk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX3B1dF9xc193aXJlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGNoYW5nZTsKKwlpbnQgdmFsOworCisJaWYgKCFzbmRfaGRzcG1fdXNlX2lzX2V4Y2x1c2l2ZShoZHNwbSkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJaWYgKHZhbCA8IDApCisJCXZhbCA9IDA7CisJaWYgKHZhbCA+IDIpCisJCXZhbCA9IDI7CisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCWNoYW5nZSA9IChpbnQpIHZhbCAhPSBoZHNwbV9xc193aXJlKGhkc3BtKTsKKwloZHNwbV9zZXRfcXNfd2lyZShoZHNwbSwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCiAvKiAgICAgICAgICAgU2ltcGxlIE1peGVyCiAgIGRlcHJlY2F0ZWQgc2luY2UgdG8gbXVjaCBmYWRlcnMgPz8/CiAgIE1JWEVSIGludGVyZmFjZSBzYXlzIG91dHB1dCAoc291cmNlLCBkZXN0aW5hdGlvbiwgdmFsdWUpCkBAIC0yMTM1LDE0ICsyNjk3LDI0IEBACiAKIHN0YXRpYyBpbnQgaGRzcG1fd2Nfc3luY19jaGVjayhzdHJ1Y3QgaGRzcG0gKiBoZHNwbSkKIHsKLQlpbnQgc3RhdHVzMiA9IGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX3N0YXR1c1JlZ2lzdGVyMik7Ci0JaWYgKHN0YXR1czIgJiBIRFNQTV93Y0xvY2spIHsKLQkJaWYgKHN0YXR1czIgJiBIRFNQTV93Y1N5bmMpCisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQlpbnQgc3RhdHVzID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIpOworCQlpZiAoc3RhdHVzICYgSERTUE1fQUVTMzJfd2NMb2NrKSB7CisJCQkvKiBJIGRvbid0IGtub3cgaG93IHRvIGRpZmZlcmVuY2lhdGUgc3luYyBmcm9tIGxvY2suCisJCQkgICBEb2luZyBhcyBpZiBzeW5jIGZvciBub3cgKi8KIAkJCXJldHVybiAyOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpbnQgc3RhdHVzMiA9IGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX3N0YXR1c1JlZ2lzdGVyMik7CisJCWlmIChzdGF0dXMyICYgSERTUE1fd2NMb2NrKSB7CisJCQlpZiAoc3RhdHVzMiAmIEhEU1BNX3djU3luYykKKwkJCQlyZXR1cm4gMjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc25kX2hkc3BtX2dldF93Y19zeW5jX2NoZWNrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtMjE4OCw5ICsyNzYwLDQzIEBACiB9CiAKIAorI2RlZmluZSBIRFNQTV9BRVNfU1lOQ19DSEVDSyh4bmFtZSwgeGluZGV4KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCisgIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZGV4ID0geGluZGV4LCBcCisgIC5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwgXAorICAuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX3N5bmNfY2hlY2ssIFwKKyAgLmdldCA9IHNuZF9oZHNwbV9nZXRfYWVzX3N5bmNfY2hlY2sgXAorfQorCitzdGF0aWMgaW50IGhkc3BtX2Flc19zeW5jX2NoZWNrKHN0cnVjdCBoZHNwbSAqIGhkc3BtLCBpbnQgaWR4KQoreworCWludCBzdGF0dXMyID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIyKTsKKwlpZiAoc3RhdHVzMiAmIChIRFNQTV9Mb2NrQUVTID4+IGlkeCkpIHsKKwkJLyogSSBkb24ndCBrbm93IGhvdyB0byBkaWZmZXJlbmNpYXRlIHN5bmMgZnJvbSBsb2NrLgorCQkgICBEb2luZyBhcyBpZiBzeW5jIGZvciBub3cgKi8KKwkJcmV0dXJuIDI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9nZXRfYWVzX3N5bmNfY2hlY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCBvZmZzZXQ7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCW9mZnNldCA9IHVjb250cm9sLT5pZC5pbmRleCAtIDE7CisJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IDgpCisJCXJldHVybiAtRUlOVkFMOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCWhkc3BtX2Flc19zeW5jX2NoZWNrKGhkc3BtLCBvZmZzZXQpOworCXJldHVybiAwOworfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaGRzcG1fY29udHJvbHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaGRzcG1fY29udHJvbHNfbWFkaVtdID0gewogCiAJSERTUE1fTUlYRVIoIk1peGVyIiwgMCksCiAvKiAnU2FtcGxlIENsb2NrIFNvdXJjZScgY29tcGxpZXMgd2l0aCB0aGUgYWxzYSBjb250cm9sIG5hbWluZyBzY2hlbWUgKi8KQEAgLTIyMTEsNiArMjgxNywyOSBAQAogCUhEU1BNX0lOUFVUX1NFTEVDVCgiSW5wdXQgU2VsZWN0IiwgMCksCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2hkc3BtX2NvbnRyb2xzX2FlczMyW10gPSB7CisKKwlIRFNQTV9NSVhFUigiTWl4ZXIiLCAwKSwKKy8qICdTYW1wbGUgQ2xvY2sgU291cmNlJyBjb21wbGllcyB3aXRoIHRoZSBhbHNhIGNvbnRyb2wgbmFtaW5nIHNjaGVtZSAqLworCUhEU1BNX0NMT0NLX1NPVVJDRSgiU2FtcGxlIENsb2NrIFNvdXJjZSIsIDApLAorCisJSERTUE1fU1lTVEVNX0NMT0NLX01PREUoIlN5c3RlbSBDbG9jayBNb2RlIiwgMCksCisJSERTUE1fUFJFRl9TWU5DX1JFRigiUHJlZmVycmVkIFN5bmMgUmVmZXJlbmNlIiwgMCksCisJSERTUE1fQVVUT1NZTkNfUkVGKCJBdXRvU3luYyBSZWZlcmVuY2UiLCAwKSwKKwlIRFNQTV9TWVNURU1fU0FNUExFX1JBVEUoIlN5c3RlbSBTYW1wbGUgUmF0ZSIsIDApLAorLyogJ0V4dGVybmFsIFJhdGUnIGNvbXBsaWVzIHdpdGggdGhlIGFsc2EgY29udHJvbCBuYW1pbmcgc2NoZW1lICovCisJSERTUE1fQVVUT1NZTkNfU0FNUExFX1JBVEUoIkV4dGVybmFsIFJhdGUiLCAwKSwKKwlIRFNQTV9XQ19TWU5DX0NIRUNLKCJXb3JkIENsb2NrIExvY2sgU3RhdHVzIiwgMCksCisvKglIRFNQTV9BRVNfU1lOQ19DSEVDSygiQUVTIExvY2sgU3RhdHVzIiwgMCksKi8gLyogY3JlYXRlZCBpbiBzbmRfaGRzcG1fY3JlYXRlX2NvbnRyb2xzKCkgKi8KKwlIRFNQTV9MSU5FX09VVCgiTGluZSBPdXQiLCAwKSwKKwlIRFNQTV9FTVBIQVNJUygiRW1waGFzaXMiLCAwKSwKKwlIRFNQTV9ET0xCWSgiTm9uIEF1ZGlvIiwgMCksCisJSERTUE1fUFJPRkVTU0lPTkFMKCJQcm9mZXNzaW9uYWwiLCAwKSwKKwlIRFNQTV9DX1RNUygiQ2xlYXIgVHJhY2sgTWFya2VyIiwgMCksCisJSERTUE1fRFNfV0lSRSgiRG91YmxlIFNwZWVkIFdpcmUgTW9kZSIsIDApLAorCUhEU1BNX1FTX1dJUkUoIlF1YWQgU3BlZWQgV2lyZSBNb2RlIiwgMCksCit9OworCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2hkc3BtX3BsYXliYWNrX21peGVyID0gSERTUE1fUExBWUJBQ0tfTUlYRVI7CiAKIApAQCAtMjI0NSwyMCArMjg3NCw0MCBAQAogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CiAKIAkvKiBhZGQgY29udHJvbCBsaXN0IGZpcnN0ICovCisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZXNfc3luY19jdGwgPQorCQkJSERTUE1fQUVTX1NZTkNfQ0hFQ0soIkFFUyBMb2NrIFN0YXR1cyIsIDApOwogCi0JZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9oZHNwbV9jb250cm9scyk7IGlkeCsrKSB7Ci0JCWlmICgoZXJyID0KLQkJICAgICBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0KLQkJCQkgc25kX2N0bF9uZXcxKCZzbmRfaGRzcG1fY29udHJvbHNbaWR4XSwKLQkJCQkJICAgICAgaGRzcG0pKSkgPCAwKSB7Ci0JCQlyZXR1cm4gZXJyOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2hkc3BtX2NvbnRyb2xzX2FlczMyKTsKKwkJICAgICBpZHgrKykgeworCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwKKwkJCQkJICBzbmRfY3RsX25ldzEoJnNuZF9oZHNwbV9jb250cm9sc19hZXMzMltpZHhdLAorCQkJCQkJICAgICAgIGhkc3BtKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWZvciAoaWR4ID0gMTsgaWR4IDw9IDg7IGlkeCsrKSB7CisJCQlhZXNfc3luY19jdGwuaW5kZXggPSBpZHg7CisJCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLAorCQkJCQkgIHNuZF9jdGxfbmV3MSgmYWVzX3N5bmNfY3RsLCBoZHNwbSkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfaGRzcG1fY29udHJvbHNfbWFkaSk7CisJCSAgICAgaWR4KyspIHsKKwkJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsCisJCQkJCSAgc25kX2N0bF9uZXcxKCZzbmRfaGRzcG1fY29udHJvbHNfbWFkaVtpZHhdLAorCQkJCQkJICAgICAgIGhkc3BtKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCiAJLyogQ2hhbm5lbCBwbGF5YmFjayBtaXhlciBhcyBkZWZhdWx0IGNvbnRyb2wgCi0JICAgTm90ZTogdGhlIHdob2xlIG1hdHJpeCB3b3VsZCBiZSAxMjgqSERTUE1fTUlYRVJfQ0hBTk5FTFMgRmFkZXJzLCB0aGF0cyB0b28gYmlnIGZvciBhbnkgYWxzYW1peGVyCi0JICAgdGhleSBhcmUgYWNjZXNpYmxlIHZpYSBzcGVjaWFsIElPQ1RMIG9uIGh3ZGVwCi0JICAgYW5kIHRoZSBtaXhlciAyZGltZW5zaW9uYWwgbWl4ZXIgY29udHJvbCAqLworTm90ZTogdGhlIHdob2xlIG1hdHJpeCB3b3VsZCBiZSAxMjgqSERTUE1fTUlYRVJfQ0hBTk5FTFMgRmFkZXJzLCB0aGF0cyB0b28gYmlnIGZvciBhbnkgYWxzYW1peGVyCit0aGV5IGFyZSBhY2Nlc2libGUgdmlhIHNwZWNpYWwgSU9DVEwgb24gaHdkZXAKK2FuZCB0aGUgbWl4ZXIgMmRpbWVuc2lvbmFsIG1peGVyIGNvbnRyb2wgKi8KIAogCXNuZF9oZHNwbV9wbGF5YmFja19taXhlci5uYW1lID0gIkNobiI7CiAJbGltaXQgPSBIRFNQTV9NQVhfQ0hBTk5FTFM7CkBAIC0yMjg5LDcgKzI5MzgsOCBAQAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyB2b2lkCi1zbmRfaGRzcG1fcHJvY19yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqIGVudHJ5LCBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCitzbmRfaGRzcG1fcHJvY19yZWFkX21hZGkoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICogZW50cnksCisJCQkgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQogewogCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSAoc3RydWN0IGhkc3BtICopIGVudHJ5LT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKQEAgLTI0MjAsMTEgKzMwNzAsMTAgQEAKIAkJY2xvY2tfc291cmNlID0gIkVycm9yIjsKIAl9CiAJc25kX2lwcmludGYoYnVmZmVyLCAiU2FtcGxlIENsb2NrIFNvdXJjZTogJXNcbiIsIGNsb2NrX3NvdXJjZSk7Ci0JaWYgKCEoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9DbG9ja01vZGVNYXN0ZXIpKSB7CisJaWYgKCEoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9DbG9ja01vZGVNYXN0ZXIpKQogCQlzeXN0ZW1fY2xvY2tfbW9kZSA9ICJTbGF2ZSI7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXN5c3RlbV9jbG9ja19tb2RlID0gIk1hc3RlciI7Ci0JfQogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlN5c3RlbSBDbG9jayBNb2RlOiAlc1xuIiwgc3lzdGVtX2Nsb2NrX21vZGUpOwogCiAJc3dpdGNoIChoZHNwbV9wcmVmX3N5bmNfcmVmKGhkc3BtKSkgewpAQCAtMjQ4NCwxMyArMzEzMywyMTMgQEAKIAlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOwogfQogCitzdGF0aWMgdm9pZAorc25kX2hkc3BtX3Byb2NfcmVhZF9hZXMzMihzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKiBlbnRyeSwKKwkJCSAgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQoreworCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSAoc3RydWN0IGhkc3BtICopIGVudHJ5LT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzMjsKKwl1bnNpZ25lZCBpbnQgdGltZWNvZGU7CisJaW50IHByZWZfc3luY3JlZjsKKwljaGFyICphdXRvc3luY19yZWY7CisJY2hhciAqc3lzdGVtX2Nsb2NrX21vZGU7CisJY2hhciAqY2xvY2tfc291cmNlOworCWludCB4OworCisJc3RhdHVzID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fc3RhdHVzUmVnaXN0ZXIpOworCXN0YXR1czIgPSBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9zdGF0dXNSZWdpc3RlcjIpOworCXRpbWVjb2RlID0gaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fdGltZWNvZGVSZWdpc3Rlcik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICIlcyAoQ2FyZCAjJWQpIFJldi4leFxuIiwKKwkJICAgIGhkc3BtLT5jYXJkX25hbWUsIGhkc3BtLT5jYXJkLT5udW1iZXIgKyAxLAorCQkgICAgaGRzcG0tPmZpcm13YXJlX3Jldik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJJUlE6ICVkIFJlZ2lzdGVycyBidXM6IDB4JWx4IFZNOiAweCVseFxuIiwKKwkJICAgIGhkc3BtLT5pcnEsIGhkc3BtLT5wb3J0LCAodW5zaWduZWQgbG9uZyloZHNwbS0+aW9iYXNlKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIi0tLSBTeXN0ZW0gLS0tXG4iKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwKKwkJICAgICJJUlEgUGVuZGluZzogQXVkaW89JWQsIE1JREkwPSVkLCBNSURJMT0lZCwgSVJRY291bnQ9JWRcbiIsCisJCSAgICBzdGF0dXMgJiBIRFNQTV9hdWRpb0lSUVBlbmRpbmcsCisJCSAgICAoc3RhdHVzICYgSERTUE1fbWlkaTBJUlFQZW5kaW5nKSA/IDEgOiAwLAorCQkgICAgKHN0YXR1cyAmIEhEU1BNX21pZGkxSVJRUGVuZGluZykgPyAxIDogMCwKKwkJICAgIGhkc3BtLT5pcnFfY291bnQpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwKKwkJICAgICJIVyBwb2ludGVyOiBpZCA9ICVkLCByYXdwdHIgPSAlZCAoJWQtPiVkKSBlc3RpbWF0ZWQ9ICVsZCAoYnl0ZXMpXG4iLAorCQkgICAgKChzdGF0dXMgJiBIRFNQTV9CdWZmZXJJRCkgPyAxIDogMCksCisJCSAgICAoc3RhdHVzICYgSERTUE1fQnVmZmVyUG9zaXRpb25NYXNrKSwKKwkJICAgIChzdGF0dXMgJiBIRFNQTV9CdWZmZXJQb3NpdGlvbk1hc2spICUgKDIgKgorCQkJCQkJCSAgIChpbnQpaGRzcG0tPgorCQkJCQkJCSAgIHBlcmlvZF9ieXRlcyksCisJCSAgICAoKHN0YXR1cyAmIEhEU1BNX0J1ZmZlclBvc2l0aW9uTWFzaykgLQorCQkgICAgIDY0KSAlICgyICogKGludCloZHNwbS0+cGVyaW9kX2J5dGVzKSwKKwkJICAgIChsb25nKSBoZHNwbV9od19wb2ludGVyKGhkc3BtKSAqIDQpOworCisJc25kX2lwcmludGYoYnVmZmVyLAorCQkgICAgIk1JREkgRklGTzogT3V0MT0weCV4LCBPdXQyPTB4JXgsIEluMT0weCV4LCBJbjI9MHgleCBcbiIsCisJCSAgICBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9taWRpU3RhdHVzT3V0MCkgJiAweEZGLAorCQkgICAgaGRzcG1fcmVhZChoZHNwbSwgSERTUE1fbWlkaVN0YXR1c091dDEpICYgMHhGRiwKKwkJICAgIGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX21pZGlTdGF0dXNJbjApICYgMHhGRiwKKwkJICAgIGhkc3BtX3JlYWQoaGRzcG0sIEhEU1BNX21pZGlTdGF0dXNJbjEpICYgMHhGRik7CisJc25kX2lwcmludGYoYnVmZmVyLAorCQkgICAgIlJlZ2lzdGVyOiBjdHJsMT0weCV4LCBjdHJsMj0weCV4LCBzdGF0dXMxPTB4JXgsIHN0YXR1czI9MHgleCwgdGltZWNvZGU9MHgleFxuIiwKKwkJICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyLCBoZHNwbS0+Y29udHJvbDJfcmVnaXN0ZXIsCisJCSAgICBzdGF0dXMsIHN0YXR1czIsIHRpbWVjb2RlKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIi0tLSBTZXR0aW5ncyAtLS1cbiIpOworCisJeCA9IDEgPDwgKDYgKworCQkgIGhkc3BtX2RlY29kZV9sYXRlbmN5KGhkc3BtLT4KKwkJCQkgICAgICAgY29udHJvbF9yZWdpc3RlciAmCisJCQkJICAgICAgIEhEU1BNX0xhdGVuY3lNYXNrKSk7CisKKwlzbmRfaXByaW50ZihidWZmZXIsCisJCSAgICAiU2l6ZSAoTGF0ZW5jeSk6ICVkIHNhbXBsZXMgKDIgcGVyaW9kcyBvZiAlbHUgYnl0ZXMpXG4iLAorCQkgICAgeCwgKHVuc2lnbmVkIGxvbmcpIGhkc3BtLT5wZXJpb2RfYnl0ZXMpOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiTGluZSBvdXQ6ICVzLCAgIFByZWNpc2UgUG9pbnRlcjogJXNcbiIsCisJCSAgICAoaGRzcG0tPgorCQkgICAgIGNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9MaW5lT3V0KSA/ICJvbiAiIDogIm9mZiIsCisJCSAgICAoaGRzcG0tPnByZWNpc2VfcHRyKSA/ICJvbiIgOiAib2ZmIik7CisKKwlzbmRfaXByaW50ZihidWZmZXIsCisJCSAgICAiQ2xlYXJUcmFja01hcmtlciAlcywgRW1waGFzaXMgJXMsIERvbGJ5ICVzXG4iLAorCQkgICAgKGhkc3BtLT4KKwkJICAgICBjb250cm9sX3JlZ2lzdGVyICYgSERTUE1fY2xyX3RtcykgPyAib24iIDogIm9mZiIsCisJCSAgICAoaGRzcG0tPgorCQkgICAgIGNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9FbXBoYXNpcykgPyAib24iIDogIm9mZiIsCisJCSAgICAoaGRzcG0tPgorCQkgICAgIGNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9Eb2xieSkgPyAib24iIDogIm9mZiIpOworCisJc3dpdGNoIChoZHNwbV9jbG9ja19zb3VyY2UoaGRzcG0pKSB7CisJY2FzZSBIRFNQTV9DTE9DS19TT1VSQ0VfQVVUT1NZTkM6CisJCWNsb2NrX3NvdXJjZSA9ICJBdXRvU3luYyI7CisJCWJyZWFrOworCWNhc2UgSERTUE1fQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzMyS0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgMzIga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQTV9DTE9DS19TT1VSQ0VfSU5URVJOQUxfNDRfMUtIWjoKKwkJY2xvY2tfc291cmNlID0gIkludGVybmFsIDQ0LjEga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQTV9DTE9DS19TT1VSQ0VfSU5URVJOQUxfNDhLSFo6CisJCWNsb2NrX3NvdXJjZSA9ICJJbnRlcm5hbCA0OCBrSHoiOworCQlicmVhazsKKwljYXNlIEhEU1BNX0NMT0NLX1NPVVJDRV9JTlRFUk5BTF82NEtIWjoKKwkJY2xvY2tfc291cmNlID0gIkludGVybmFsIDY0IGtIeiI7CisJCWJyZWFrOworCWNhc2UgSERTUE1fQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzg4XzJLSFo6CisJCWNsb2NrX3NvdXJjZSA9ICJJbnRlcm5hbCA4OC4yIGtIeiI7CisJCWJyZWFrOworCWNhc2UgSERTUE1fQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzk2S0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgOTYga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQTV9DTE9DS19TT1VSQ0VfSU5URVJOQUxfMTI4S0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgMTI4IGtIeiI7CisJCWJyZWFrOworCWNhc2UgSERTUE1fQ0xPQ0tfU09VUkNFX0lOVEVSTkFMXzE3Nl80S0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgMTc2LjQga0h6IjsKKwkJYnJlYWs7CisJY2FzZSBIRFNQTV9DTE9DS19TT1VSQ0VfSU5URVJOQUxfMTkyS0haOgorCQljbG9ja19zb3VyY2UgPSAiSW50ZXJuYWwgMTkyIGtIeiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNsb2NrX3NvdXJjZSA9ICJFcnJvciI7CisJfQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlNhbXBsZSBDbG9jayBTb3VyY2U6ICVzXG4iLCBjbG9ja19zb3VyY2UpOworCWlmICghKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUE1fQ2xvY2tNb2RlTWFzdGVyKSkKKwkJc3lzdGVtX2Nsb2NrX21vZGUgPSAiU2xhdmUiOworCWVsc2UKKwkJc3lzdGVtX2Nsb2NrX21vZGUgPSAiTWFzdGVyIjsKKwlzbmRfaXByaW50ZihidWZmZXIsICJTeXN0ZW0gQ2xvY2sgTW9kZTogJXNcbiIsIHN5c3RlbV9jbG9ja19tb2RlKTsKKworCXByZWZfc3luY3JlZiA9IGhkc3BtX3ByZWZfc3luY19yZWYoaGRzcG0pOworCWlmIChwcmVmX3N5bmNyZWYgPT0gMCkKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiUHJlZmVycmVkIFN5bmMgUmVmZXJlbmNlOiBXb3JkIENsb2NrXG4iKTsKKwllbHNlCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlByZWZlcnJlZCBTeW5jIFJlZmVyZW5jZTogQUVTJWRcbiIsCisJCQkJcHJlZl9zeW5jcmVmKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlN5c3RlbSBDbG9jayBGcmVxdWVuY3k6ICVkXG4iLAorCQkgICAgaGRzcG0tPnN5c3RlbV9zYW1wbGVfcmF0ZSk7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJEb3VibGUgc3BlZWQ6ICVzXG4iLAorCQkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9EU19Eb3VibGVXaXJlPworCQkJIkRvdWJsZSB3aXJlIiA6ICJTaW5nbGUgd2lyZSIpOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlF1YWQgc3BlZWQ6ICVzXG4iLAorCQkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9RU19Eb3VibGVXaXJlPworCQkJIkRvdWJsZSB3aXJlIiA6CisJCQloZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX1FTX1F1YWRXaXJlPworCQkJIlF1YWQgd2lyZSIgOiAiU2luZ2xlIHdpcmUiKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIi0tLSBTdGF0dXM6XG4iKTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIldvcmQ6ICVzICBGcmVxdWVuY3k6ICVkXG4iLAorCQkJKHN0YXR1cyAmIEhEU1BNX0FFUzMyX3djTG9jayk/ICJTeW5jICAgIiA6ICJObyBMb2NrIiwKKwkJCUhEU1BNX2JpdDJmcmVxKChzdGF0dXMgPj4gSERTUE1fQUVTMzJfd2NGcmVxX2JpdCkgJiAweEYpKTsKKworCWZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiQUVTJWQ6ICVzICBGcmVxdWVuY3k6ICVkXG4iLAorCQkJCXgrMSwKKwkJCQkoc3RhdHVzMiAmIChIRFNQTV9Mb2NrQUVTID4+IHgpKT8gIlN5bmMgICAiOiAiTm8gTG9jayIsCisJCQkJSERTUE1fYml0MmZyZXEoKHRpbWVjb2RlID4+ICg0KngpKSAmIDB4RikpOworCX0KKworCXN3aXRjaCAoaGRzcG1fYXV0b3N5bmNfcmVmKGhkc3BtKSkgeworCWNhc2UgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9OT05FOiBhdXRvc3luY19yZWY9Ik5vbmUiOyBicmVhazsKKwljYXNlIEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fV09SRDogYXV0b3N5bmNfcmVmPSJXb3JkIENsb2NrIjsgYnJlYWs7CisJY2FzZSBIRFNQTV9BRVMzMl9BVVRPU1lOQ19GUk9NX0FFUzE6IGF1dG9zeW5jX3JlZj0iQUVTMSI7IGJyZWFrOworCWNhc2UgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVMyOiBhdXRvc3luY19yZWY9IkFFUzIiOyBicmVhazsKKwljYXNlIEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fQUVTMzogYXV0b3N5bmNfcmVmPSJBRVMzIjsgYnJlYWs7CisJY2FzZSBIRFNQTV9BRVMzMl9BVVRPU1lOQ19GUk9NX0FFUzQ6IGF1dG9zeW5jX3JlZj0iQUVTNCI7IGJyZWFrOworCWNhc2UgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM1OiBhdXRvc3luY19yZWY9IkFFUzUiOyBicmVhazsKKwljYXNlIEhEU1BNX0FFUzMyX0FVVE9TWU5DX0ZST01fQUVTNjogYXV0b3N5bmNfcmVmPSJBRVM2IjsgYnJlYWs7CisJY2FzZSBIRFNQTV9BRVMzMl9BVVRPU1lOQ19GUk9NX0FFUzc6IGF1dG9zeW5jX3JlZj0iQUVTNyI7IGJyZWFrOworCWNhc2UgSERTUE1fQUVTMzJfQVVUT1NZTkNfRlJPTV9BRVM4OiBhdXRvc3luY19yZWY9IkFFUzgiOyBicmVhazsKKwlkZWZhdWx0OiBhdXRvc3luY19yZWYgPSAiLS0tIjsgYnJlYWs7CisJfQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkF1dG9TeW5jIHJlZiA9ICVzXG4iLCBhdXRvc3luY19yZWYpOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19TTkRfREVCVUcKK3N0YXRpYyB2b2lkCitzbmRfaGRzcG1fcHJvY19yZWFkX2RlYnVnKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqIGVudHJ5LAorCQkJICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IChzdHJ1Y3QgaGRzcG0gKillbnRyeS0+cHJpdmF0ZV9kYXRhOworCisJaW50IGosaTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTYgLyogMTAyNCo2NCAqLzsgaSArPSBqKQorCXsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiMHglMDhYOiAiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDQpCisJCQlzbmRfaXByaW50ZihidWZmZXIsICIlMDhYICIsIGhkc3BtX3JlYWQoaGRzcG0sIGkgKyBqKSk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CisJfQorfQorI2VuZGlmCisKKworCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX2hkc3BtX3Byb2NfaW5pdChzdHJ1Y3QgaGRzcG0gKiBoZHNwbSkKIHsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCFzbmRfY2FyZF9wcm9jX25ldyhoZHNwbS0+Y2FyZCwgImhkc3BtIiwgJmVudHJ5KSkKIAkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBoZHNwbSwKLQkJCQkgICAgICBzbmRfaGRzcG1fcHJvY19yZWFkKTsKKwkJCQkgICAgICBoZHNwbS0+aXNfYWVzMzIgPworCQkJCSAgICAgIHNuZF9oZHNwbV9wcm9jX3JlYWRfYWVzMzIgOgorCQkJCSAgICAgIHNuZF9oZHNwbV9wcm9jX3JlYWRfbWFkaSk7CisjaWZkZWYgQ09ORklHX1NORF9ERUJVRworCS8qIGRlYnVnIGZpbGUgdG8gcmVhZCBhbGwgaGRzcG0gcmVnaXN0ZXJzICovCisJaWYgKCFzbmRfY2FyZF9wcm9jX25ldyhoZHNwbS0+Y2FyZCwgImRlYnVnIiwgJmVudHJ5KSkKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBoZHNwbSwKKwkJCQlzbmRfaGRzcG1fcHJvY19yZWFkX2RlYnVnKTsKKyNlbmRpZgogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjUwNywxMyArMzM1NiwyMCBAQAogCiAJLyogc2V0IGRlZmF1bHRzOiAgICAgICAqLwogCi0JaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgPSBIRFNQTV9DbG9ja01vZGVNYXN0ZXIgfAkvKiBNYXN0ZXIgQ2xvYWNrIE1vZGUgb24gKi8KLQkgICAgaGRzcG1fZW5jb2RlX2xhdGVuY3koNykgfAkvKiBsYXRlbmN5IG1heGltdW0gPSA4MTkyIHNhbXBsZXMgKi8KLQkgICAgSERTUE1fSW5wdXRDb2F4aWFsIHwJLyogSW5wdXQgQ29heCBub3QgT3B0aWNhbCAqLwotCSAgICBIRFNQTV9TeW5jUmVmX01BREkgfAkvKiBNYWRpIGlzIHN5bmNjbG9jayAqLwotCSAgICBIRFNQTV9MaW5lT3V0IHwJLyogQW5hbG9nIG91dHB1dCBpbiAqLwotCSAgICBIRFNQTV9UWF82NGNoIHwJLyogdHJhbnNtaXQgaW4gNjRjaCBtb2RlICovCi0JICAgIEhEU1BNX0F1dG9JbnA7CS8qIEF1dG9JbnB1dCBjaG9zc2luZyAodGFrZW92ZXIpICovCisJaWYgKGhkc3BtLT5pc19hZXMzMikKKwkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgPSBIRFNQTV9DbG9ja01vZGVNYXN0ZXIgfAkvKiBNYXN0ZXIgQ2xvYWNrIE1vZGUgb24gKi8KKwkJCWhkc3BtX2VuY29kZV9sYXRlbmN5KDcpIHwJLyogbGF0ZW5jeSBtYXhpbXVtID0gODE5MiBzYW1wbGVzICovCisJCQlIRFNQTV9TeW5jUmVmMCB8CS8qIEFFUzEgaXMgc3luY2Nsb2NrICovCisJCQlIRFNQTV9MaW5lT3V0IHwJLyogQW5hbG9nIG91dHB1dCBpbiAqLworCQkJSERTUE1fUHJvZmVzc2lvbmFsOyAgLyogUHJvZmVzc2lvbmFsIG1vZGUgKi8KKwllbHNlCisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyID0gSERTUE1fQ2xvY2tNb2RlTWFzdGVyIHwJLyogTWFzdGVyIENsb2FjayBNb2RlIG9uICovCisJCQloZHNwbV9lbmNvZGVfbGF0ZW5jeSg3KSB8CS8qIGxhdGVuY3kgbWF4aW11bSA9IDgxOTIgc2FtcGxlcyAqLworCQkJSERTUE1fSW5wdXRDb2F4aWFsIHwJLyogSW5wdXQgQ29heCBub3QgT3B0aWNhbCAqLworCQkJSERTUE1fU3luY1JlZl9NQURJIHwJLyogTWFkaSBpcyBzeW5jY2xvY2sgKi8KKwkJCUhEU1BNX0xpbmVPdXQgfAkvKiBBbmFsb2cgb3V0cHV0IGluICovCisJCQlIRFNQTV9UWF82NGNoIHwJLyogdHJhbnNtaXQgaW4gNjRjaCBtb2RlICovCisJCQlIRFNQTV9BdXRvSW5wOwkvKiBBdXRvSW5wdXQgY2hvc3NpbmcgKHRha2VvdmVyKSAqLwogCiAJLyogISBIRFNQTV9GcmVxdWVuY3kwfEhEU1BNX0ZyZXF1ZW5jeTEgPSA0NC4xa2h6ICovCiAJLyogISAgSERTUE1fRG91YmxlU3BlZWQgSERTUE1fUXVhZFNwZWVkID0gbm9ybWFsIHNwZWVkICovCkBAIC0yODIyLDYgKzM2NzgsOCBAQAogCiAJCWhkc3BtLT5wbGF5YmFja19idWZmZXIgPQogCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYTsKKwkJc25kX3ByaW50ZGQoIkFsbG9jYXRlZCBzYW1wbGUgYnVmZmVyIGZvciBwbGF5YmFjayBhdCAlcFxuIiwKKwkJCQloZHNwbS0+cGxheWJhY2tfYnVmZmVyKTsKIAl9IGVsc2UgewogCQloZHNwbV9zZXRfc2didWYoaGRzcG0sIHNnYnVmLCBIRFNQTV9wYWdlQWRkcmVzc0J1ZmZlckluLAogCQkJCXBhcmFtc19jaGFubmVscyhwYXJhbXMpKTsKQEAgLTI4MzEsNyArMzY4OSwxNSBAQAogCiAJCWhkc3BtLT5jYXB0dXJlX2J1ZmZlciA9CiAJCSAgICAodW5zaWduZWQgY2hhciAqKSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhOworCQlzbmRfcHJpbnRkZCgiQWxsb2NhdGVkIHNhbXBsZSBidWZmZXIgZm9yIGNhcHR1cmUgYXQgJXBcbiIsCisJCQkJaGRzcG0tPmNhcHR1cmVfYnVmZmVyKTsKIAl9CisJLyoKKwkgICBzbmRfcHJpbnRkZCgiQWxsb2NhdGVkIHNhbXBsZSBidWZmZXIgZm9yICVzIGF0IDB4JTA4WFxuIiwKKwkgICBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8KKwkgICAicGxheWJhY2siIDogImNhcHR1cmUiLAorCSAgIHNuZF9wY21fc2didWZfZ2V0X2FkZHIoc2didWYsIDApKTsKKwkgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjk4Miw5ICszODQ4LDEwIEBACiAJCSAgU05EUlZfUENNX1JBVEVfNDQxMDAgfAogCQkgIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKIAkJICBTTkRSVl9QQ01fUkFURV82NDAwMCB8Ci0JCSAgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCksCisJCSAgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCSAgU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwICksCiAJLnJhdGVfbWluID0gMzIwMDAsCi0JLnJhdGVfbWF4ID0gOTYwMDAsCisJLnJhdGVfbWF4ID0gMTkyMDAwLAogCS5jaGFubmVsc19taW4gPSAxLAogCS5jaGFubmVsc19tYXggPSBIRFNQTV9NQVhfQ0hBTk5FTFMsCiAJLmJ1ZmZlcl9ieXRlc19tYXggPQpAQCAtMzAwNiw5ICszODczLDEwIEBACiAJCSAgU05EUlZfUENNX1JBVEVfNDQxMDAgfAogCQkgIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKIAkJICBTTkRSVl9QQ01fUkFURV82NDAwMCB8Ci0JCSAgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCksCisJCSAgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCSAgU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwKSwKIAkucmF0ZV9taW4gPSAzMjAwMCwKLQkucmF0ZV9tYXggPSA5NjAwMCwKKwkucmF0ZV9tYXggPSAxOTIwMDAsCiAJLmNoYW5uZWxzX21pbiA9IDEsCiAJLmNoYW5uZWxzX21heCA9IEhEU1BNX01BWF9DSEFOTkVMUywKIAkuYnVmZmVyX2J5dGVzX21heCA9CkBAIC0zMzE1LDcgKzQxODMsOCBAQAogCiAJcGNtID0gaGRzcG0tPnBjbTsKIAotCXdhbnRlZCA9IEhEU1BNX0RNQV9BUkVBX0JZVEVTICsgNDA5NjsJLyogZG9udCBrbm93IHdoeSwgYnV0IGl0IHdvcmtzICovCisvKgl3YW50ZWQgPSBIRFNQTV9ETUFfQVJFQV9CWVRFUyArIDQwOTY7Ki8JLyogZG9udCBrbm93IHdoeSwgYnV0IGl0IHdvcmtzICovCisJd2FudGVkID0gSERTUE1fRE1BX0FSRUFfQllURVM7CiAKIAlpZiAoKGVyciA9CiAJICAgICBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwKQEAgLTM0NjcsOSArNDMzNiwxNiBAQAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGhkc3BtLT5wY2ksCiAJCQkgICAgIFBDSV9DTEFTU19SRVZJU0lPTiwgJmhkc3BtLT5maXJtd2FyZV9yZXYpOwogCi0Jc3RyY3B5KGNhcmQtPmRyaXZlciwgIkhEU1BNIik7CisJaGRzcG0tPmlzX2FlczMyID0gKGhkc3BtLT5maXJtd2FyZV9yZXYgPj0gSERTUE1fQUVTUkVWSVNJT04pOworCiAJc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgIlhpbGlueCBGUEdBIik7Ci0JaGRzcG0tPmNhcmRfbmFtZSA9ICJSTUUgSERTUE0gTUFESSI7CisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiSERTUEFFUzMyIik7CisJCWhkc3BtLT5jYXJkX25hbWUgPSAiUk1FIEhEU1BNIEFFUzMyIjsKKwl9IGVsc2UgeworCQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiSERTUE0iKTsKKwkJaGRzcG0tPmNhcmRfbmFtZSA9ICJSTUUgSERTUE0gTUFESSI7CisJfQogCiAJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpKSA8IDApCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCmluZGV4IDQ3NGYyZDQuLjNiZmYzMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCkBAIC0yNjI3LDcgKzI2MjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfZ3ZvbCwgLTYzNzUsIDI1LCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9ndm9sLCAtNjM3NSwgMjUsIDApOwogCiBzdGF0aWMgaW50IHNuZF90cmlkZW50X3ZvbF9jb250cm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCkBAIC0yODQ0LDcgKzI4NDQsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9jcnZvbCwgLTMxNzUsIDI1LCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9jcnZvbCwgLTMxNzUsIDI1LCAxKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF90cmlkZW50X3BjbV9ydm9sX2NvbnRyb2wgX19kZXZpbml0ZGF0YSA9CiB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCBhNTcyYjAxLi5hMjg5OTIyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTE2OTksNyArMTY5OSw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2R4cywgLTk0NTAsIDE1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfZHhzLCAtOTQ1MCwgMTUwLCAxKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92aWE4MjMzX3BjbWR4c192b2x1bWVfY29udHJvbCBfX2RldmluaXRkYXRhID0gewogCS5uYW1lID0gIlBDTSBQbGF5YmFjayBWb2x1bWUiLApAQCAtMTgyMyw3ICsxODIzLDcgQEAKIAlhYzk3LnByaXZhdGVfZGF0YSA9IGNoaXA7CiAJYWM5Ny5wcml2YXRlX2ZyZWUgPSBzbmRfdmlhODJ4eF9taXhlcl9mcmVlX2FjOTc7CiAJYWM5Ny5wY2kgPSBjaGlwLT5wY2k7Ci0JYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX01PREVNOworCWFjOTcuc2NhcHMgPSBBQzk3X1NDQVBfU0tJUF9NT0RFTSB8IEFDOTdfU0NBUF9QT1dFUl9TQVZFOwogCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIoY2hpcC0+YWM5N19idXMsICZhYzk3LCAmY2hpcC0+YWM5NykpIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMjM1Nyw5MyArMjM1Nyw1OSBAQAogLyoKICAqIGF1dG8gZGV0ZWN0aW9uIG9mIERYUyBjaGFubmVsIHN1cHBvcnRzLgogICovCi1zdHJ1Y3QgZHhzX3doaXRlbGlzdCB7Ci0JdW5zaWduZWQgc2hvcnQgc3VidmVuZG9yOwotCXVuc2lnbmVkIHNob3J0IHN1YmRldmljZTsgCi0JdW5zaWduZWQgc2hvcnQgbWFzazsgCi0Jc2hvcnQgYWN0aW9uOwkvKiBuZXcgZHhzX3N1cHBvcnQgdmFsdWUgKi8KKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGR4c193aGl0ZWxpc3RbXSBfX2RldmluaXRkYXRhID0geworCVNORF9QQ0lfUVVJUksoMHgxMDA1LCAweDQ3MTAsICJBdmFuY2UgTG9naWMgTW9ibyIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHgwOTk2LCAiRVNDIE1vYm8iLCBWSUFfRFhTXzQ4SyksCisJU05EX1BDSV9RVUlSSygweDEwMTksIDB4MGE4MSwgIkVDUyBLN1ZUQTMgdjguMCIsIFZJQV9EWFNfTk9fVlJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHgwYTg1LCAiRUNTIEw3Vk1NMiIsIFZJQV9EWFNfTk9fVlJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMCwgIkVTQyBLOCIsIFZJQV9EWFNfU1JDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAxOSwgMHhhYTAxLCAiRVNDIEs4VDg5MC1BIiwgVklBX0RYU19TUkMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwMzMsICJBY2VyIEluc3BpcmUgMTM1M0xNIiwgVklBX0RYU19OT19WUkEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAwNDYsICJBY2VyIEFzcGlyZSAxNTI0IFdMTWkiLCBWSUFfRFhTX1NSQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDAsICJBU1VTIEE3L0E4IiwgVklBX0RYU19OT19WUkEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDcxLCAwLCAiRGl2ZXJzZSBOb3RlYm9vayIsIFZJQV9EWFNfTk9fVlJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTBjZiwgMHgxMThlLCAiRlNDIExhcHRvcCIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTEwNiwgMCwgIkFTUm9jayIsIFZJQV9EWFNfU1JDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTI5NywgMHhhMjMyLCAiU2h1dHRsZSIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTI5NywgMHhjMTYwLCAiU2h1dHRsZSBTazQxRyIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhhMDAyLCAiR2lnYWJ5dGUgR0EtN1ZBWFAiLCBWSUFfRFhTX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MzgwMCwgIk1TSSBLVDI2NiIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MTIwLCAiTVNJIEtUNFYiLCBWSUFfRFhTX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzE0MiwgIk1TSSBLOE1NLVYiLCBWSUFfRFhTX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE0NjIsIDAsICJNU0kgTW9ibyIsIFZJQV9EWFNfU1JDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ3YiwgMHgxNDAxLCAiQUJJVCBLRDcoLVJBSUQpIiwgVklBX0RYU19FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNDdiLCAweDE0MTEsICJBQklUIFZBLTIwIiwgVklBX0RYU19FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNDdiLCAweDE0MTMsICJBQklUIEtWOCBQcm8iLCBWSUFfRFhTX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE0N2IsIDB4MTQxNSwgIkFCSVQgQVY4IiwgVklBX0RYU19OT19WUkEpLAorCVNORF9QQ0lfUVVJUksoMHgxNGZmLCAweDA0MDMsICJUd2luaGVhZCBtb2JvIiwgVklBX0RYU19FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNGZmLCAweDA0MDgsICJUd2luaGVhZCBsYXB0b3AiLCBWSUFfRFhTX1NSQyksCisJU05EX1BDSV9RVUlSSygweDE1NTgsIDB4NDcwMSwgIkNsZXZvIEQ0NzAiLCBWSUFfRFhTX1NSQyksCisJU05EX1BDSV9RVUlSSygweDE1ODQsIDB4ODEyMCwgIkRpdmVyc2UgTGFwdG9wIiwgVklBX0RYU19FTkFCTEUpLAorCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDgxMjMsICJUYXJnYS9Vbml3aWxsIiwgVklBX0RYU19OT19WUkEpLAorCVNORF9QQ0lfUVVJUksoMHgxNjFmLCAweDIwMmIsICJBbWlyYSBOb3RlYm9vayIsIFZJQV9EWFNfTk9fVlJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTYxZiwgMHgyMDMyLCAibTY4MHggbWFjaGluZXMiLCBWSUFfRFhTXzQ4SyksCisJU05EX1BDSV9RVUlSSygweDE2MzEsIDB4ZTAwNCwgIlBCIEVhc3lOb3RlIDMxNzQiLCBWSUFfRFhTX0VOQUJMRSksCisJU05EX1BDSV9RVUlSSygweDE2OTUsIDB4MzAwNSwgIkVQb1ggRVAtOEs5QSIsIFZJQV9EWFNfRU5BQkxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTY5NSwgMCwgIkVQb1ggbW9ibyIsIFZJQV9EWFNfU1JDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTZmMywgMCwgIkpldHdheSBLOCIsIFZJQV9EWFNfU1JDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTczNCwgMCwgIkZTQyBMYXB0b3AiLCBWSUFfRFhTX1NSQyksCisJU05EX1BDSV9RVUlSSygweDE4NDksIDB4MzA1OSwgIkFTUm9jayBLN1ZNMiIsIFZJQV9EWFNfTk9fVlJBKSwKKwlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMCwgIkFTUm9jayBtb2JvIiwgVklBX0RYU19TUkMpLAorCVNORF9QQ0lfUVVJUksoMHgxOTE5LCAweDIwMGEsICJTb2x0ZWsgU0wtSzgiLCAgVklBX0RYU19OT19WUkEpLAorCVNORF9QQ0lfUVVJUksoMHg0MDA1LCAweDQ3MTAsICJNU0kgSzdUMjY2IiwgVklBX0RYU19TUkMpLAorCXsgfSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjaGVja19keHNfbGlzdChzdHJ1Y3QgcGNpX2RldiAqcGNpLCBpbnQgcmV2aXNpb24pCiB7Ci0Jc3RhdGljIHN0cnVjdCBkeHNfd2hpdGVsaXN0IHdoaXRlbGlzdFtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JCXsgLnN1YnZlbmRvciA9IDB4MTAwNSwgLnN1YmRldmljZSA9IDB4NDcxMCwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEF2YW5jZSBMb2dpYyBNb2JvICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTAxOSwgLnN1YmRldmljZSA9IDB4MDk5NiwgLmFjdGlvbiA9IFZJQV9EWFNfNDhLIH0sCi0JCXsgLnN1YnZlbmRvciA9IDB4MTAxOSwgLnN1YmRldmljZSA9IDB4MGE4MSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEVDUyBLN1ZUQTMgdjguMCAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwMTksIC5zdWJkZXZpY2UgPSAweDBhODUsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBFQ1MgTDdWTU0yICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTAxOSwgLnN1YmRldmljZSA9IDB4YTEwMSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sCi0JCXsgLnN1YnZlbmRvciA9IDB4MTAxOSwgLnN1YmRldmljZSA9IDB4YWEwMSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEVDUyBLOFQ4OTAtQSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwMjUsIC5zdWJkZXZpY2UgPSAweDAwMzMsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBBY2VyIEluc3BpcmUgMTM1M0xNICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTAyNSwgLnN1YmRldmljZSA9IDB4MDA0NiwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEFjZXIgQXNwaXJlIDE1MjQgV0xNaSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwNDMsIC5zdWJkZXZpY2UgPSAweDgwOTUsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBBU1VTIEE3VjhYIChGSVhNRTogcG9zc2libHkgVklBX0RYU19FTkFCTEU/KSovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTA0MywgLnN1YmRldmljZSA9IDB4ODBhMSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFTVVMgQTdWOC1YICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTA0MywgLnN1YmRldmljZSA9IDB4ODBiMCwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFTVVMgQTdWNjAwICYgSzhWKi8gCi0JCXsgLnN1YnZlbmRvciA9IDB4MTA0MywgLnN1YmRldmljZSA9IDB4ODEwZCwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEFTVVMgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxMDQzLCAuc3ViZGV2aWNlID0gMHg4MTJhLCAuYWN0aW9uID0gVklBX0RYU19TUkMgICAgfSwgLyogQVNVUyBBOFYgRGVsdXhlICovIAotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwNDMsIC5zdWJkZXZpY2UgPSAweDgxNzQsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyAgICB9LCAvKiBBU1VTICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTA0MywgLnN1YmRldmljZSA9IDB4ODFiOSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDICAgIH0sIC8qIEFTVVMgQThWLU1YICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTA3MSwgLnN1YmRldmljZSA9IDB4ODM3NSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIFZvYmlzL1lha3Vtby9NaXRhYyBub3RlYm9vayAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwNzEsIC5zdWJkZXZpY2UgPSAweDgzOTksIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBVbWF4IEFCIDU5NVQgKFZJQSBLOE44MDBBIC0gVlQ4MjM3KSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEwY2YsIC5zdWJkZXZpY2UgPSAweDExOGUsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBGU0MgbGFwdG9wICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTEwNiwgLnN1YmRldmljZSA9IDB4NDE2MSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFTUm9jayBLN1ZUMiAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDExMDYsIC5zdWJkZXZpY2UgPSAweDQ1NTIsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBRREkgS3Vkb3ogN1gvNjAwLTZBTCAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDExMDYsIC5zdWJkZXZpY2UgPSAweGFhMDEsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBFUElBIE1JSSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDExMDYsIC5zdWJkZXZpY2UgPSAweGMwMDEsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBJbnNpZ2h0IFA0LUlUWCAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDEyOTcsIC5zdWJkZXZpY2UgPSAweGEyMzIsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBTaHV0dGxlID8/ICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTI5NywgLnN1YmRldmljZSA9IDB4YzE2MCwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIFNodXR0bGUgU0s0MUcgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDU4LCAuc3ViZGV2aWNlID0gMHhhMDAyLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogR2lnYWJ5dGUgR0EtN1ZBWFAgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHgwMDgwLCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogTVNJIEs4VCBOZW8tRklTMlIgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHgwNDMwLCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogTVNJIDcxNDIgKEs4TU0tVikgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHgwNDcwLCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogTVNJIEtUODgwIERlbHRhLUZTUiAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweDM4MDAsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBNU0kgS1QyNjYgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHg1OTAxLCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogTVNJIEtUNiBEZWx0YS1TUiAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweDcwMjMsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBNU0kgSzhUIE5lbzItRkkgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHg3MTIwLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogTVNJIEtUNFYgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHg3MTQyLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogTVNJIEs4TU0tViAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweGIwMTIsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBQNE04MDAvVklBODIzN1IgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDdiLCAuc3ViZGV2aWNlID0gMHgxNDAxLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogQUJJVCBLRDcoLVJBSUQpICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTQ3YiwgLnN1YmRldmljZSA9IDB4MTQxMSwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIEFCSVQgVkEtMjAgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNDdiLCAuc3ViZGV2aWNlID0gMHgxNDEzLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogQUJJVCBLVjggUHJvICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTQ3YiwgLnN1YmRldmljZSA9IDB4MTQxNSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIEFiaXQgQVY4ICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTRmZiwgLnN1YmRldmljZSA9IDB4MDQwMywgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIFR3aW5oZWFkIG1vYm8gKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNGZmLCAuc3ViZGV2aWNlID0gMHgwNDA4LCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogVHdpbmhlYWQgbGFwdG9wICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTU1OCwgLnN1YmRldmljZSA9IDB4NDcwMSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIENsZXZvIEQ0NzAgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNTg0LCAuc3ViZGV2aWNlID0gMHg4MTIwLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogR2VyaWNvbS9UYXJnYS9Wb2Jpcy9Vbml3aWxsIGxhcHRvcCAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE1ODQsIC5zdWJkZXZpY2UgPSAweDgxMjMsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBVbml3aWxsIChUYXJnYSBWaXNpb25hcnkgWFAtMjEwKSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE2MWYsIC5zdWJkZXZpY2UgPSAweDIwMmIsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBBbWlyYSBOb3RlIGJvb2sgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNjFmLCAuc3ViZGV2aWNlID0gMHgyMDMyLCAuYWN0aW9uID0gVklBX0RYU180OEsgfSwgLyogbTY4MHggbWFjaGluZXMgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNjMxLCAuc3ViZGV2aWNlID0gMHhlMDA0LCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogRWFzeSBOb3RlIDMxNzQsIFBhY2thcmQgQmVsbCAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE2OTUsIC5zdWJkZXZpY2UgPSAweDMwMDUsIC5hY3Rpb24gPSBWSUFfRFhTX0VOQUJMRSB9LCAvKiBFUG9YIEVQLThLOUEgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNjk1LCAuc3ViZGV2aWNlID0gMHgzMDBjLCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogRVBvWCBFUC04S1JBSSAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE2OTUsIC5zdWJkZXZpY2UgPSAweDMwMGUsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBFUG9YIDlIRUFJICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTZmMywgLnN1YmRldmljZSA9IDB4NjQwNSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEpldHdheSBLOE04TVMgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxNzM0LCAuc3ViZGV2aWNlID0gMHgxMDc4LCAuYWN0aW9uID0gVklBX0RYU19TUkMgfSwgLyogRlNDIEFtaWxvIEw3MzAwICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTczNCwgLnN1YmRldmljZSA9IDB4MTA5MywgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEZTQyAqLwotCQl7IC5zdWJ2ZW5kb3IgPSAweDE3MzQsIC5zdWJkZXZpY2UgPSAweDEwYWIsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBGU0MgKi8KLQkJeyAuc3VidmVuZG9yID0gMHgxODQ5LCAuc3ViZGV2aWNlID0gMHgzMDU5LCAuYWN0aW9uID0gVklBX0RYU19OT19WUkEgfSwgLyogQVNSb2NrIEs3Vk0yICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTg0OSwgLnN1YmRldmljZSA9IDB4OTczOSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEFTUm9jayBtb2JvKD8pICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTg0OSwgLnN1YmRldmljZSA9IDB4OTc2MSwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sIC8qIEFTUm9jayBtb2JvKD8pICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTkxOSwgLnN1YmRldmljZSA9IDB4MjAwYSwgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIFNvbHRlayBTTC1LOFRwcm8tOTM5ICovCi0JCXsgLnN1YnZlbmRvciA9IDB4NDAwNSwgLnN1YmRldmljZSA9IDB4NDcxMCwgLmFjdGlvbiA9IFZJQV9EWFNfU1JDIH0sCS8qIE1TSSBLN1QyNjYgUHJvMiAoTVMtNjM4MCBWMi4wKSBCSU9TIDMuNyAqLwotCQl7IH0gLyogdGVybWluYXRvciAqLwotCX07Ci0JY29uc3Qgc3RydWN0IGR4c193aGl0ZWxpc3QgKnc7Ci0JdW5zaWduZWQgc2hvcnQgc3Vic3lzdGVtX3ZlbmRvcjsKLQl1bnNpZ25lZCBzaG9ydCBzdWJzeXN0ZW1fZGV2aWNlOworCWNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICp3OwogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnN5c3RlbV92ZW5kb3IpOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJnN1YnN5c3RlbV9kZXZpY2UpOwotCi0JZm9yICh3ID0gd2hpdGVsaXN0OyB3LT5zdWJ2ZW5kb3I7IHcrKykgewotCQlpZiAody0+c3VidmVuZG9yICE9IHN1YnN5c3RlbV92ZW5kb3IpCi0JCQljb250aW51ZTsKLQkJaWYgKHctPm1hc2spIHsKLQkJCWlmICgody0+bWFzayAmIHN1YnN5c3RlbV9kZXZpY2UpID09IHctPnN1YmRldmljZSkKLQkJCQlyZXR1cm4gdy0+YWN0aW9uOwotCQl9IGVsc2UgewotCQkJaWYgKHN1YnN5c3RlbV9kZXZpY2UgPT0gdy0+c3ViZGV2aWNlKQotCQkJCXJldHVybiB3LT5hY3Rpb247Ci0JCX0KKwl3ID0gc25kX3BjaV9xdWlya19sb29rdXAocGNpLCBkeHNfd2hpdGVsaXN0KTsKKwlpZiAodykgeworCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gInZpYTgyeHg6IERYUyB3aGl0ZSBsaXN0IGZvciAlcyBmb3VuZFxuIiwKKwkJCSAgICB3LT5uYW1lKTsKKwkJcmV0dXJuIHctPnZhbHVlOwogCX0KIAogCS8qIGZvciBuZXdlciByZXZpc2lvbiwgZGVmYXVsdCB0byBEWFNfU1JDICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwppbmRleCAxN2Q2Yjg0Li5iMzM4ZTE1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKQEAgLTkwMCw3ICs5MDAsNyBAQAogCWFjOTcucHJpdmF0ZV9kYXRhID0gY2hpcDsKIAlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF92aWE4Mnh4X21peGVyX2ZyZWVfYWM5NzsKIAlhYzk3LnBjaSA9IGNoaXAtPnBjaTsKLQlhYzk3LnNjYXBzID0gQUM5N19TQ0FQX1NLSVBfQVVESU87CisJYWM5Ny5zY2FwcyA9IEFDOTdfU0NBUF9TS0lQX0FVRElPIHwgQUM5N19TQ0FQX1BPV0VSX1NBVkU7CiAJYWM5Ny5udW0gPSBjaGlwLT5hYzk3X3NlY29uZGFyeTsKIAogCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIoY2hpcC0+YWM5N19idXMsICZhYzk3LCAmY2hpcC0+YWM5NykpIDwgMCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92eDIyMi92eDIyMi5jIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKaW5kZXggODlmNThlYS4uNDc0ZWFjOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKKysrIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKQEAgLTczLDggKzczLDggQEAKIC8qCiAgKi8KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX29sZF92b2wsIC0xMTM1MCwgNTAsIDApOwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2FrbSwgLTczNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9vbGRfdm9sLCAtMTEzNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9ha20sIC03MzUwLCA1MCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3Z4X2hhcmR3YXJlIHZ4MjIyX29sZF9odyA9IHsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyX29wcy5jIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyX29wcy5jCmluZGV4IDVlNTE5NTAuLjU1NTU4YmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS92eDIyMi92eDIyMl9vcHMuYworKysgYi9zb3VuZC9wY2kvdngyMjIvdngyMjJfb3BzLmMKQEAgLTg0Niw3ICs4NDYsNyBAQAogCiAjZGVmaW5lIE1JQ19MRVZFTF9NQVgJMHhmZgogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfbWljLCAtNjQ1MCwgNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX21pYywgLTY0NTAsIDUwLCAwKTsKIAogLyoKICAqIGNvbnRyb2xzIEFQSSBmb3IgaW5wdXQgbGV2ZWxzCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9pbWFnZS5oIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfaW1hZ2UuaAppbmRleCAxYjA3NDY5Li4xMTJmMmZmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9pbWFnZS5oCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX2ltYWdlLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9IV01DT0RFXwogI2RlZmluZSBfSFdNQ09ERV8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgRHNwSW5zdFtZRFNYR19EU1BMRU5HVEggLyA0XSA9IHsKK3N0YXRpYyB1MzIgRHNwSW5zdFtZRFNYR19EU1BMRU5HVEggLyA0XSA9IHsKIAkweDAwMDAwMDgxLCAweDAwMDAwMWE0LCAweDAwMDAwMDBhLCAweDAwMDAwMDJmLAogCTB4MDAwODAyNTMsIDB4MDE4MDAzMTcsIDB4MDAwMDQwN2IsIDB4MDAwMDg0M2YsCiAJMHgwMDAxNDgzYywgMHgwMDAxOTQzYywgMHgwMDA1ZDgzYywgMHgwMDAwMWMzYywKQEAgLTEyLDcgKzEyLDcgQEAKIAkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBDbnRybEluc3RbWURTWEdfQ1RSTExFTkdUSCAvIDRdID0geworc3RhdGljIHUzMiBDbnRybEluc3RbWURTWEdfQ1RSTExFTkdUSCAvIDRdID0gewogCTB4MDAwMDA3LCAweDI0MDAwNywgMHgwQzAwMDcsIDB4MUMwMDA3LAogCTB4MDYwMDA3LCAweDcwMDAwMiwgMHgwMDAwMjAsIDB4MDMwMDQwLAogCTB4MDA3MTA0LCAweDAwNDI4NiwgMHgwMzAwNDAsIDB4MDAwRjBELApAQCAtNzkxLDcgKzc5MSw3IEBACiAvLyAwNC8wOSAgY3JlYXQKIC8vIDA0LzEyICBzdG9wIG5pc2UgZml4CiAvLyAwNi8yMSAgV29ya2luZ09mZiB0aW1taW5nCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBDbnRybEluc3QxRVtZRFNYR19DVFJMTEVOR1RIIC8gNF0gPSB7CitzdGF0aWMgdTMyIENudHJsSW5zdDFFW1lEU1hHX0NUUkxMRU5HVEggLyA0XSA9IHsKIAkweDAwMDAwNywgMHgyNDAwMDcsIDB4MEMwMDA3LCAweDFDMDAwNywKIAkweDA2MDAwNywgMHg3MDAwMDIsIDB4MDAwMDIwLCAweDAzMDA0MCwKIAkweDAwNzEwNCwgMHgwMDQyODYsIDB4MDMwMDQwLCAweDAwMEYwRCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwppbmRleCA3ODgxOTQ0Li5mZDEyNjc0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKKysrIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCkBAIC0yLDEyICsyLDYgQEAKICAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KICAqICBSb3V0aW5lcyBmb3IgY29udHJvbCBvZiBZTUY3MjQvNzQwLzc0NC83NTQgY2hpcHMKICAqCi0gKiAgQlVHUzoKLSAqICAgIC0tCi0gKgotICogIFRPRE86Ci0gKiAgICAtLQotICoKICAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKQEAgLTI2LDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC00MiwxMCArMzcsNyBAQAogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLS8qCi0gKiAgY29uc3RhbnRzCi0gKi8KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKIC8qCiAgKiAgY29tbW9uIEkvTyByb3V0aW5lcwpAQCAtMTc5LDYgKzE3MSwxNyBAQAogCXJldHVybiB2YWxbMF07CiB9CiAKK3N0YXRpYyB2b2lkIHNuZF95bWZwY2lfcGNtXzQ0MV92b2x1bWVfc2V0KHN0cnVjdCBzbmRfeW1mcGNpX3BjbSAqeXBjbSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJc3RydWN0IHNuZF95bWZwY2lfcGNtX21peGVyICptaXhlcjsKKwkKKwltaXhlciA9ICZ5cGNtLT5jaGlwLT5wY21fbWl4ZXJbeXBjbS0+c3Vic3RyZWFtLT5udW1iZXJdOworCXZhbHVlID0gbWluX3QodW5zaWduZWQgaW50LCBtaXhlci0+bGVmdCwgMHg3ZmZmKSA+PiAxOworCXZhbHVlIHw9IChtaW5fdCh1bnNpZ25lZCBpbnQsIG1peGVyLT5yaWdodCwgMHg3ZmZmKSA+PiAxKSA8PCAxNjsKKwlzbmRfeW1mcGNpX3dyaXRlbCh5cGNtLT5jaGlwLCBZRFNYR1JfQlVGNDQxT1VUVk9MLCB2YWx1ZSk7Cit9CisKIC8qCiAgKiAgSGFyZHdhcmUgc3RhcnQgbWFuYWdlbWVudAogICovCkBAIC0yOTAsNiArMjkzLDEwIEBACiAJc25kX2Fzc2VydChwdm9pY2UgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwogCXNuZF95bWZwY2lfaHdfc3RvcChjaGlwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+dm9pY2VfbG9jaywgZmxhZ3MpOworCWlmIChwdm9pY2UtPm51bWJlciA9PSBjaGlwLT5zcmM0NDFfdXNlZCkgeworCQljaGlwLT5zcmM0NDFfdXNlZCA9IC0xOworCQlwdm9pY2UtPnlwY20tPnVzZV80NDFfc2xvdCA9IDA7CisJfQogCXB2b2ljZS0+dXNlID0gcHZvaWNlLT5wY20gPSBwdm9pY2UtPnN5bnRoID0gcHZvaWNlLT5taWRpID0gMDsKIAlwdm9pY2UtPnlwY20gPSBOVUxMOwogCXB2b2ljZS0+aW50ZXJydXB0ID0gTlVMTDsKQEAgLTM5NCw3ICs0MDEsNyBAQAogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKIAkJY2hpcC0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMF0tPm51bWJlciArIDFdID0gY3B1X3RvX2xlMzIoeXBjbS0+dm9pY2VzWzBdLT5iYW5rX2FkZHIpOwotCQlpZiAoeXBjbS0+dm9pY2VzWzFdICE9IE5VTEwpCisJCWlmICh5cGNtLT52b2ljZXNbMV0gIT0gTlVMTCAmJiAheXBjbS0+dXNlXzQ0MV9zbG90KQogCQkJY2hpcC0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMV0tPm51bWJlciArIDFdID0gY3B1X3RvX2xlMzIoeXBjbS0+dm9pY2VzWzFdLT5iYW5rX2FkZHIpOwogCQl5cGNtLT5ydW5uaW5nID0gMTsKIAkJYnJlYWs7CkBAIC00MDIsNyArNDA5LDcgQEAKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgogCQljaGlwLT5jdHJsX3BsYXliYWNrW3lwY20tPnZvaWNlc1swXS0+bnVtYmVyICsgMV0gPSAwOwotCQlpZiAoeXBjbS0+dm9pY2VzWzFdICE9IE5VTEwpCisJCWlmICh5cGNtLT52b2ljZXNbMV0gIT0gTlVMTCAmJiAheXBjbS0+dXNlXzQ0MV9zbG90KQogCQkJY2hpcC0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMV0tPm51bWJlciArIDFdID0gMDsKIAkJeXBjbS0+cnVubmluZyA9IDA7CiAJCWJyZWFrOwpAQCAtNDg5LDYgKzQ5Niw3IEBACiAJdW5zaWduZWQgaW50IG5iYW5rOwogCXUzMiB2b2xfbGVmdCwgdm9sX3JpZ2h0OwogCXU4IHVzZV9sZWZ0LCB1c2VfcmlnaHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNuZF9hc3NlcnQodm9pY2UgIT0gTlVMTCwgcmV0dXJuKTsKIAlpZiAocnVudGltZS0+Y2hhbm5lbHMgPT0gMSkgewpAQCAtNTA3LDExICs1MTUsMjcgQEAKIAkJdm9sX2xlZnQgPSBjcHVfdG9fbGUzMigweDQwMDAwMDAwKTsKIAkJdm9sX3JpZ2h0ID0gY3B1X3RvX2xlMzIoMHg0MDAwMDAwMCk7CiAJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZ5cGNtLT5jaGlwLT52b2ljZV9sb2NrLCBmbGFncyk7CiAJZm9ybWF0ID0gcnVudGltZS0+Y2hhbm5lbHMgPT0gMiA/IDB4MDAwMTAwMDAgOiAwOwogCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDgpCiAJCWZvcm1hdCB8PSAweDgwMDAwMDAwOworCWVsc2UgaWYgKHlwY20tPmNoaXAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NTQgJiYKKwkJIHJ1bnRpbWUtPnJhdGUgPT0gNDQxMDAgJiYgcnVudGltZS0+Y2hhbm5lbHMgPT0gMiAmJgorCQkgdm9pY2VpZHggPT0gMCAmJiAoeXBjbS0+Y2hpcC0+c3JjNDQxX3VzZWQgPT0gLTEgfHwKKwkJCQkgICB5cGNtLT5jaGlwLT5zcmM0NDFfdXNlZCA9PSB2b2ljZS0+bnVtYmVyKSkgeworCQl5cGNtLT5jaGlwLT5zcmM0NDFfdXNlZCA9IHZvaWNlLT5udW1iZXI7CisJCXlwY20tPnVzZV80NDFfc2xvdCA9IDE7CisJCWZvcm1hdCB8PSAweDEwMDAwMDAwOworCQlzbmRfeW1mcGNpX3BjbV80NDFfdm9sdW1lX3NldCh5cGNtKTsKKwl9CisJaWYgKHlwY20tPmNoaXAtPnNyYzQ0MV91c2VkID09IHZvaWNlLT5udW1iZXIgJiYKKwkgICAgKGZvcm1hdCAmIDB4MTAwMDAwMDApID09IDApIHsKKwkJeXBjbS0+Y2hpcC0+c3JjNDQxX3VzZWQgPSAtMTsKKwkJeXBjbS0+dXNlXzQ0MV9zbG90ID0gMDsKKwl9CiAJaWYgKHJ1bnRpbWUtPmNoYW5uZWxzID09IDIgJiYgKHZvaWNlaWR4ICYgMSkgIT0gMCkKIAkJZm9ybWF0IHw9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeXBjbS0+Y2hpcC0+dm9pY2VfbG9jaywgZmxhZ3MpOwogCWZvciAobmJhbmsgPSAwOyBuYmFuayA8IDI7IG5iYW5rKyspIHsKIAkJYmFuayA9ICZ2b2ljZS0+YmFua1tuYmFua107CiAJCW1lbXNldChiYW5rLCAwLCBzaXplb2YoKmJhbmspKTsKQEAgLTE0ODAsNyArMTUwNCw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIERFQ0xBUkVfVExWX0RCX0xJTkVBUihkYl9zY2FsZV9uYXRpdmUsIFRMVl9EQl9HQUlOX01VVEUsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihkYl9zY2FsZV9uYXRpdmUsIFRMVl9EQl9HQUlOX01VVEUsIDApOwogCiAjZGVmaW5lIFlNRlBDSV9ET1VCTEUoeG5hbWUsIHhpbmRleCwgcmVnKSBcCiB7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSB4aW5kZXgsIFwKQEAgLTE3MjIsNyArMTc0NiwxMCBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+dm9pY2VfbG9jaywgZmxhZ3MpOwogCQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lICYmIHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKSB7CiAJCQlzdHJ1Y3Qgc25kX3ltZnBjaV9wY20gKnlwY20gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQkJCXlwY20tPnVwZGF0ZV9wY21fdm9sID0gMjsKKwkJCWlmICgheXBjbS0+dXNlXzQ0MV9zbG90KQorCQkJCXlwY20tPnVwZGF0ZV9wY21fdm9sID0gMjsKKwkJCWVsc2UKKwkJCQlzbmRfeW1mcGNpX3BjbV80NDFfdm9sdW1lX3NldCh5cGNtKTsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT52b2ljZV9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAxOwpAQCAtMTk3MSwxMyArMTk5OCw5NCBAQAogCX0KIH0KIAorI2RlZmluZSBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisKKyNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisKICNpbmNsdWRlICJ5bWZwY2lfaW1hZ2UuaCIKIAorc3RhdGljIHN0cnVjdCBmaXJtd2FyZSBzbmRfeW1mcGNpX2RzcF9taWNyb2NvZGUgPSB7CisJLnNpemUgPSBZRFNYR19EU1BMRU5HVEgsCisJLmRhdGEgPSAodTggKilEc3BJbnN0LAorfTsKK3N0YXRpYyBzdHJ1Y3QgZmlybXdhcmUgc25kX3ltZnBjaV9jb250cm9sbGVyX21pY3JvY29kZSA9IHsKKwkuc2l6ZSA9IFlEU1hHX0NUUkxMRU5HVEgsCisJLmRhdGEgPSAodTggKilDbnRybEluc3QsCit9Oworc3RhdGljIHN0cnVjdCBmaXJtd2FyZSBzbmRfeW1mcGNpX2NvbnRyb2xsZXJfMWVfbWljcm9jb2RlID0geworCS5zaXplID0gWURTWEdfQ1RSTExFTkdUSCwKKwkuZGF0YSA9ICh1OCAqKUNudHJsSW5zdDFFLAorfTsKKyNlbmRpZgorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX3ltZnBjaV9jb252ZXJ0X2Zyb21fbGUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykgeyB9CisjZWxzZQorc3RhdGljIHZvaWQgc25kX3ltZnBjaV9jb252ZXJ0X2Zyb21fbGUoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3sKKwlpbnQgaTsKKwl1MzIgKmRhdGEgPSAodTMyICopZnctPmRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnctPnNpemUgLyA0OyArK2kpCisJCWxlMzJfdG9fY3B1cygmZGF0YVtpXSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzbmRfeW1mcGNpX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IHNuZF95bWZwY2kgKmNoaXApCit7CisJaW50IGVyciwgaXNfMWU7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmNoaXAtPmRzcF9taWNyb2NvZGUsICJ5YW1haGEvZHMxX2RzcC5mdyIsCisJCQkgICAgICAgJmNoaXAtPnBjaS0+ZGV2KTsKKwlpZiAoZXJyID49IDApIHsKKwkJaWYgKGNoaXAtPmRzcF9taWNyb2NvZGUtPnNpemUgPT0gWURTWEdfRFNQTEVOR1RIKQorCQkJc25kX3ltZnBjaV9jb252ZXJ0X2Zyb21fbGUoY2hpcC0+ZHNwX21pY3JvY29kZSk7CisJCWVsc2UgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRFNQIG1pY3JvY29kZSBoYXMgd3Jvbmcgc2l6ZVxuIik7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJfQorCWlmIChlcnIgPCAwKSB7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCQljaGlwLT5kc3BfbWljcm9jb2RlID0gJnNuZF95bWZwY2lfZHNwX21pY3JvY29kZTsKKyNlbHNlCisJCXJldHVybiBlcnI7CisjZW5kaWYKKwl9CisJaXNfMWUgPSBjaGlwLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9ZQU1BSEFfNzI0RiB8fAorCQljaGlwLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9ZQU1BSEFfNzQwQyB8fAorCQljaGlwLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9ZQU1BSEFfNzQ0IHx8CisJCWNoaXAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NTQ7CisJbmFtZSA9IGlzXzFlID8gInlhbWFoYS9kczFlX2N0cmwuZnciIDogInlhbWFoYS9kczFfY3RybC5mdyI7CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmY2hpcC0+Y29udHJvbGxlcl9taWNyb2NvZGUsIG5hbWUsCisJCQkgICAgICAgJmNoaXAtPnBjaS0+ZGV2KTsKKwlpZiAoZXJyID49IDApIHsKKwkJaWYgKGNoaXAtPmNvbnRyb2xsZXJfbWljcm9jb2RlLT5zaXplID09IFlEU1hHX0NUUkxMRU5HVEgpCisJCQlzbmRfeW1mcGNpX2NvbnZlcnRfZnJvbV9sZShjaGlwLT5jb250cm9sbGVyX21pY3JvY29kZSk7CisJCWVsc2UgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY29udHJvbGxlciBtaWNyb2NvZGUiCisJCQkJICAgIiBoYXMgd3Jvbmcgc2l6ZVxuIik7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJfQorCWlmIChlcnIgPCAwKSB7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCQljaGlwLT5jb250cm9sbGVyX21pY3JvY29kZSA9CisJCQlpc18xZSA/ICZzbmRfeW1mcGNpX2NvbnRyb2xsZXJfMWVfbWljcm9jb2RlCisJCQkgICAgICA6ICZzbmRfeW1mcGNpX2NvbnRyb2xsZXJfbWljcm9jb2RlOworI2Vsc2UKKwkJcmV0dXJuIGVycjsKKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgc25kX3ltZnBjaV9kb3dubG9hZF9pbWFnZShzdHJ1Y3Qgc25kX3ltZnBjaSAqY2hpcCkKIHsKIAlpbnQgaTsKIAl1MTYgY3RybDsKLQl1bnNpZ25lZCBsb25nICppbnN0OworCXUzMiAqaW5zdDsKIAogCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9OQVRJVkVEQUNPVVRWT0wsIDB4MDAwMDAwMDApOwogCXNuZF95bWZwY2lfZGlzYWJsZV9kc3AoY2hpcCk7CkBAIC0xOTkyLDIxICsyMTAwLDEyIEBACiAJc25kX3ltZnBjaV93cml0ZXcoY2hpcCwgWURTWEdSX0dMT0JBTENUUkwsIGN0cmwgJiB+MHgwMDA3KTsKIAogCS8qIHNldHVwIERTUCBpbnN0cnVjdGlvbiBjb2RlICovCisJaW5zdCA9ICh1MzIgKiljaGlwLT5kc3BfbWljcm9jb2RlLT5kYXRhOwogCWZvciAoaSA9IDA7IGkgPCBZRFNYR19EU1BMRU5HVEggLyA0OyBpKyspCi0JCXNuZF95bWZwY2lfd3JpdGVsKGNoaXAsIFlEU1hHUl9EU1BJTlNUUkFNICsgKGkgPDwgMiksIERzcEluc3RbaV0pOworCQlzbmRfeW1mcGNpX3dyaXRlbChjaGlwLCBZRFNYR1JfRFNQSU5TVFJBTSArIChpIDw8IDIpLCBpbnN0W2ldKTsKIAogCS8qIHNldHVwIGNvbnRyb2wgaW5zdHJ1Y3Rpb24gY29kZSAqLwotCXN3aXRjaCAoY2hpcC0+ZGV2aWNlX2lkKSB7Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83MjRGOgotCWNhc2UgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzQwQzoKLQljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0NDoKLQljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc1NDoKLQkJaW5zdCA9IENudHJsSW5zdDFFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbnN0ID0gQ250cmxJbnN0OwotCQlicmVhazsKLQl9CisJaW5zdCA9ICh1MzIgKiljaGlwLT5jb250cm9sbGVyX21pY3JvY29kZS0+ZGF0YTsKIAlmb3IgKGkgPSAwOyBpIDwgWURTWEdfQ1RSTExFTkdUSCAvIDQ7IGkrKykKIAkJc25kX3ltZnBjaV93cml0ZWwoY2hpcCwgWURTWEdSX0NUUkxJTlNUUkFNICsgKGkgPDwgMiksIGluc3RbaV0pOwogCkBAIC0yMTYwLDYgKzIyNTksMTUgQEAKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoY2hpcC0+cGNpLCAweDQwLCBjaGlwLT5vbGRfbGVnYWN5X2N0cmwpOwogCQogCXBjaV9kaXNhYmxlX2RldmljZShjaGlwLT5wY2kpOworI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKwlpZiAoY2hpcC0+ZHNwX21pY3JvY29kZSAhPSAmc25kX3ltZnBjaV9kc3BfbWljcm9jb2RlKQorI2VuZGlmCisJCXJlbGVhc2VfZmlybXdhcmUoY2hpcC0+ZHNwX21pY3JvY29kZSk7CisjaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorCWlmIChjaGlwLT5jb250cm9sbGVyX21pY3JvY29kZSAhPSAmc25kX3ltZnBjaV9jb250cm9sbGVyX21pY3JvY29kZSAmJgorCSAgICBjaGlwLT5jb250cm9sbGVyX21pY3JvY29kZSAhPSAmc25kX3ltZnBjaV9jb250cm9sbGVyXzFlX21pY3JvY29kZSkKKyNlbmRpZgorCQlyZWxlYXNlX2Zpcm13YXJlKGNoaXAtPmNvbnRyb2xsZXJfbWljcm9jb2RlKTsKIAlrZnJlZShjaGlwKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIxODAsNyArMjI4OCw3IEBACiAJWURTWEdSX1BSSUFEQ0xPT1BWT0wsCiAJWURTWEdSX05BVElWRURBQ0lOVk9MLAogCVlEU1hHUl9OQVRJVkVEQUNPVVRWT0wsCi0JLy8gWURTWEdSX0JVRjQ0MU9VVFZPTCwKKwlZRFNYR1JfQlVGNDQxT1VUVk9MLAogCVlEU1hHUl9OQVRJVkVBRENJTlZPTCwKIAlZRFNYR1JfU1BESUZMT09QVk9MLAogCVlEU1hHUl9TUERJRk9VVFZPTCwKQEAgLTIyOTUsNiArMjQwMyw3IEBACiAJY2hpcC0+cmVnX2FyZWFfcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOwogCWNoaXAtPnJlZ19hcmVhX3ZpcnQgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+cmVnX2FyZWFfcGh5cywgMHg4MDAwKTsKIAlwY2lfc2V0X21hc3RlcihwY2kpOworCWNoaXAtPnNyYzQ0MV91c2VkID0gLTE7CiAKIAlpZiAoKGNoaXAtPnJlc19yZWdfYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihjaGlwLT5yZWdfYXJlYV9waHlzLCAweDgwMDAsICJZTUZQQ0kiKSkgPT0gTlVMTCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBtZW1vcnkgcmVnaW9uIDB4JWx4LTB4JWx4XG4iLCBjaGlwLT5yZWdfYXJlYV9waHlzLCBjaGlwLT5yZWdfYXJlYV9waHlzICsgMHg4MDAwIC0gMSk7CkBAIC0yMzE1LDYgKzI0MjQsMTIgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCisJZXJyID0gc25kX3ltZnBjaV9yZXF1ZXN0X2Zpcm13YXJlKGNoaXApOworCWlmIChlcnIgPCAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImZpcm13YXJlIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJc25kX3ltZnBjaV9mcmVlKGNoaXApOworCQlyZXR1cm4gZXJyOworCX0KIAlzbmRfeW1mcGNpX2Rvd25sb2FkX2ltYWdlKGNoaXApOwogCiAJdWRlbGF5KDEwMCk7IC8qIHNlZW1zIHdlIG5lZWQgYSBkZWxheSBhZnRlciBkb3dubG9hZGluZyBpbWFnZS4uICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwX21peGVyLmMgYi9zb3VuZC9wY21jaWEvdngvdnhwX21peGVyLmMKaW5kZXggYmNlZDdiNi4uMmIxZjk5NiAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3Z4L3Z4cF9taXhlci5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBfbWl4ZXIuYwpAQCAtNjQsNyArNjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfbWljLCAtMjEsIDMsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX21pYywgLTIxLCAzLCAwKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZ4X2NvbnRyb2xfbWljX2xldmVsID0gewogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLApkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwppbmRleCBkN2RmNTllLi4zNjNiY2I1IDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYworKysgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwpAQCAtOTEsNyArOTEsNyBAQAogICogT25seSBvdXRwdXQgbGV2ZWxzIGNhbiBiZSBtb2RpZmllZAogICovCiAKLXN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9vbGRfdm9sLCAtMTEzNTAsIDUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV9vbGRfdm9sLCAtMTEzNTAsIDUwLCAwKTsKIAogc3RhdGljIHN0cnVjdCBzbmRfdnhfaGFyZHdhcmUgdnhwb2NrZXRfaHcgPSB7CiAJLm5hbWUgPSAiVlhQb2NrZXQiLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL0tjb25maWcgYi9zb3VuZC9zb2MvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgyMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL0tjb25maWcKQEAgLTAsMCArMSwzMiBAQAorIworIyBTb0MgYXVkaW8gY29uZmlndXJhdGlvbgorIworCittZW51ICJTb0MgYXVkaW8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNORCE9bgorCitjb25maWcgU05EX1NPQ19BQzk3X0JVUworCWJvb2wKKworY29uZmlnIFNORF9TT0MKKwl0cmlzdGF0ZSAiU29DIGF1ZGlvIHN1cHBvcnQiCisJLS0taGVscC0tLQorCisJICBJZiB5b3Ugd2FudCBTb0Mgc3VwcG9ydCwgeW91IHNob3VsZCBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvIHRoZQorCSAgc3BlY2lmaWMgZHJpdmVyIGZvciB5b3VyIFNvQyBiZWxvdy4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIHNlbGVjdCB0aGUKKwkgIHNwZWNpZmljIGNvZGVjKHMpIGF0dGFjaGVkIHRvIHRoZSBTb0MKKworCSAgVGhpcyBTb0MgYXVkaW8gc3VwcG9ydCBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbmQtc29jLWNvcmUuCisKKyMgQWxsIHRoZSBzdXBwb3J0ZWQgU29jJ3MKK21lbnUgIlNvQyBQbGF0Zm9ybXMiCitkZXBlbmRzIG9uIFNORF9TT0MKK3NvdXJjZSAic291bmQvc29jL2F0OTEvS2NvbmZpZyIKK3NvdXJjZSAic291bmQvc29jL3B4YS9LY29uZmlnIgorZW5kbWVudQorCisjIFN1cHBvcnRlZCBjb2RlY3MKK3NvdXJjZSAic291bmQvc29jL2NvZGVjcy9LY29uZmlnIgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlNmY0OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK3NuZC1zb2MtY29yZS1vYmpzIDo9IHNvYy1jb3JlLm8gc29jLWRhcG0ubworCitvYmotJChDT05GSUdfU05EX1NPQykJKz0gc25kLXNvYy1jb3JlLm8KK29iai0kKENPTkZJR19TTkRfU09DKQkrPSBjb2RlY3MvIGF0OTEvIHB4YS8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL0tjb25maWcgYi9zb3VuZC9zb2MvYXQ5MS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2YwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9LY29uZmlnCkBAIC0wLDAgKzEsMzIgQEAKK21lbnUgIlNvQyBBdWRpbyBmb3IgdGhlIEF0bWVsIEFUOTEiCisKK2NvbmZpZyBTTkRfQVQ5MV9TT0MKKwl0cmlzdGF0ZSAiU29DIEF1ZGlvIGZvciB0aGUgQXRtZWwgQVQ5MSBTeXN0ZW0tb24tQ2hpcCIKKwlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSAmJiBTTkQKKwlzZWxlY3QgU05EX1BDTQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIGNvZGVjcyBhdHRhY2hlZCB0bworCSAgdGhlIEFUOTEgU1NDIGludGVyZmFjZS4gWW91IHdpbGwgYWxzbyBuZWVkCisJICB0byBzZWxlY3QgdGhlIGF1ZGlvIGludGVyZmFjZXMgdG8gc3VwcG9ydCBiZWxvdy4KKworY29uZmlnIFNORF9BVDkxX1NPQ19JMlMKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX0FUOTFfU09DX0VUSV9CMV9XTTg3MzEKKwl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBXTTg3MzEtYmFzZWQgRW5kcmVsaWEgRVRJLUIxIGJvYXJkcyIKKwlkZXBlbmRzIG9uIFNORF9BVDkxX1NPQyAmJiAoTUFDSF9FVElfQjEgfHwgTUFDSF9FVElfQzEpCisJc2VsZWN0IFNORF9BVDkxX1NPQ19JMlMKKwlzZWxlY3QgU05EX1NPQ19XTTg3MzEKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFdNODczMS1iYXNlZAorCSAgRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYyBFVEktQjEgb3IgRVRJLUMxIGJvYXJkcy4KKworY29uZmlnIFNORF9BVDkxX1NPQ19FVElfU0xBVkUKKwlib29sICJSdW4gY29kZWMgaW4gc2xhdmUgTW9kZSBvbiBFbmRyZWxpYSBib2FyZHMiCisJZGVwZW5kcyBvbiBTTkRfQVQ5MV9TT0NfRVRJX0IxX1dNODczMQorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHJ1biB3aXRoIHRoZSBBVDkxIFNTQyBnZW5lcmF0aW5nIHRoZSBCQ0xLCisJICBhbmQgTFJDIHNpZ25hbHMgb24gRW5kcmVsaWEgYm9hcmRzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXQ5MS9NYWtlZmlsZSBiL3NvdW5kL3NvYy9hdDkxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3N2IwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjIEFUOTEgUGxhdGZvcm0gU3VwcG9ydAorc25kLXNvYy1hdDkxLW9ianMgOj0gYXQ5MS1wY20ubworc25kLXNvYy1hdDkxLWkycy1vYmpzIDo9IGF0OTEtaTJzLm8KKworb2JqLSQoQ09ORklHX1NORF9BVDkxX1NPQykgKz0gc25kLXNvYy1hdDkxLm8KK29iai0kKENPTkZJR19TTkRfQVQ5MV9TT0NfSTJTKSArPSBzbmQtc29jLWF0OTEtaTJzLm8KKworIyBBVDkxIE1hY2hpbmUgU3VwcG9ydAorc25kLXNvYy1ldGktYjEtd204NzMxLW9ianMgOj0gZXRpX2IxX3dtODczMS5vCisKK29iai0kKENPTkZJR19TTkRfQVQ5MV9TT0NfRVRJX0IxX1dNODczMSkgKz0gc25kLXNvYy1ldGktYjEtd204NzMxLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL2F0OTEtaTJzLmMgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLWkycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYzU0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLWkycy5jCkBAIC0wLDAgKzEsNzIwIEBACisvKgorICogYXQ5MS1pMnMuYyAgLS0gIEFMU0EgU29DIEkyUyBBdWRpbyBMYXllciBQbGF0Zm9ybSBkcml2ZXIKKyAqCisgKiBBdXRob3I6IEZyYW5rIE1hbmRhcmlubyA8Zm1hbmRhcmlub0BlbmRyZWxpYS5jb20+CisgKiAgICAgICAgIEVuZHJlbGlhIFRlY2hub2xvZ2llcyBJbmMuCisgKgorICogQmFzZWQgb24gcHhhMnh4IFBsYXRmb3JtIGRyaXZlcnMgYnkKKyAqIExpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfcG1jLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9zc2MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxX3BkYy5oPgorCisjaW5jbHVkZSAiYXQ5MS1wY20uaCIKKyNpbmNsdWRlICJhdDkxLWkycy5oIgorCisjaWYgMAorI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKEtFUk5fREVCVUcgImF0OTEtaTJzOiIgeCkKKyNlbHNlCisjZGVmaW5lCURCRyh4Li4uKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05MjYwKQorI2RlZmluZSBOVU1fU1NDX0RFVklDRVMJCTEKKyNlbHNlCisjZGVmaW5lIE5VTV9TU0NfREVWSUNFUwkJMworI2VuZGlmCisKKworLyoKKyAqIFNTQyBQREMgcmVnaXN0ZXJzIHJlcXVpcmVkIGJ5IHRoZSBQQ00gRE1BIGVuZ2luZS4KKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3BkY19yZWdzIHBkY190eF9yZWcgPSB7CisJLnhwcgkJPSBBVDkxX1BEQ19UUFIsCisJLnhjcgkJPSBBVDkxX1BEQ19UQ1IsCisJLnhucHIJCT0gQVQ5MV9QRENfVE5QUiwKKwkueG5jcgkJPSBBVDkxX1BEQ19UTkNSLAorfTsKKworc3RhdGljIHN0cnVjdCBhdDkxX3BkY19yZWdzIHBkY19yeF9yZWcgPSB7CisJLnhwcgkJPSBBVDkxX1BEQ19SUFIsCisJLnhjcgkJPSBBVDkxX1BEQ19SQ1IsCisJLnhucHIJCT0gQVQ5MV9QRENfUk5QUiwKKwkueG5jcgkJPSBBVDkxX1BEQ19STkNSLAorfTsKKworLyoKKyAqIFNTQyAmIFBEQyBzdGF0dXMgYml0cyBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9zc2NfbWFzayBzc2NfdHhfbWFzayA9IHsKKwkuc3NjX2VuYWJsZQk9IEFUOTFfU1NDX1RYRU4sCisJLnNzY19kaXNhYmxlCT0gQVQ5MV9TU0NfVFhESVMsCisJLnNzY19lbmR4CT0gQVQ5MV9TU0NfRU5EVFgsCisJLnNzY19lbmRidWYJPSBBVDkxX1NTQ19UWEJVRkUsCisJLnBkY19lbmFibGUJPSBBVDkxX1BEQ19UWFRFTiwKKwkucGRjX2Rpc2FibGUJPSBBVDkxX1BEQ19UWFRESVMsCit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfc3NjX21hc2sgc3NjX3J4X21hc2sgPSB7CisJLnNzY19lbmFibGUJPSBBVDkxX1NTQ19SWEVOLAorCS5zc2NfZGlzYWJsZQk9IEFUOTFfU1NDX1JYRElTLAorCS5zc2NfZW5keAk9IEFUOTFfU1NDX0VORFJYLAorCS5zc2NfZW5kYnVmCT0gQVQ5MV9TU0NfUlhCVUZGLAorCS5wZGNfZW5hYmxlCT0gQVQ5MV9QRENfUlhURU4sCisJLnBkY19kaXNhYmxlCT0gQVQ5MV9QRENfUlhURElTLAorfTsKKworCisvKgorICogRE1BIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyBzc2NfZG1hX3BhcmFtc1tOVU1fU1NDX0RFVklDRVNdWzJdID0geworCXt7CisJLm5hbWUJCT0gIlNTQzAvSTJTIFBDTSBTdGVyZW8gb3V0IiwKKwkucGRjCQk9ICZwZGNfdHhfcmVnLAorCS5tYXNrCQk9ICZzc2NfdHhfbWFzaywKKwl9LAorCXsKKwkubmFtZQkJPSAiU1NDMC9JMlMgUENNIFN0ZXJlbyBpbiIsCisJLnBkYwkJPSAmcGRjX3J4X3JlZywKKwkubWFzawkJPSAmc3NjX3J4X21hc2ssCisJfX0sCisjaWYgTlVNX1NTQ19ERVZJQ0VTID09IDMKKwl7eworCS5uYW1lCQk9ICJTU0MxL0kyUyBQQ00gU3RlcmVvIG91dCIsCisJLnBkYwkJPSAmcGRjX3R4X3JlZywKKwkubWFzawkJPSAmc3NjX3R4X21hc2ssCisJfSwKKwl7CisJLm5hbWUJCT0gIlNTQzEvSTJTIFBDTSBTdGVyZW8gaW4iLAorCS5wZGMJCT0gJnBkY19yeF9yZWcsCisJLm1hc2sJCT0gJnNzY19yeF9tYXNrLAorCX19LAorCXt7CisJLm5hbWUJCT0gIlNTQzIvSTJTIFBDTSBTdGVyZW8gb3V0IiwKKwkucGRjCQk9ICZwZGNfdHhfcmVnLAorCS5tYXNrCQk9ICZzc2NfdHhfbWFzaywKKwl9LAorCXsKKwkubmFtZQkJPSAiU1NDMS9JMlMgUENNIFN0ZXJlbyBpbiIsCisJLnBkYwkJPSAmcGRjX3J4X3JlZywKKwkubWFzawkJPSAmc3NjX3J4X21hc2ssCisJfX0sCisjZW5kaWYKK307CisKK3N0cnVjdCBhdDkxX3NzY19zdGF0ZSB7CisJdTMyCXNzY19jbXI7CisJdTMyCXNzY19yY21yOworCXUzMglzc2NfcmZtcjsKKwl1MzIJc3NjX3RjbXI7CisJdTMyCXNzY190Zm1yOworCXUzMglzc2Nfc3I7CisJdTMyCXNzY19pbXI7Cit9OworCitzdGF0aWMgc3RydWN0IGF0OTFfc3NjX2luZm8geworCWNoYXIJCSpuYW1lOworCXN0cnVjdCBhdDkxX3NzY19wZXJpcGggc3NjOworCXNwaW5sb2NrX3QgCWxvY2s7CQkvKiBsb2NrIGZvciBkaXJfbWFzayAqLworCXVuc2lnbmVkIHNob3J0CWRpcl9tYXNrOwkvKiAwPXVudXNlZCwgMT1wbGF5YmFjaywgMj1jYXB0dXJlICovCisJdW5zaWduZWQgc2hvcnQJaW5pdGlhbGl6ZWQ7CS8qIDE9U1NDIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisJdW5zaWduZWQgc2hvcnQJZGFpZm10OworCXVuc2lnbmVkIHNob3J0CWNtcl9kaXY7CisJdW5zaWduZWQgc2hvcnQJdGNtcl9wZXJpb2Q7CisJdW5zaWduZWQgc2hvcnQJcmNtcl9wZXJpb2Q7CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXNbMl07CisJc3RydWN0IGF0OTFfc3NjX3N0YXRlIHNzY19zdGF0ZTsKKworfSBzc2NfaW5mb1tOVU1fU1NDX0RFVklDRVNdID0geworCXsKKwkubmFtZQkJPSAic3NjMCIsCisJLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5kaXJfbWFzawk9IDAsCisJLmluaXRpYWxpemVkCT0gMCwKKwl9LAorI2lmIE5VTV9TU0NfREVWSUNFUyA9PSAzCisJeworCS5uYW1lCQk9ICJzc2MxIiwKKwkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLmRpcl9tYXNrCT0gMCwKKwkuaW5pdGlhbGl6ZWQJPSAwLAorCX0sCisJeworCS5uYW1lCQk9ICJzc2MyIiwKKwkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLmRpcl9tYXNrCT0gMCwKKwkuaW5pdGlhbGl6ZWQJPSAwLAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXQ5MV9pMnNfc3lzY2xrOworCisvKgorICogU1NDIGludGVycnVwdCBoYW5kbGVyLiAgUGFzc2VzIFBEQyBpbnRlcnJ1cHRzIHRvIHRoZSBETUEKKyAqIGludGVycnVwdCBoYW5kbGVyIGluIHRoZSBQQ00gZHJpdmVyLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MV9pMnNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3AgPSBkZXZfaWQ7CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7CisJdTMyIHNzY19zcjsKKwlpbnQgaTsKKworCXNzY19zciA9IGF0OTFfc3NjX3JlYWQoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfU1IpCisJCQkmIGF0OTFfc3NjX3JlYWQoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfSU1SKTsKKworCS8qCisJICogTG9vcCB0aHJvdWdoIHRoZSBzdWJzdHJlYW1zIGF0dGFjaGVkIHRvIHRoaXMgU1NDLiAgSWYKKwkgKiBhIERNQS1yZWxhdGVkIGludGVycnVwdCBvY2N1cnJlZCBvbiB0aGF0IHN1YnN0cmVhbSwgY2FsbAorCSAqIHRoZSBETUEgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24sIGlmIG9uZSBoYXMgYmVlbgorCSAqIHJlZ2lzdGVyZWQgaW4gdGhlIGRtYV9wYXJhbXMgc3RydWN0dXJlIGJ5IHRoZSBQQ00gZHJpdmVyLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNzY19wLT5kbWFfcGFyYW1zKTsgaSsrKSB7CisJCWRtYV9wYXJhbXMgPSBzc2NfcC0+ZG1hX3BhcmFtc1tpXTsKKworCQlpZiAoZG1hX3BhcmFtcyAhPSBOVUxMICYmIGRtYV9wYXJhbXMtPmRtYV9pbnRyX2hhbmRsZXIgIT0gTlVMTCAmJgorCQkJKHNzY19zciAmCisJCQkoZG1hX3BhcmFtcy0+bWFzay0+c3NjX2VuZHggfCBkbWFfcGFyYW1zLT5tYXNrLT5zc2NfZW5kYnVmKSkpCisKKwkJCWRtYV9wYXJhbXMtPmRtYV9pbnRyX2hhbmRsZXIoc3NjX3NyLCBkbWFfcGFyYW1zLT5zdWJzdHJlYW0pOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIFN0YXJ0dXAuICBPbmx5IHRoYXQgb25lIHN1YnN0cmVhbSBhbGxvd2VkIGluIGVhY2ggZGlyZWN0aW9uLgorICovCitzdGF0aWMgaW50IGF0OTFfaTJzX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdDkxX3NzY19pbmZvICpzc2NfcCA9ICZzc2NfaW5mb1tydGQtPmRhaS0+Y3B1X2RhaS0+aWRdOworCWludCBkaXJfbWFzazsKKworCURCRygiaTJzX3N0YXJ0dXA6IFNTQ19TUj0weCUwOGx4XG4iLAorCQkJYXQ5MV9zc2NfcmVhZChzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19TUikpOworCWRpcl9tYXNrID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IDB4MSA6IDB4MjsKKworCXNwaW5fbG9ja19pcnEoJnNzY19wLT5sb2NrKTsKKwlpZiAoc3NjX3AtPmRpcl9tYXNrICYgZGlyX21hc2spIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZzc2NfcC0+bG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXNzY19wLT5kaXJfbWFzayB8PSBkaXJfbWFzazsKKwlzcGluX3VubG9ja19pcnEoJnNzY19wLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2h1dGRvd24uICBDbGVhciBETUEgcGFyYW1ldGVycyBhbmQgc2h1dGRvd24gdGhlIFNTQyBpZiB0aGVyZQorICogYXJlIG5vIG90aGVyIHN1YnN0cmVhbXMgb3Blbi4KKyAqLworc3RhdGljIHZvaWQgYXQ5MV9pMnNfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdDkxX3NzY19pbmZvICpzc2NfcCA9ICZzc2NfaW5mb1tydGQtPmRhaS0+Y3B1X2RhaS0+aWRdOworCXN0cnVjdCBhdDkxX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zOworCWludCBkaXIsIGRpcl9tYXNrOworCisJZGlyID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IDAgOiAxOworCWRtYV9wYXJhbXMgPSBzc2NfcC0+ZG1hX3BhcmFtc1tkaXJdOworCisJaWYgKGRtYV9wYXJhbXMgIT0gTlVMTCkgeworCQlhdDkxX3NzY193cml0ZShkbWFfcGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfU1NDX0NSLAorCQkJCWRtYV9wYXJhbXMtPm1hc2stPnNzY19kaXNhYmxlKTsKKwkJREJHKCIlcyBkaXNhYmxlZCBTU0NfU1I9MHglMDhseFxuIiwgKGRpciA/ICJyZWNlaXZlIiA6ICJ0cmFuc21pdCIpLAorCQkJYXQ5MV9zc2NfcmVhZChzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19TUikpOworCisJCWRtYV9wYXJhbXMtPnNzY19iYXNlID0gTlVMTDsKKwkJZG1hX3BhcmFtcy0+c3Vic3RyZWFtID0gTlVMTDsKKwkJc3NjX3AtPmRtYV9wYXJhbXNbZGlyXSA9IE5VTEw7CisJfQorCisJZGlyX21hc2sgPSAxIDw8IGRpcjsKKworCXNwaW5fbG9ja19pcnEoJnNzY19wLT5sb2NrKTsKKwlzc2NfcC0+ZGlyX21hc2sgJj0gfmRpcl9tYXNrOworCWlmICghc3NjX3AtPmRpcl9tYXNrKSB7CisJCS8qIFNodXRkb3duIHRoZSBTU0MgY2xvY2suICovCisJCURCRygiU3RvcHBpbmcgcGlkICVkIGNsb2NrXG4iLCBzc2NfcC0+c3NjLnBpZCk7CisJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUE1DX1BDRFIsIDE8PHNzY19wLT5zc2MucGlkKTsKKworCQlpZiAoc3NjX3AtPmluaXRpYWxpemVkKSB7CisJCQlmcmVlX2lycShzc2NfcC0+c3NjLnBpZCwgc3NjX3ApOworCQkJc3NjX3AtPmluaXRpYWxpemVkID0gMDsKKwkJfQorCisJCS8qIFJlc2V0IHRoZSBTU0MgKi8KKwkJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfQ1IsIEFUOTFfU1NDX1NXUlNUKTsKKworCQkvKiBDbGVhciB0aGUgU1NDIGRpdmlkZXJzICovCisJCXNzY19wLT5jbXJfZGl2ID0gc3NjX3AtPnRjbXJfcGVyaW9kID0gc3NjX3AtPnJjbXJfcGVyaW9kID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZzc2NfcC0+bG9jayk7Cit9CisKKy8qCisgKiBSZWNvcmQgdGhlIFNTQyBzeXN0ZW0gY2xvY2sgcmF0ZS4KKyAqLworc3RhdGljIGludCBhdDkxX2kyc19zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAorCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwkvKgorCSAqIFRoZSBvbmx5IGNsb2NrIHN1cHBsaWVkIHRvIHRoZSBTU0MgaXMgdGhlIEFUOTEgbWFzdGVyIGNsb2NrLAorCSAqIHdoaWNoIGlzIG9ubHkgdXNlZCBpZiB0aGUgU1NDIGlzIGdlbmVyYXRpbmcgQkNMSyBhbmQvb3IKKwkgKiBMUkMgY2xvY2tzLgorCSAqLworCXN3aXRjaCAoY2xrX2lkKSB7CisJY2FzZSBBVDkxX1NZU0NMS19NQ0s6CisJCWF0OTFfaTJzX3N5c2NsayA9IGZyZXE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUmVjb3JkIHRoZSBEQUkgZm9ybWF0IGZvciB1c2UgaW4gaHdfcGFyYW1zKCkuCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9pMnNfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSwKKwkJdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3AgPSAmc3NjX2luZm9bY3B1X2RhaS0+aWRdOworCisJaWYgKChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgIT0gU05EX1NPQ19EQUlGTVRfSTJTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNzY19wLT5kYWlmbXQgPSBmbXQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWNvcmQgU1NDIGNsb2NrIGRpdmlkZXJzIGZvciB1c2UgaW4gaHdfcGFyYW1zKCkuCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9pMnNfc2V0X2RhaV9jbGtkaXYoc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSwKKwlpbnQgZGl2X2lkLCBpbnQgZGl2KQoreworCXN0cnVjdCBhdDkxX3NzY19pbmZvICpzc2NfcCA9ICZzc2NfaW5mb1tjcHVfZGFpLT5pZF07CisKKwlzd2l0Y2ggKGRpdl9pZCkgeworCWNhc2UgQVQ5MVNTQ19DTVJfRElWOgorCQkvKgorCQkgKiBUaGUgc2FtZSBtYXN0ZXIgY2xvY2sgZGl2aWRlciBpcyB1c2VkIGZvciBib3RoCisJCSAqIHRyYW5zbWl0IGFuZCByZWNlaXZlLCBzbyBpZiBhIHZhbHVlIGhhcyBhbHJlYWR5CisJCSAqIGJlZW4gc2V0LCBpdCBtdXN0IG1hdGNoIHRoaXMgdmFsdWUuCisJCSAqLworCQlpZiAoc3NjX3AtPmNtcl9kaXYgPT0gMCkKKwkJCXNzY19wLT5jbXJfZGl2ID0gZGl2OworCQllbHNlCisJCQlpZiAoZGl2ICE9IHNzY19wLT5jbXJfZGl2KQorCQkJCXJldHVybiAtRUJVU1k7CisJCWJyZWFrOworCisJY2FzZSBBVDkxU1NDX1RDTVJfUEVSSU9EOgorCQlzc2NfcC0+dGNtcl9wZXJpb2QgPSBkaXY7CisJCWJyZWFrOworCisJY2FzZSBBVDkxU1NDX1JDTVJfUEVSSU9EOgorCQlzc2NfcC0+cmNtcl9wZXJpb2QgPSBkaXY7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIFNTQy4KKyAqLworc3RhdGljIGludCBhdDkxX2kyc19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBpZCA9IHJ0ZC0+ZGFpLT5jcHVfZGFpLT5pZDsKKwlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3AgPSAmc3NjX2luZm9baWRdOworCXN0cnVjdCBhdDkxX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zOworCWludCBkaXIsIGNoYW5uZWxzLCBiaXRzOworCXUzMiB0Zm1yLCByZm1yLCB0Y21yLCByY21yOworCWludCBzdGFydF9ldmVudDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBDdXJyZW50bHksIHRoZXJlIGlzIG9ubHkgb25lIHNldCBvZiBkbWEgcGFyYW1zIGZvcgorCSAqIGVhY2ggZGlyZWN0aW9uLiAgSWYgbW9yZSBhcmUgYWRkZWQsIHRoaXMgY29kZSB3aWxsCisJICogaGF2ZSB0byBiZSBjaGFuZ2VkIHRvIHNlbGVjdCB0aGUgcHJvcGVyIHNldC4KKwkgKi8KKwlkaXIgPSBzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gMCA6IDE7CisKKwlkbWFfcGFyYW1zID0gJnNzY19kbWFfcGFyYW1zW2lkXVtkaXJdOworCWRtYV9wYXJhbXMtPnNzY19iYXNlID0gc3NjX3AtPnNzYy5iYXNlOworCWRtYV9wYXJhbXMtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKworCXNzY19wLT5kbWFfcGFyYW1zW2Rpcl0gPSBkbWFfcGFyYW1zOworCisJLyoKKwkgKiBUaGUgY3B1X2RhaS0+ZG1hX2RhdGEgZmllbGQgaXMgb25seSB1c2VkIHRvIGNvbW11bmljYXRlIHRoZQorCSAqIGFwcHJvcHJpYXRlIERNQSBwYXJhbWV0ZXJzIHRvIHRoZSBwY20gZHJpdmVyIGh3X3BhcmFtcygpCisJICogZnVuY3Rpb24uICBJdCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzCisJICogYXMgaXQgaXMgY29tbW9uIHRvIGFsbCBzdWJzdHJlYW1zLgorCSAqLworCXJ0ZC0+ZGFpLT5jcHVfZGFpLT5kbWFfZGF0YSA9IGRtYV9wYXJhbXM7CisKKwljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCisJLyoKKwkgKiBUaGUgU1NDIG9ubHkgc3VwcG9ydHMgdXAgdG8gMTYtYml0IHNhbXBsZXMgaW4gSTJTIGZvcm1hdCwgZHVlCisJICogdG8gdGhlIHNpemUgb2YgdGhlIEZyYW1lIE1vZGUgUmVnaXN0ZXIgRlNMRU4gZmllbGQuICBBbHNvLCBJMlMKKwkgKiBpbXBsaWVzIHNpZ25lZCBkYXRhLgorCSAqLworCWJpdHMgPSAxNjsKKwlkbWFfcGFyYW1zLT5wZGNfeGZlcl9zaXplID0gMjsKKworCS8qCisJICogQ29tcHV0ZSBTU0MgcmVnaXN0ZXIgc2V0dGluZ3MuCisJICovCisJc3dpdGNoIChzc2NfcC0+ZGFpZm10KSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQkvKgorCQkgKiBTU0MgcHJvdmlkZXMgQkNMSyBhbmQgTFJDIGNsb2Nrcy4KKwkJICoKKwkJICogVGhlIFNTQyB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjbG9ja3MgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZQorCQkgKiBNQ0sgZGl2aWRlciwgYW5kIHRoZSBCQ0xLIHNpZ25hbCBpcyBvdXRwdXQgb24gdGhlIFNTQyBUSyBsaW5lLgorCQkgKi8KKwkJcmNtciA9CSAgKCggc3NjX3AtPnJjbXJfcGVyaW9kCQk8PCAyNCkgJiBBVDkxX1NTQ19QRVJJT0QpCisJCQl8ICgoIDEJCQkJPDwgMTYpICYgQVQ5MV9TU0NfU1RURExZKQorCQkJfCAoKCBBVDkxX1NTQ19TVEFSVF9GQUxMSU5HX1JGCSAgICAgKSAmIEFUOTFfU1NDX1NUQVJUKQorCQkJfCAoKCBBVDkxX1NTQ19DS19SSVNJTkcJCSAgICAgKSAmIEFUOTFfU1NDX0NLSSkKKwkJCXwgKCggQVQ5MV9TU0NfQ0tPX05PTkUJCSAgICAgKSAmIEFUOTFfU1NDX0NLTykKKwkJCXwgKCggQVQ5MV9TU0NfQ0tTX0RJVgkJICAgICApICYgQVQ5MV9TU0NfQ0tTKTsKKworCQlyZm1yID0JICAoKCBBVDkxX1NTQ19GU0VER0VfUE9TSVRJVkUJICAgICApICYgQVQ5MV9TU0NfRlNFREdFKQorCQkJfCAoKCBBVDkxX1NTQ19GU09TX05FR0FUSVZFCSAgICAgKSAmIEFUOTFfU1NDX0ZTT1MpCisJCQl8ICgoKGJpdHMgLSAxKQkJCTw8IDE2KSAmIEFUOTFfU1NDX0ZTTEVOKQorCQkJfCAoKChjaGFubmVscyAtIDEpCQk8PCAgOCkgJiBBVDkxX1NTQ19EQVROQikKKwkJCXwgKCggMQkJCQk8PCAgNykgJiBBVDkxX1NTQ19NU0JGKQorCQkJfCAoKCAwCQkJCTw8ICA1KSAmIEFUOTFfU1NDX0xPT1ApCisJCQl8ICgoKGJpdHMgLSAxKQkJCTw8ICAwKSAmIEFUOTFfU1NDX0RBVEFMRU4pOworCisJCXRjbXIgPQkgICgoIHNzY19wLT50Y21yX3BlcmlvZAkJPDwgMjQpICYgQVQ5MV9TU0NfUEVSSU9EKQorCQkJfCAoKCAxCQkJCTw8IDE2KSAmIEFUOTFfU1NDX1NUVERMWSkKKwkJCXwgKCggQVQ5MV9TU0NfU1RBUlRfRkFMTElOR19SRiAgICAgICApICYgQVQ5MV9TU0NfU1RBUlQpCisJCQl8ICgoIEFUOTFfU1NDX0NLSV9GQUxMSU5HCSAgICAgKSAmIEFUOTFfU1NDX0NLSSkKKwkJCXwgKCggQVQ5MV9TU0NfQ0tPX0NPTlRJTlVPVVMJICAgICApICYgQVQ5MV9TU0NfQ0tPKQorCQkJfCAoKCBBVDkxX1NTQ19DS1NfRElWCQkgICAgICkgJiBBVDkxX1NTQ19DS1MpOworCisJCXRmbXIgPQkgICgoIEFUOTFfU1NDX0ZTRURHRV9QT1NJVElWRQkgICAgICkgJiBBVDkxX1NTQ19GU0VER0UpCisJCQl8ICgoIDAJCQkJPDwgMjMpICYgQVQ5MV9TU0NfRlNERU4pCisJCQl8ICgoIEFUOTFfU1NDX0ZTT1NfTkVHQVRJVkUJICAgICApICYgQVQ5MV9TU0NfRlNPUykKKwkJCXwgKCgoYml0cyAtIDEpCQkJPDwgMTYpICYgQVQ5MV9TU0NfRlNMRU4pCisJCQl8ICgoKGNoYW5uZWxzIC0gMSkJCTw8ICA4KSAmIEFUOTFfU1NDX0RBVE5CKQorCQkJfCAoKCAxCQkJCTw8ICA3KSAmIEFUOTFfU1NDX01TQkYpCisJCQl8ICgoIDAJCQkJPDwgIDUpICYgQVQ5MV9TU0NfREFUREVGKQorCQkJfCAoKChiaXRzIC0gMSkJCQk8PCAgMCkgJiBBVDkxX1NTQ19EQVRBTEVOKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisKKwkJLyoKKwkJICogQ09ERUMgc3VwcGxpZXMgQkNMSyBhbmQgTFJDIGNsb2Nrcy4KKwkJICoKKwkJICogVGhlIFNTQyB0cmFuc21pdCBjbG9jayBpcyBvYnRhaW5lZCBmcm9tIHRoZSBCQ0xLIHNpZ25hbCBvbgorCQkgKiBvbiB0aGUgVEsgbGluZSwgYW5kIHRoZSBTU0MgcmVjZWl2ZSBjbG9jayBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUKKwkJICogdHJhbnNtaXQgY2xvY2suCisJCSAqCisJCSAqIEZvciBzaW5nbGUgY2hhbm5lbCBkYXRhLCBvbmUgc2FtcGxlIGlzIHRyYW5zZmVycmVkIG9uIHRoZSBmYWxsaW5nCisJCSAqIGVkZ2Ugb2YgdGhlIExSQyBjbG9jay4gIEZvciB0d28gY2hhbm5lbCBkYXRhLCBvbmUgc2FtcGxlIGlzCisJCSAqIHRyYW5zZmVycmVkIG9uIGJvdGggZWRnZXMgb2YgdGhlIExSQyBjbG9jay4KKwkJICovCisJCXN0YXJ0X2V2ZW50ID0gY2hhbm5lbHMgPT0gMQorCQkJCT8gQVQ5MV9TU0NfU1RBUlRfRkFMTElOR19SRgorCQkJCTogQVQ5MV9TU0NfU1RBUlRfRURHRV9SRjsKKworCQlyY21yID0JICAoKCAwCQkJCTw8IDI0KSAmIEFUOTFfU1NDX1BFUklPRCkKKwkJCXwgKCggMQkJCQk8PCAxNikgJiBBVDkxX1NTQ19TVFRETFkpCisJCQl8ICgoIHN0YXJ0X2V2ZW50CQkgICAgICkgJiBBVDkxX1NTQ19TVEFSVCkKKwkJCXwgKCggQVQ5MV9TU0NfQ0tfUklTSU5HCQkgICAgICkgJiBBVDkxX1NTQ19DS0kpCisJCQl8ICgoIEFUOTFfU1NDX0NLT19OT05FCQkgICAgICkgJiBBVDkxX1NTQ19DS08pCisJCQl8ICgoIEFUOTFfU1NDX0NLU19DTE9DSwkJICAgICApICYgQVQ5MV9TU0NfQ0tTKTsKKworCQlyZm1yID0JICAoKCBBVDkxX1NTQ19GU0VER0VfUE9TSVRJVkUJICAgICApICYgQVQ5MV9TU0NfRlNFREdFKQorCQkJfCAoKCBBVDkxX1NTQ19GU09TX05PTkUJCSAgICAgKSAmIEFUOTFfU1NDX0ZTT1MpCisJCQl8ICgoIDAJCQkJPDwgMTYpICYgQVQ5MV9TU0NfRlNMRU4pCisJCQl8ICgoIDAJCQkJPDwgIDgpICYgQVQ5MV9TU0NfREFUTkIpCisJCQl8ICgoIDEJCQkJPDwgIDcpICYgQVQ5MV9TU0NfTVNCRikKKwkJCXwgKCggMAkJCQk8PCAgNSkgJiBBVDkxX1NTQ19MT09QKQorCQkJfCAoKChiaXRzIC0gMSkJCQk8PCAgMCkgJiBBVDkxX1NTQ19EQVRBTEVOKTsKKworCQl0Y21yID0JICAoKCAwCQkJCTw8IDI0KSAmIEFUOTFfU1NDX1BFUklPRCkKKwkJCXwgKCggMQkJCQk8PCAxNikgJiBBVDkxX1NTQ19TVFRETFkpCisJCQl8ICgoIHN0YXJ0X2V2ZW50CQkgICAgICkgJiBBVDkxX1NTQ19TVEFSVCkKKwkJCXwgKCggQVQ5MV9TU0NfQ0tJX0ZBTExJTkcJICAgICApICYgQVQ5MV9TU0NfQ0tJKQorCQkJfCAoKCBBVDkxX1NTQ19DS09fTk9ORQkJICAgICApICYgQVQ5MV9TU0NfQ0tPKQorCQkJfCAoKCBBVDkxX1NTQ19DS1NfUElOCQkgICAgICkgJiBBVDkxX1NTQ19DS1MpOworCisJCXRmbXIgPQkgICgoIEFUOTFfU1NDX0ZTRURHRV9QT1NJVElWRQkgICAgICkgJiBBVDkxX1NTQ19GU0VER0UpCisJCQl8ICgoIDAJCQkJPDwgMjMpICYgQVQ5MV9TU0NfRlNERU4pCisJCQl8ICgoIEFUOTFfU1NDX0ZTT1NfTk9ORQkJICAgICApICYgQVQ5MV9TU0NfRlNPUykKKwkJCXwgKCggMAkJCQk8PCAxNikgJiBBVDkxX1NTQ19GU0xFTikKKwkJCXwgKCggMAkJCQk8PCAgOCkgJiBBVDkxX1NTQ19EQVROQikKKwkJCXwgKCggMQkJCQk8PCAgNykgJiBBVDkxX1NTQ19NU0JGKQorCQkJfCAoKCAwCQkJCTw8ICA1KSAmIEFUOTFfU1NDX0RBVERFRikKKwkJCXwgKCgoYml0cyAtIDEpCQkJPDwgIDApICYgQVQ5MV9TU0NfREFUQUxFTik7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZNOgorCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGUzoKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdDkxLWkyczogdW5zdXBwb3J0ZWQgREFJIGZvcm1hdCAweCV4LlxuIiwKKwkJCXNzY19wLT5kYWlmbXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCURCRygiUkNNUj0lMDh4IFJGTVI9JTA4eCBUQ01SPSUwOHggVEZNUj0lMDh4XG4iLCByY21yLCByZm1yLCB0Y21yLCB0Zm1yKTsKKworCWlmICghc3NjX3AtPmluaXRpYWxpemVkKSB7CisKKwkJLyogRW5hYmxlIFBNQyBwZXJpcGhlcmFsIGNsb2NrIGZvciB0aGlzIFNTQyAqLworCQlEQkcoIlN0YXJ0aW5nIHBpZCAlZCBjbG9ja1xuIiwgc3NjX3AtPnNzYy5waWQpOworCQlhdDkxX3N5c193cml0ZShBVDkxX1BNQ19QQ0VSLCAxPDxzc2NfcC0+c3NjLnBpZCk7CisKKwkJLyogUmVzZXQgdGhlIFNTQyBhbmQgaXRzIFBEQyByZWdpc3RlcnMgKi8KKwkJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfQ1IsIEFUOTFfU1NDX1NXUlNUKTsKKworCQlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1BEQ19SUFIsIDApOworCQlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1BEQ19SQ1IsIDApOworCQlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1BEQ19STlBSLCAwKTsKKwkJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9QRENfUk5DUiwgMCk7CisJCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfUERDX1RQUiwgMCk7CisJCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfUERDX1RDUiwgMCk7CisJCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfUERDX1ROUFIsIDApOworCQlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1BEQ19UTkNSLCAwKTsKKworCQlpZiAoKHJldCA9IHJlcXVlc3RfaXJxKHNzY19wLT5zc2MucGlkLCBhdDkxX2kyc19pbnRlcnJ1cHQsCisJCQkJCTAsIHNzY19wLT5uYW1lLCBzc2NfcCkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXQ5MS1pMnM6IHJlcXVlc3RfaXJxIGZhaWx1cmVcbiIpOworCisJCQlEQkcoIlN0b3BwaW5nIHBpZCAlZCBjbG9ja1xuIiwgc3NjX3AtPnNzYy5waWQpOworCQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfUENFUiwgMTw8c3NjX3AtPnNzYy5waWQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXNzY19wLT5pbml0aWFsaXplZCA9IDE7CisJfQorCisJLyogc2V0IFNTQyBjbG9jayBtb2RlIHJlZ2lzdGVyICovCisJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfQ01SLCBzc2NfcC0+Y21yX2Rpdik7CisKKwkvKiBzZXQgcmVjZWl2ZSBjbG9jayBtb2RlIGFuZCBmb3JtYXQgKi8KKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19SQ01SLCByY21yKTsKKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19SRk1SLCByZm1yKTsKKworCS8qIHNldCB0cmFuc21pdCBjbG9jayBtb2RlIGFuZCBmb3JtYXQgKi8KKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19UQ01SLCB0Y21yKTsKKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19URk1SLCB0Zm1yKTsKKworCURCRygiaHdfcGFyYW1zOiBTU0MgaW5pdGlhbGl6ZWRcbiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXQ5MV9pMnNfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0OTFfc3NjX2luZm8gKnNzY19wID0gJnNzY19pbmZvW3J0ZC0+ZGFpLT5jcHVfZGFpLT5pZF07CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7CisJaW50IGRpcjsKKworCWRpciA9IHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyAwIDogMTsKKwlkbWFfcGFyYW1zID0gc3NjX3AtPmRtYV9wYXJhbXNbZGlyXTsKKworCWF0OTFfc3NjX3dyaXRlKGRtYV9wYXJhbXMtPnNzY19iYXNlICsgQVQ5MV9TU0NfQ1IsCisJCQlkbWFfcGFyYW1zLT5tYXNrLT5zc2NfZW5hYmxlKTsKKworCURCRygiJXMgZW5hYmxlZCBTU0NfU1I9MHglMDhseFxuIiwgZGlyID8gInJlY2VpdmUiIDogInRyYW5zbWl0IiwKKwkJYXQ5MV9zc2NfcmVhZChkbWFfcGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfU1NDX1NSKSk7CisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhdDkxX2kyc19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSkKK3sKKwlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3A7CisKKwlpZighY3B1X2RhaS0+YWN0aXZlKQorCQlyZXR1cm4gMDsKKworCXNzY19wID0gJnNzY19pbmZvW2NwdV9kYWktPmlkXTsKKworCS8qIFNhdmUgdGhlIHN0YXR1cyByZWdpc3RlciBiZWZvcmUgZGlzYWJsaW5nIHRyYW5zbWl0IGFuZCByZWNlaXZlLiAqLworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX3NyID0gYXQ5MV9zc2NfcmVhZChzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19TUik7CisJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfQ1IsCisJCQlBVDkxX1NTQ19UWERJUyB8IEFUOTFfU1NDX1JYRElTKTsKKworCS8qIFNhdmUgdGhlIGN1cnJlbnQgaW50ZXJydXB0IG1hc2ssIHRoZW4gZGlzYWJsZSB1bm1hc2tlZCBpbnRlcnJ1cHRzLiAqLworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX2ltciA9IGF0OTFfc3NjX3JlYWQoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfSU1SKTsKKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19JRFIsIHNzY19wLT5zc2Nfc3RhdGUuc3NjX2ltcik7CisKKwlzc2NfcC0+c3NjX3N0YXRlLnNzY19jbXIgID0gYXQ5MV9zc2NfcmVhZChzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19DTVIpOworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX3JjbXIgPSBhdDkxX3NzY19yZWFkKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1JDTVIpOworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX3JmbXIgPSBhdDkxX3NzY19yZWFkKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1JGTVIpOworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX3RjbXIgPSBhdDkxX3NzY19yZWFkKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1RDTVIpOworCXNzY19wLT5zc2Nfc3RhdGUuc3NjX3RmbXIgPSBhdDkxX3NzY19yZWFkKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1RGTVIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9pMnNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSkKK3sKKwlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3A7CisKKwlpZighY3B1X2RhaS0+YWN0aXZlKQorCQlyZXR1cm4gMDsKKworCXNzY19wID0gJnNzY19pbmZvW2NwdV9kYWktPmlkXTsKKworCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1RGTVIsIHNzY19wLT5zc2Nfc3RhdGUuc3NjX3RmbXIpOworCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1RDTVIsIHNzY19wLT5zc2Nfc3RhdGUuc3NjX3RjbXIpOworCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1JGTVIsIHNzY19wLT5zc2Nfc3RhdGUuc3NjX3JmbXIpOworCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX1JDTVIsIHNzY19wLT5zc2Nfc3RhdGUuc3NjX3JjbXIpOworCWF0OTFfc3NjX3dyaXRlKHNzY19wLT5zc2MuYmFzZSArIEFUOTFfU1NDX0NNUiwgIHNzY19wLT5zc2Nfc3RhdGUuc3NjX2Ntcik7CisKKwlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVDkxX1NTQ19JRVIsICBzc2NfcC0+c3NjX3N0YXRlLnNzY19pbXIpOworCisJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfQ1IsCisJCSgoc3NjX3AtPnNzY19zdGF0ZS5zc2Nfc3IgJiBBVDkxX1NTQ19SWEVOQSkgPyBBVDkxX1NTQ19SWEVOIDogMCkgfAorCQkoKHNzY19wLT5zc2Nfc3RhdGUuc3NjX3NyICYgQVQ5MV9TU0NfVFhFTkEpID8gQVQ5MV9TU0NfVFhFTiA6IDApKTsKKworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBhdDkxX2kyc19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgYXQ5MV9pMnNfcmVzdW1lCQlOVUxMCisjZW5kaWYKKworI2RlZmluZSBBVDkxX0kyU19SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMCAgfCBTTkRSVl9QQ01fUkFURV8xMTAyNSB8XAorCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8XAorCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8XAorCQkJU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84ODIwMCB8XAorCQkJU05EUlZfUENNX1JBVEVfOTYwMDApCisKK3N0cnVjdCBzbmRfc29jX2NwdV9kYWkgYXQ5MV9pMnNfZGFpW05VTV9TU0NfREVWSUNFU10gPSB7CisJewkubmFtZSA9ICJhdDkxX3NzYzAvaTJzIiwKKwkJLmlkID0gMCwKKwkJLnR5cGUgPSBTTkRfU09DX0RBSV9JMlMsCisJCS5zdXNwZW5kID0gYXQ5MV9pMnNfc3VzcGVuZCwKKwkJLnJlc3VtZSA9IGF0OTFfaTJzX3Jlc3VtZSwKKwkJLnBsYXliYWNrID0geworCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IEFUOTFfSTJTX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBBVDkxX0kyU19SQVRFUywKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkJLm9wcyA9IHsKKwkJCS5zdGFydHVwID0gYXQ5MV9pMnNfc3RhcnR1cCwKKwkJCS5zaHV0ZG93biA9IGF0OTFfaTJzX3NodXRkb3duLAorCQkJLnByZXBhcmUgPSBhdDkxX2kyc19wcmVwYXJlLAorCQkJLmh3X3BhcmFtcyA9IGF0OTFfaTJzX2h3X3BhcmFtcyx9LAorCQkuZGFpX29wcyA9IHsKKwkJCS5zZXRfc3lzY2xrID0gYXQ5MV9pMnNfc2V0X2RhaV9zeXNjbGssCisJCQkuc2V0X2ZtdCA9IGF0OTFfaTJzX3NldF9kYWlfZm10LAorCQkJLnNldF9jbGtkaXYgPSBhdDkxX2kyc19zZXRfZGFpX2Nsa2Rpdix9LAorCQkucHJpdmF0ZV9kYXRhID0gJnNzY19pbmZvWzBdLnNzYywKKwl9LAorI2lmIE5VTV9TU0NfREVWSUNFUyA9PSAzCisJewkubmFtZSA9ICJhdDkxX3NzYzEvaTJzIiwKKwkJLmlkID0gMSwKKwkJLnR5cGUgPSBTTkRfU09DX0RBSV9JMlMsCisJCS5zdXNwZW5kID0gYXQ5MV9pMnNfc3VzcGVuZCwKKwkJLnJlc3VtZSA9IGF0OTFfaTJzX3Jlc3VtZSwKKwkJLnBsYXliYWNrID0geworCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IEFUOTFfSTJTX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBBVDkxX0kyU19SQVRFUywKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkJLm9wcyA9IHsKKwkJCS5zdGFydHVwID0gYXQ5MV9pMnNfc3RhcnR1cCwKKwkJCS5zaHV0ZG93biA9IGF0OTFfaTJzX3NodXRkb3duLAorCQkJLnByZXBhcmUgPSBhdDkxX2kyc19wcmVwYXJlLAorCQkJLmh3X3BhcmFtcyA9IGF0OTFfaTJzX2h3X3BhcmFtcyx9LAorCQkuZGFpX29wcyA9IHsKKwkJCS5zZXRfc3lzY2xrID0gYXQ5MV9pMnNfc2V0X2RhaV9zeXNjbGssCisJCQkuc2V0X2ZtdCA9IGF0OTFfaTJzX3NldF9kYWlfZm10LAorCQkJLnNldF9jbGtkaXYgPSBhdDkxX2kyc19zZXRfZGFpX2Nsa2Rpdix9LAorCQkucHJpdmF0ZV9kYXRhID0gJnNzY19pbmZvWzFdLnNzYywKKwl9LAorCXsJLm5hbWUgPSAiYXQ5MV9zc2MyL2kycyIsCisJCS5pZCA9IDIsCisJCS50eXBlID0gU05EX1NPQ19EQUlfSTJTLAorCQkuc3VzcGVuZCA9IGF0OTFfaTJzX3N1c3BlbmQsCisJCS5yZXN1bWUgPSBhdDkxX2kyc19yZXN1bWUsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBBVDkxX0kyU19SQVRFUywKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gQVQ5MV9JMlNfUkFURVMsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLH0sCisJCS5vcHMgPSB7CisJCQkuc3RhcnR1cCA9IGF0OTFfaTJzX3N0YXJ0dXAsCisJCQkuc2h1dGRvd24gPSBhdDkxX2kyc19zaHV0ZG93biwKKwkJCS5wcmVwYXJlID0gYXQ5MV9pMnNfcHJlcGFyZSwKKwkJCS5od19wYXJhbXMgPSBhdDkxX2kyc19od19wYXJhbXMsfSwKKwkJLmRhaV9vcHMgPSB7CisJCQkuc2V0X3N5c2NsayA9IGF0OTFfaTJzX3NldF9kYWlfc3lzY2xrLAorCQkJLnNldF9mbXQgPSBhdDkxX2kyc19zZXRfZGFpX2ZtdCwKKwkJCS5zZXRfY2xrZGl2ID0gYXQ5MV9pMnNfc2V0X2RhaV9jbGtkaXYsfSwKKwkJLnByaXZhdGVfZGF0YSA9ICZzc2NfaW5mb1syXS5zc2MsCisJfSwKKyNlbmRpZgorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoYXQ5MV9pMnNfZGFpKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJGcmFuayBNYW5kYXJpbm8sIGZtYW5kYXJpbm9AZW5kcmVsaWEuY29tLCB3d3cuZW5kcmVsaWEuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFUOTEgSTJTIEFTb0MgSW50ZXJmYWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXQ5MS9hdDkxLWkycy5oIGIvc291bmQvc29jL2F0OTEvYXQ5MS1pMnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGE4NzViCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2F0OTEvYXQ5MS1pMnMuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogYXQ5MS1pMnMuaCAtIEFMU0EgSTJTIGludGVyZmFjZSBmb3IgdGhlIEF0bWVsIEFUOTEgU29DCisgKgorICogQXV0aG9yOglGcmFuayBNYW5kYXJpbm8gPGZtYW5kYXJpbm9AZW5kcmVsaWEuY29tPgorICoJCUVuZHJlbGlhIFRlY2hub2xvZ2llcyBJbmMuCisgKiBDcmVhdGVkOglKYW4gOSwgMjAwNworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQVQ5MV9JMlNfSAorI2RlZmluZSBfQVQ5MV9JMlNfSAorCisvKiBJMlMgc3lzdGVtIGNsb2NrIGlkcyAqLworI2RlZmluZSBBVDkxX1NZU0NMS19NQ0sJCTAgLyogU1NDIHVzZXMgQVQ5MSBNQ0sgYXMgc3lzdGVtIGNsb2NrICovCisKKy8qIEkyUyBkaXZpZGVyIGlkcyAqLworI2RlZmluZSBBVDkxU1NDX0NNUl9ESVYJCTAgLyogTUNLIGRpdmlkZXIgZm9yIEJDTEsgKi8KKyNkZWZpbmUgQVQ5MVNTQ19UQ01SX1BFUklPRAkxIC8qIEJDTEsgZGl2aWRlciBmb3IgdHJhbnNtaXQgRlMgKi8KKyNkZWZpbmUgQVQ5MVNTQ19SQ01SX1BFUklPRAkyIC8qIEJDTEsgZGl2aWRlciBmb3IgcmVjZWl2ZSBGUyAqLworCitleHRlcm4gc3RydWN0IHNuZF9zb2NfY3B1X2RhaSBhdDkxX2kyc19kYWlbXTsKKworI2VuZGlmIC8qIF9BVDkxX0kyU19IICovCisKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL2F0OTEtcGNtLmMgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLXBjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OGIxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLXBjbS5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogYXQ5MS1wY20uYyAtLSBBTFNBIFBDTSBpbnRlcmZhY2UgZm9yIHRoZSBBdG1lbCBBVDkxIFNvQworICoKKyAqIEF1dGhvcjoJRnJhbmsgTWFuZGFyaW5vIDxmbWFuZGFyaW5vQGVuZHJlbGlhLmNvbT4KKyAqCQlFbmRyZWxpYSBUZWNobm9sb2dpZXMgSW5jLgorICogQ3JlYXRlZDoJTWFyIDMsIDIwMDYKKyAqCisgKiBCYXNlZCBvbiBweGEyeHgtcGNtLmMgYnk6CisgKgorICogQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiBDcmVhdGVkOglOb3YgMzAsIDIwMDQKKyAqIENvcHlyaWdodDoJKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfc3NjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9wZGMuaD4KKworI2luY2x1ZGUgImF0OTEtcGNtLmgiCisKKyNpZiAwCisjZGVmaW5lCURCRyh4Li4uKQlwcmludGsoS0VSTl9JTkZPICJhdDkxLXBjbTogIiB4KQorI2Vsc2UKKyNkZWZpbmUJREJHKHguLi4pCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGF0OTFfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UsCisJLmZvcm1hdHMJCT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJLnBlcmlvZF9ieXRlc19taW4JPSAzMiwKKwkucGVyaW9kX2J5dGVzX21heAk9IDgxOTIsCisJLnBlcmlvZHNfbWluCQk9IDIsCisJLnBlcmlvZHNfbWF4CQk9IDEwMjQsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSAzMiAqIDEwMjQsCit9OworCitzdHJ1Y3QgYXQ5MV9ydW50aW1lX2RhdGEgeworCXN0cnVjdCBhdDkxX3BjbV9kbWFfcGFyYW1zICpwYXJhbXM7CisJZG1hX2FkZHJfdCBkbWFfYnVmZmVyOwkJCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZG1hIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgZG1hX2J1ZmZlcl9lbmQ7CQkvKiBmaXJzdCBhZGRyZXNzIGJleW9uZCBETUEgYnVmZmVyICovCisJc2l6ZV90IHBlcmlvZF9zaXplOworCWRtYV9hZGRyX3QgcGVyaW9kX3B0cjsJCQkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIG5leHQgcGVyaW9kICovCisJdTMyIHBkY194cHJfc2F2ZTsJCQkvKiBQREMgcmVnaXN0ZXIgc2F2ZSAqLworCXUzMiBwZGNfeGNyX3NhdmU7CisJdTMyIHBkY194bnByX3NhdmU7CisJdTMyIHBkY194bmNyX3NhdmU7Cit9OworCitzdGF0aWMgdm9pZCBhdDkxX3BjbV9kbWFfaXJxKHUzMiBzc2Nfc3IsCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGF0OTFfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKnBhcmFtcyA9IHBydGQtPnBhcmFtczsKKwlzdGF0aWMgaW50IGNvdW50ID0gMDsKKworCWNvdW50Kys7CisKKwlpZiAoc3NjX3NyICYgcGFyYW1zLT5tYXNrLT5zc2NfZW5kYnVmKSB7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJImF0OTEtcGNtOiBidWZmZXIgJXMgb24gJXMgKFNTQ19TUj0lI3gsIGNvdW50PSVkKVxuIiwKKwkJCXN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sKKwkJCQk/ICJ1bmRlcnJ1biIgOiAib3ZlcnJ1biIsCisJCQlwYXJhbXMtPm5hbWUsIHNzY19zciwgY291bnQpOworCisJCS8qIHJlLXN0YXJ0IHRoZSBQREMgKi8KKwkJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfUERDX1BUQ1IsIHBhcmFtcy0+bWFzay0+cGRjX2Rpc2FibGUpOworCisJCXBydGQtPnBlcmlvZF9wdHIgKz0gcHJ0ZC0+cGVyaW9kX3NpemU7CisJCWlmIChwcnRkLT5wZXJpb2RfcHRyID49IHBydGQtPmRtYV9idWZmZXJfZW5kKSB7CisJCQlwcnRkLT5wZXJpb2RfcHRyID0gcHJ0ZC0+ZG1hX2J1ZmZlcjsKKwkJfQorCisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eHByLCBwcnRkLT5wZXJpb2RfcHRyKTsKKwkJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54Y3IsCisJCQkJcHJ0ZC0+cGVyaW9kX3NpemUgLyBwYXJhbXMtPnBkY194ZmVyX3NpemUpOworCisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBBVDkxX1BEQ19QVENSLCBwYXJhbXMtPm1hc2stPnBkY19lbmFibGUpOworCX0KKworCWlmIChzc2Nfc3IgJiBwYXJhbXMtPm1hc2stPnNzY19lbmR4KSB7CisKKwkJLyogTG9hZCB0aGUgUERDIG5leHQgcG9pbnRlciBhbmQgY291bnRlciByZWdpc3RlcnMgKi8KKwkJcHJ0ZC0+cGVyaW9kX3B0ciArPSBwcnRkLT5wZXJpb2Rfc2l6ZTsKKwkJaWYgKHBydGQtPnBlcmlvZF9wdHIgPj0gcHJ0ZC0+ZG1hX2J1ZmZlcl9lbmQpIHsKKwkJCXBydGQtPnBlcmlvZF9wdHIgPSBwcnRkLT5kbWFfYnVmZmVyOworCQl9CisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eG5wciwgcHJ0ZC0+cGVyaW9kX3B0cik7CisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eG5jciwKKwkJCQlwcnRkLT5wZXJpb2Rfc2l6ZSAvIHBhcmFtcy0+cGRjX3hmZXJfc2l6ZSk7CisJfQorCisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworfQorCitzdGF0aWMgaW50IGF0OTFfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBhdDkxX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisKKwkvKiB0aGlzIG1heSBnZXQgY2FsbGVkIHNldmVyYWwgdGltZXMgYnkgb3NzIGVtdWxhdGlvbgorCSAqIHdpdGggZGlmZmVyZW50IHBhcmFtcyAqLworCisJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKKwlydW50aW1lLT5kbWFfYnl0ZXMgPSBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyk7CisKKwlwcnRkLT5wYXJhbXMgPSBydGQtPmRhaS0+Y3B1X2RhaS0+ZG1hX2RhdGE7CisJcHJ0ZC0+cGFyYW1zLT5kbWFfaW50cl9oYW5kbGVyID0gYXQ5MV9wY21fZG1hX2lycTsKKworCXBydGQtPmRtYV9idWZmZXIgPSBydW50aW1lLT5kbWFfYWRkcjsKKwlwcnRkLT5kbWFfYnVmZmVyX2VuZCA9IHJ1bnRpbWUtPmRtYV9hZGRyICsgcnVudGltZS0+ZG1hX2J5dGVzOworCXBydGQtPnBlcmlvZF9zaXplID0gcGFyYW1zX3BlcmlvZF9ieXRlcyhwYXJhbXMpOworCisJREJHKCJod19wYXJhbXM6IERNQSBmb3IgJXMgaW5pdGlhbGl6ZWQgKGRtYV9ieXRlcz0lZCwgcGVyaW9kX3NpemU9JWQpXG4iLAorCQlwcnRkLT5wYXJhbXMtPm5hbWUsIHJ1bnRpbWUtPmRtYV9ieXRlcywgcHJ0ZC0+cGVyaW9kX3NpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0OTFfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGF0OTFfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKnBhcmFtcyA9IHBydGQtPnBhcmFtczsKKworCWlmIChwYXJhbXMgIT0gTlVMTCkgeworCQlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgQVQ5MV9QRENfUFRDUiwgcGFyYW1zLT5tYXNrLT5wZGNfZGlzYWJsZSk7CisJCXBydGQtPnBhcmFtcy0+ZG1hX2ludHJfaGFuZGxlciA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXQ5MV9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyAqcGFyYW1zID0gcHJ0ZC0+cGFyYW1zOworCisJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfU1NDX0lEUiwKKwkJCXBhcmFtcy0+bWFzay0+c3NjX2VuZHggfCBwYXJhbXMtPm1hc2stPnNzY19lbmRidWYpOworCisJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfUERDX1BUQ1IsIHBhcmFtcy0+bWFzay0+cGRjX2Rpc2FibGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0OTFfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXQ5MV9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyAqcGFyYW1zID0gcHJ0ZC0+cGFyYW1zOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlwcnRkLT5wZXJpb2RfcHRyID0gcHJ0ZC0+ZG1hX2J1ZmZlcjsKKworCQlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhwciwgcHJ0ZC0+cGVyaW9kX3B0cik7CisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eGNyLAorCQkJCXBydGQtPnBlcmlvZF9zaXplIC8gcGFyYW1zLT5wZGNfeGZlcl9zaXplKTsKKworCQlwcnRkLT5wZXJpb2RfcHRyICs9IHBydGQtPnBlcmlvZF9zaXplOworCQlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhucHIsIHBydGQtPnBlcmlvZF9wdHIpOworCQlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhuY3IsCisJCQkJcHJ0ZC0+cGVyaW9kX3NpemUgLyBwYXJhbXMtPnBkY194ZmVyX3NpemUpOworCisJCURCRygidHJpZ2dlcjogcGVyaW9kX3B0cj0lbHgsIHhwcj0lbHgsIHhjcj0lbGQsIHhucHI9JWx4LCB4bmNyPSVsZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKSBwcnRkLT5wZXJpb2RfcHRyLAorCQkJYXQ5MV9zc2NfcmVhZChwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhwciksCisJCQlhdDkxX3NzY19yZWFkKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eGNyKSwKKwkJCWF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54bnByKSwKKwkJCWF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54bmNyKSk7CisKKwkJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfU1NDX0lFUiwKKwkJCXBhcmFtcy0+bWFzay0+c3NjX2VuZHggfCBwYXJhbXMtPm1hc2stPnNzY19lbmRidWYpOworCisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBBVDkxX1BEQ19QVENSLCBwYXJhbXMtPm1hc2stPnBkY19lbmFibGUpOworCisJCURCRygic3I9JWx4IGltcj0lbHhcbiIsIGF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIEFUOTFfU1NDX1NSKSwKKwkJCQkJYXQ5MV9zc2NfcmVhZChwYXJhbXMtPnNzY19iYXNlICsgQVQ5MV9TU0NfSUVSKSk7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBBVDkxX1BEQ19QVENSLCBwYXJhbXMtPm1hc2stPnBkY19kaXNhYmxlKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBBVDkxX1BEQ19QVENSLCBwYXJhbXMtPm1hc2stPnBkY19lbmFibGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IGF0OTFfcGNtX3BvaW50ZXIoCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgYXQ5MV9ydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0OTFfcGNtX2RtYV9wYXJhbXMgKnBhcmFtcyA9IHBydGQtPnBhcmFtczsKKwlkbWFfYWRkcl90IHB0cjsKKwlzbmRfcGNtX3VmcmFtZXNfdCB4OworCisJcHRyID0gKGRtYV9hZGRyX3QpIGF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54cHIpOworCXggPSBieXRlc190b19mcmFtZXMocnVudGltZSwgcHRyIC0gcHJ0ZC0+ZG1hX2J1ZmZlcik7CisKKwlpZiAoeCA9PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJeCA9IDA7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBhdDkxX3J1bnRpbWVfZGF0YSAqcHJ0ZDsKKwlpbnQgcmV0ID0gMDsKKworCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmYXQ5MV9wY21faGFyZHdhcmUpOworCisJLyogZW5zdXJlIHRoYXQgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiBwZXJpb2Qgc2l6ZSAqLworCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlwcnRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0OTFfcnVudGltZV9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBydGQgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcHJ0ZDsKKworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0OTFfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhdDkxX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJa2ZyZWUocHJ0ZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJcmV0dXJuIGRtYV9tbWFwX3dyaXRlY29tYmluZShzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCB2bWEsCisJCQkJICAgICBydW50aW1lLT5kbWFfYXJlYSwKKwkJCQkgICAgIHJ1bnRpbWUtPmRtYV9hZGRyLAorCQkJCSAgICAgcnVudGltZS0+ZG1hX2J5dGVzKTsKK30KKworc3RydWN0IHNuZF9wY21fb3BzIGF0OTFfcGNtX29wcyA9IHsKKwkub3BlbgkJPSBhdDkxX3BjbV9vcGVuLAorCS5jbG9zZQkJPSBhdDkxX3BjbV9jbG9zZSwKKwkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcwk9IGF0OTFfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZQk9IGF0OTFfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUJPSBhdDkxX3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyCT0gYXQ5MV9wY21fdHJpZ2dlciwKKwkucG9pbnRlcgk9IGF0OTFfcGNtX3BvaW50ZXIsCisJLm1tYXAJCT0gYXQ5MV9wY21fbW1hcCwKK307CisKK3N0YXRpYyBpbnQgYXQ5MV9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihzdHJ1Y3Qgc25kX3BjbSAqcGNtLAorCWludCBzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOworCXNpemVfdCBzaXplID0gYXQ5MV9wY21faGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heDsKKworCWJ1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7CisJYnVmLT5kZXYuZGV2ID0gcGNtLT5jYXJkLT5kZXY7CisJYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWJ1Zi0+YXJlYSA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUocGNtLT5jYXJkLT5kZXYsIHNpemUsCisJCQkJCSAgICZidWYtPmFkZHIsIEdGUF9LRVJORUwpOworCisJREJHKCJwcmVhbGxvY2F0ZV9kbWFfYnVmZmVyOiBhcmVhPSVwLCBhZGRyPSVwLCBzaXplPSVkXG4iLAorCQkodm9pZCAqKSBidWYtPmFyZWEsCisJCSh2b2lkICopIGJ1Zi0+YWRkciwKKwkJc2l6ZSk7CisKKwlpZiAoIWJ1Zi0+YXJlYSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWYtPmJ5dGVzID0gc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU2NCBhdDkxX3BjbV9kbWFtYXNrID0gMHhmZmZmZmZmZjsKKworc3RhdGljIGludCBhdDkxX3BjbV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLAorCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqZGFpLCBzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCWludCByZXQgPSAwOworCisJaWYgKCFjYXJkLT5kZXYtPmRtYV9tYXNrKQorCQljYXJkLT5kZXYtPmRtYV9tYXNrID0gJmF0OTFfcGNtX2RtYW1hc2s7CisJaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQorCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZjsKKworCWlmIChkYWktPnBsYXliYWNrLmNoYW5uZWxzX21pbikgeworCQlyZXQgPSBhdDkxX3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKGRhaS0+Y2FwdHVyZS5jaGFubmVsc19taW4pIHsKKwkJcmV0ID0gYXQ5MV9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCisJCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhdDkxX3BjbV9mcmVlX2RtYV9idWZmZXJzKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWY7CisJaW50IHN0cmVhbTsKKworCWZvciAoc3RyZWFtID0gMDsgc3RyZWFtIDwgMjsgc3RyZWFtKyspIHsKKwkJc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtOworCQlpZiAoIXN1YnN0cmVhbSkKKwkJCWNvbnRpbnVlOworCisJCWJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJCWlmICghYnVmLT5hcmVhKQorCQkJY29udGludWU7CisKKwkJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKHBjbS0+Y2FyZC0+ZGV2LCBidWYtPmJ5dGVzLAorCQkJCSAgICAgIGJ1Zi0+YXJlYSwgYnVmLT5hZGRyKTsKKwkJYnVmLT5hcmVhID0gTlVMTDsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYXQ5MV9wY21fc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gZGFpLT5ydW50aW1lOworCXN0cnVjdCBhdDkxX3J1bnRpbWVfZGF0YSAqcHJ0ZDsKKwlzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyAqcGFyYW1zOworCisJaWYgKCFydW50aW1lKQorCQlyZXR1cm4gMDsKKworCXBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJcGFyYW1zID0gcHJ0ZC0+cGFyYW1zOworCisJLyogZGlzYWJsZSB0aGUgUERDIGFuZCBzYXZlIHRoZSBQREMgcmVnaXN0ZXJzICovCisKKwlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgQVQ5MV9QRENfUFRDUiwgcGFyYW1zLT5tYXNrLT5wZGNfZGlzYWJsZSk7CisKKwlwcnRkLT5wZGNfeHByX3NhdmUgID0gYXQ5MV9zc2NfcmVhZChwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhwcik7CisJcHJ0ZC0+cGRjX3hjcl9zYXZlICA9IGF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54Y3IpOworCXBydGQtPnBkY194bnByX3NhdmUgPSBhdDkxX3NzY19yZWFkKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eG5wcik7CisJcHJ0ZC0+cGRjX3huY3Jfc2F2ZSA9IGF0OTFfc3NjX3JlYWQocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54bmNyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0OTFfcGNtX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gZGFpLT5ydW50aW1lOworCXN0cnVjdCBhdDkxX3J1bnRpbWVfZGF0YSAqcHJ0ZDsKKwlzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyAqcGFyYW1zOworCisJaWYgKCFydW50aW1lKQorCQlyZXR1cm4gMDsKKworCXBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJcGFyYW1zID0gcHJ0ZC0+cGFyYW1zOworCisJLyogcmVzdG9yZSB0aGUgUERDIHJlZ2lzdGVycyBhbmQgZW5hYmxlIHRoZSBQREMgKi8KKwlhdDkxX3NzY193cml0ZShwYXJhbXMtPnNzY19iYXNlICsgcGFyYW1zLT5wZGMtPnhwciwgIHBydGQtPnBkY194cHJfc2F2ZSk7CisJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54Y3IsICBwcnRkLT5wZGNfeGNyX3NhdmUpOworCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBwYXJhbXMtPnBkYy0+eG5wciwgcHJ0ZC0+cGRjX3hucHJfc2F2ZSk7CisJYXQ5MV9zc2Nfd3JpdGUocGFyYW1zLT5zc2NfYmFzZSArIHBhcmFtcy0+cGRjLT54bmNyLCBwcnRkLT5wZGNfeG5jcl9zYXZlKTsKKworCWF0OTFfc3NjX3dyaXRlKHBhcmFtcy0+c3NjX2Jhc2UgKyBBVDkxX1BEQ19QVENSLCBwYXJhbXMtPm1hc2stPnBkY19lbmFibGUpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYXQ5MV9wY21fc3VzcGVuZAlOVUxMCisjZGVmaW5lIGF0OTFfcGNtX3Jlc3VtZQkJTlVMTAorI2VuZGlmCisKK3N0cnVjdCBzbmRfc29jX3BsYXRmb3JtIGF0OTFfc29jX3BsYXRmb3JtID0geworCS5uYW1lCQk9ICJhdDkxLWF1ZGlvIiwKKwkucGNtX29wcyAJPSAmYXQ5MV9wY21fb3BzLAorCS5wY21fbmV3CT0gYXQ5MV9wY21fbmV3LAorCS5wY21fZnJlZQk9IGF0OTFfcGNtX2ZyZWVfZG1hX2J1ZmZlcnMsCisJLnN1c3BlbmQJPSBhdDkxX3BjbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXQ5MV9wY21fcmVzdW1lLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoYXQ5MV9zb2NfcGxhdGZvcm0pOworCitNT0RVTEVfQVVUSE9SKCJGcmFuayBNYW5kYXJpbm8gPGZtYW5kYXJpbm9AZW5kcmVsaWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdG1lbCBBVDkxIFBDTSBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL2F0OTEtcGNtLmggYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLXBjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDBmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9hdDkxLXBjbS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBhdDkxLXBjbS5oIC0gQUxTQSBQQ00gaW50ZXJmYWNlIGZvciB0aGUgQXRtZWwgQVQ5MSBTb0MKKyAqCisgKiBBdXRob3I6CUZyYW5rIE1hbmRhcmlubyA8Zm1hbmRhcmlub0BlbmRyZWxpYS5jb20+CisgKgkJRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYy4KKyAqIENyZWF0ZWQ6CU1hciAzLCAyMDA2CisgKgorICogQmFzZWQgb24gcHhhMnh4LXBjbS5oIGJ5OgorICoKKyAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogQ3JlYXRlZDoJTm92IDMwLCAyMDA0CisgKiBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0FUOTFfUENNX0gKKyNkZWZpbmUgX0FUOTFfUENNX0gKKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKK3N0cnVjdCBhdDkxX3NzY19wZXJpcGggeworCXZvaWQgX19pb21lbQkqYmFzZTsKKwl1MzIJCXBpZDsKK307CisKKy8qCisgKiBSZWdpc3RlcnMgYW5kIHN0YXR1cyBiaXRzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IHRoZSBQQ00gZHJpdmVyLgorICovCitzdHJ1Y3QgYXQ5MV9wZGNfcmVncyB7CisJdW5zaWduZWQgaW50CXhwcjsJCS8qIFBEQyByZWN2L3RyYW5zIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQJeGNyOwkJLyogUERDIHJlY3YvdHJhbnMgY291bnRlciAqLworCXVuc2lnbmVkIGludAl4bnByOwkJLyogUERDIG5leHQgcmVjdi90cmFucyBwb2ludGVyICovCisJdW5zaWduZWQgaW50CXhuY3I7CQkvKiBQREMgbmV4dCByZWN2L3RyYW5zIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQJcHRjcjsJCS8qIFBEQyB0cmFuc2ZlciBjb250cm9sICovCit9OworCitzdHJ1Y3QgYXQ5MV9zc2NfbWFzayB7CisJdTMyCXNzY19lbmFibGU7CQkvKiBTU0MgcmVjdi90cmFucyBlbmFibGUgKi8KKwl1MzIJc3NjX2Rpc2FibGU7CQkvKiBTU0MgcmVjdi90cmFucyBkaXNhYmxlICovCisJdTMyCXNzY19lbmR4OwkJLyogU1NDIEVORFRYIG9yIEVORFJYICovCisJdTMyCXNzY19lbmRidWY7CQkvKiBTU0MgVFhCVUZFIG9yIFJYQlVGRiAqLworCXUzMglwZGNfZW5hYmxlOwkJLyogUERDIHJlY3YvdHJhbnMgZW5hYmxlICovCisJdTMyCXBkY19kaXNhYmxlOwkJLyogUERDIHJlY3YvdHJhbnMgZGlzYWJsZSAqLworfTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlLCBzaGFyZWQgYmV0d2VlbiB0aGUgUENNIGRyaXZlciBhbmQgdGhlIGludGVyZmFjZSwKKyAqIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgUENNIGRyaXZlciB0byBwZXJmb3JtIHRoZQorICogUERDIERNQSBvcGVyYXRpb24uICBBbGwgZmllbGRzIGV4Y2VwdCBkbWFfaW50cl9oYW5kbGVyKCkgYXJlIGluaXRpYWxpemVkCisgKiBieSB0aGUgaW50ZXJmYWNlLiAgVGhlIGRtc19pbnRyX2hhbmRsZXIoKSBwb2ludGVyIGlzIHNldCBieSB0aGUgUENNCisgKiBkcml2ZXIgYW5kIGNhbGxlZCBieSB0aGUgaW50ZXJmYWNlIFNTQyBpbnRlcnJ1cHQgaGFuZGxlciBpZiBpdCBpcworICogbm9uLU5VTEwuCisgKi8KK3N0cnVjdCBhdDkxX3BjbV9kbWFfcGFyYW1zIHsKKwljaGFyICpuYW1lOwkJCS8qIHN0cmVhbSBpZGVudGlmaWVyICovCisJaW50IHBkY194ZmVyX3NpemU7CQkvKiBQREMgY291bnRlciBpbmNyZW1lbnQgaW4gYnl0ZXMgKi8KKwl2b2lkIF9faW9tZW0gKnNzY19iYXNlOwkJLyogU1NDIGJhc2UgYWRkcmVzcyAqLworCXN0cnVjdCBhdDkxX3BkY19yZWdzICpwZGM7IC8qIFBEQyByZWNlaXZlIG9yIHRyYW5zbWl0IHJlZ2lzdGVycyAqLworCXN0cnVjdCBhdDkxX3NzY19tYXNrICptYXNrOy8qIFNTQyAmIFBEQyBzdGF0dXMgYml0cyAqLworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXZvaWQgKCpkbWFfaW50cl9oYW5kbGVyKSh1MzIsIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSBhdDkxX3NvY19wbGF0Zm9ybTsKKworI2RlZmluZSBhdDkxX3NzY19yZWFkKGEpCSgodW5zaWduZWQgbG9uZykgX19yYXdfcmVhZGwoYSkpCisjZGVmaW5lIGF0OTFfc3NjX3dyaXRlKGEsdikJX19yYXdfd3JpdGVsKCh2KSwoYSkpCisKKyNlbmRpZiAvKiBfQVQ5MV9QQ01fSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0OTEvZXRpX2IxX3dtODczMS5jIGIvc291bmQvc29jL2F0OTEvZXRpX2IxX3dtODczMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzlkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYXQ5MS9ldGlfYjFfd204NzMxLmMKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBldGlfYjFfd204NzMxICAtLSAgU29DIGF1ZGlvIGZvciBBVDkxUk05MjAwLWJhc2VkIEVuZHJlbGlhIEVUSV9CMSBib2FyZC4KKyAqCisgKiBBdXRob3I6CUZyYW5rIE1hbmRhcmlubyA8Zm1hbmRhcmlub0BlbmRyZWxpYS5jb20+CisgKgkJRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYy4KKyAqIENyZWF0ZWQ6CU1hciAyOSwgMjAwNgorICoKKyAqIEJhc2VkIG9uIGNvcmdpLmMgYnk6CisgKgorICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIENvcHlyaWdodCAyMDA1IE9wZW5lZGhhbmQgTHRkLgorICoKKyAqIEF1dGhvcnM6IExpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4KKyAqICAgICAgICAgIFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9waW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisKKyNpbmNsdWRlICIuLi9jb2RlY3Mvd204NzMxLmgiCisjaW5jbHVkZSAiYXQ5MS1wY20uaCIKKyNpbmNsdWRlICJhdDkxLWkycy5oIgorCisjaWYgMAorI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKEtFUk5fSU5GTyAiZXRpX2IxX3dtODczMTogIiB4KQorI2Vsc2UKKyNkZWZpbmUJREJHKHguLi4pCisjZW5kaWYKKworI2RlZmluZSBBVDkxX1BJT19URjEJKDEgPDwgKEFUOTFfUElOX1BCNiAtIFBJTl9CQVNFKSAlIDMyKQorI2RlZmluZSBBVDkxX1BJT19USzEJKDEgPDwgKEFUOTFfUElOX1BCNyAtIFBJTl9CQVNFKSAlIDMyKQorI2RlZmluZSBBVDkxX1BJT19URDEJKDEgPDwgKEFUOTFfUElOX1BCOCAtIFBJTl9CQVNFKSAlIDMyKQorI2RlZmluZSBBVDkxX1BJT19SRDEJKDEgPDwgKEFUOTFfUElOX1BCOSAtIFBJTl9CQVNFKSAlIDMyKQorI2RlZmluZSBBVDkxX1BJT19SSzEJKDEgPDwgKEFUOTFfUElOX1BCMTAgLSBQSU5fQkFTRSkgJSAzMikKKyNkZWZpbmUgQVQ5MV9QSU9fUkYxCSgxIDw8IChBVDkxX1BJTl9QQjExIC0gUElOX0JBU0UpICUgMzIpCisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpwY2sxX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrICpwbGxiX2NsazsKKworCitzdGF0aWMgaW50IGV0aV9iMV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+ZGFpLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IHJ0ZC0+ZGFpLT5jcHVfZGFpOworCWludCByZXQ7CisKKwkvKiBjcHUgY2xvY2sgaXMgdGhlIEFUOTEgbWFzdGVyIGNsb2NrIHNlbnQgdG8gdGhlIFNTQyAqLworCXJldCA9IGNwdV9kYWktPmRhaV9vcHMuc2V0X3N5c2NsayhjcHVfZGFpLCBBVDkxX1NZU0NMS19NQ0ssCisJCTYwMDAwMDAwLCBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGNvZGVjIHN5c3RlbSBjbG9jayBpcyBzdXBwbGllZCBieSBQQ0sxLCBzZXQgdG8gMTJNSHogKi8KKwlyZXQgPSBjb2RlY19kYWktPmRhaV9vcHMuc2V0X3N5c2Nsayhjb2RlY19kYWksIFdNODczMV9TWVNDTEssCisJCTEyMDAwMDAwLCBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFN0YXJ0IFBDSzEgY2xvY2suICovCisJY2xrX2VuYWJsZShwY2sxX2Nsayk7CisJREJHKCJwY2sxIHN0YXJ0ZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV0aV9iMV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwkvKiBTdG9wIFBDSzEgY2xvY2suICovCisJY2xrX2Rpc2FibGUocGNrMV9jbGspOworCURCRygicGNrMSBzdG9wcGVkXG4iKTsKK30KKworc3RhdGljIGludCBldGlfYjFfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+ZGFpLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IHJ0ZC0+ZGFpLT5jcHVfZGFpOworCWludCByZXQ7CisKKyNpZmRlZiBDT05GSUdfU05EX0FUOTFfU09DX0VUSV9TTEFWRQorCXVuc2lnbmVkIGludCByYXRlOworCWludCBjbXJfZGl2LCBwZXJpb2Q7CisKKwkvKiBzZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KKwlyZXQgPSBjb2RlY19kYWktPmRhaV9vcHMuc2V0X2ZtdChjb2RlY19kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CisJCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBzZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CisJCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFRoZSBTU0MgY2xvY2sgZGl2aWRlcnMgZGVwZW5kIG9uIHRoZSBzYW1wbGUgcmF0ZS4gIFRoZSBDTVIuRElWCisJICogZmllbGQgZGl2aWRlcyB0aGUgc3lzdGVtIG1hc3RlciBjbG9jayBNQ0sgdG8gZHJpdmUgdGhlIFNTQyBUSworCSAqIHNpZ25hbCB3aGljaCBwcm92aWRlcyB0aGUgY29kZWMgQkNMSy4gIFRoZSBUQ01SLlBFUklPRCBhbmQKKwkgKiBSQ01SLlBFUklPRCBmaWVsZHMgZnVydGhlciBkaXZpZGUgdGhlIEJDTEsgc2lnbmFsIHRvIGRyaXZlCisJICogdGhlIFNTQyBURiBhbmQgUkYgc2lnbmFscyB3aGljaCBwcm92aWRlIHRoZSBjb2RlYyBEQUNMUkMgYW5kCisJICogQURDTFJDIGNsb2Nrcy4KKwkgKgorCSAqIFRoZSBkaXZpZGVycyB3ZXJlIGRldGVybWluZWQgdGhyb3VnaCB0cmlhbCBhbmQgZXJyb3IsIHdoZXJlIGEKKwkgKiBDTVIuRElWIHZhbHVlIGlzIGNob3NlbiBzdWNoIHRoYXQgdGhlIHJlc3VsdGluZyBCQ0xLIHZhbHVlIGlzCisJICogZGl2aXNpYmxlLCBvciBhbG1vc3QgZGl2aXNpYmxlLCBieSAoMiAqIHNhbXBsZSByYXRlKSwgYW5kIHRoZW4KKwkgKiB0aGUgVENNUi5QRVJJT0Qgb3IgUkNNUi5QRVJJT0QgaXMgQkNMSyAvICgyICogc2FtcGxlIHJhdGUpIC0gMS4KKwkgKi8KKwlyYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgODAwMDoKKwkJY21yX2RpdiA9IDI1OwkvKiBCQ0xLID0gNjBNSHovKDIqMjUpID0gMS4yTUh6ICovCisJCXBlcmlvZCA9IDc0OwkvKiBMUkMgPSBCQ0xLLygyKig3NCsxKSkgPSA4MDAwSHogKi8KKwkJYnJlYWs7CisJY2FzZSAzMjAwMDoKKwkJY21yX2RpdiA9IDc7CS8qIEJDTEsgPSA2ME1Iei8oMio3KSB+PSA0LjI4NTcxNDI4TUh6ICovCisJCXBlcmlvZCA9IDY2OwkvKiBMUkMgPSBCQ0xLLygyKig2NisxKSkgPSAzMTk4Mi45NDJIeiAqLworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCQljbXJfZGl2ID0gMTM7CS8qIEJDTEsgPSA2ME1Iei8oMioxMykgfj0gMi4zMDc2OTIzTUh6ICovCisJCXBlcmlvZCA9IDIzOwkvKiBMUkMgPSBCQ0xLLygyKigyMysxKSkgPSA0ODA3Ni45MjNIeiAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ1bnN1cHBvcnRlZCByYXRlICVkIG9uIEVUSS1CMSBib2FyZFxuIiwgcmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHNldCB0aGUgTUNLIGRpdmlkZXIgZm9yIEJDTEsgKi8KKwlyZXQgPSBjcHVfZGFpLT5kYWlfb3BzLnNldF9jbGtkaXYoY3B1X2RhaSwgQVQ5MVNTQ19DTVJfRElWLCBjbXJfZGl2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCS8qIHNldCB0aGUgQkNMSyBkaXZpZGVyIGZvciBEQUNMUkMgKi8KKwkJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfY2xrZGl2KGNwdV9kYWksCisJCQkJCQlBVDkxU1NDX1RDTVJfUEVSSU9ELCBwZXJpb2QpOworCX0gZWxzZSB7CisJCS8qIHNldCB0aGUgQkNMSyBkaXZpZGVyIGZvciBBRENMUkMgKi8KKwkJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfY2xrZGl2KGNwdV9kYWksCisJCQkJCQlBVDkxU1NDX1JDTVJfUEVSSU9ELCBwZXJpb2QpOworCX0KKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworI2Vsc2UgLyogQ09ORklHX1NORF9BVDkxX1NPQ19FVElfU0xBVkUgKi8KKwkvKgorCSAqIENvZGVjIGluIE1hc3RlciBNb2RlLgorCSAqLworCisJLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gY29kZWNfZGFpLT5kYWlfb3BzLnNldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGNwdV9kYWktPmRhaV9vcHMuc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisjZW5kaWYgLyogQ09ORklHX1NORF9BVDkxX1NPQ19FVElfU0xBVkUgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGV0aV9iMV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBldGlfYjFfc3RhcnR1cCwKKwkuaHdfcGFyYW1zID0gZXRpX2IxX2h3X3BhcmFtcywKKwkuc2h1dGRvd24gPSBldGlfYjFfc2h1dGRvd24sCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBldGlfYjFfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX01JQygiSW50IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIkV4dCBTcGsiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppbnRlcmNvbltdWzNdID0geworCisJLyogc3BlYWtlciBjb25uZWN0ZWQgdG8gTEhQT1VUICovCisJeyJFeHQgU3BrIiwgTlVMTCwgIkxIUE9VVCJ9LAorCisJLyogbWljIGlzIGNvbm5lY3RlZCB0byBNaWMgSmFjaywgd2l0aCBXTTg3MzEgTWljIEJpYXMgKi8KKwl7Ik1JQ0lOIiwgTlVMTCwgIk1pYyBCaWFzIn0sCisJeyJNaWMgQmlhcyIsIE5VTEwsICJJbnQgTWljIn0sCisKKwkvKiB0ZXJtaW5hdG9yICovCisJe05VTEwsIE5VTEwsIE5VTEx9LAorfTsKKworLyoKKyAqIExvZ2ljIGZvciBhIHdtODczMSBhcyBjb25uZWN0ZWQgb24gYSBFbmRyZWxpYSBFVEktQjEgYm9hcmQuCisgKi8KK3N0YXRpYyBpbnQgZXRpX2IxX3dtODczMV9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaTsKKworCURCRygiZXRpX2IxX3dtODczMV9pbml0KCkgY2FsbGVkXG4iKTsKKworCS8qIEFkZCBzcGVjaWZpYyB3aWRnZXRzICovCisJZm9yKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldGlfYjFfZGFwbV93aWRnZXRzKTsgaSsrKSB7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbChjb2RlYywgJmV0aV9iMV9kYXBtX3dpZGdldHNbaV0pOworCX0KKworCS8qIFNldCB1cCBzcGVjaWZpYyBhdWRpbyBwYXRoIGludGVyY29ubmVjdHMgKi8KKwlmb3IoaSA9IDA7IGludGVyY29uW2ldWzBdICE9IE5VTEw7IGkrKykgeworCQlzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dChjb2RlYywgaW50ZXJjb25baV1bMF0sCisJCQlpbnRlcmNvbltpXVsxXSwgaW50ZXJjb25baV1bMl0pOworCX0KKworCS8qIG5vdCBjb25uZWN0ZWQgKi8KKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiUkxJTkVJTiIsIDApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJMTElORUlOIiwgMCk7CisKKwkvKiBhbHdheXMgY29ubmVjdGVkICovCisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkludCBNaWMiLCAxKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiRXh0IFNwayIsIDEpOworCisJc25kX3NvY19kYXBtX3N5bmNfZW5kcG9pbnRzKGNvZGVjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgZXRpX2IxX2RhaSA9IHsKKwkubmFtZSA9ICJXTTg3MzEiLAorCS5zdHJlYW1fbmFtZSA9ICJXTTg3MzEiLAorCS5jcHVfZGFpID0gJmF0OTFfaTJzX2RhaVsxXSwKKwkuY29kZWNfZGFpID0gJndtODczMV9kYWksCisJLmluaXQgPSBldGlfYjFfd204NzMxX2luaXQsCisJLm9wcyA9ICZldGlfYjFfb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX21hY2hpbmUgc25kX3NvY19tYWNoaW5lX2V0aV9iMSA9IHsKKwkubmFtZSA9ICJFVElfQjEiLAorCS5kYWlfbGluayA9ICZldGlfYjFfZGFpLAorCS5udW1fbGlua3MgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCB3bTg3MzFfc2V0dXBfZGF0YSBldGlfYjFfd204NzMxX3NldHVwID0geworCS5pMmNfYWRkcmVzcyA9IDB4MWEsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlIGV0aV9iMV9zbmRfZGV2ZGF0YSA9IHsKKwkubWFjaGluZSA9ICZzbmRfc29jX21hY2hpbmVfZXRpX2IxLAorCS5wbGF0Zm9ybSA9ICZhdDkxX3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfd204NzMxLAorCS5jb2RlY19kYXRhID0gJmV0aV9iMV93bTg3MzFfc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZXRpX2IxX3NuZF9kZXZpY2U7CisKK3N0YXRpYyBpbnQgX19pbml0IGV0aV9iMV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwl1MzIgc3NjX3Bpb19saW5lczsKKwlzdHJ1Y3QgYXQ5MV9zc2NfcGVyaXBoICpzc2MgPSBldGlfYjFfZGFpLmNwdV9kYWktPnByaXZhdGVfZGF0YTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKEFUOTFSTTkyMDBfQkFTRV9TU0MxLCBTWl8xNkssICJzb2MtYXVkaW8iKSkgeworCQlEQkcoIlNTQzEgbWVtb3J5IHJlZ2lvbiBpcyBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzc2MtPmJhc2UgPSBpb3JlbWFwKEFUOTFSTTkyMDBfQkFTRV9TU0MxLCBTWl8xNkspOworCWlmICghc3NjLT5iYXNlKSB7CisJCURCRygiU1NDMSBtZW1vcnkgaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfcmVsZWFzZV9tZW07CisJfQorCisJc3NjLT5waWQgPSBBVDkxUk05MjAwX0lEX1NTQzE7CisKKwlldGlfYjFfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOworCWlmICghZXRpX2IxX3NuZF9kZXZpY2UpIHsKKwkJREJHKCJwbGF0Zm9ybSBkZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfaW9fdW5tYXA7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZXRpX2IxX3NuZF9kZXZpY2UsICZldGlfYjFfc25kX2RldmRhdGEpOworCWV0aV9iMV9zbmRfZGV2ZGF0YS5kZXYgPSAmZXRpX2IxX3NuZF9kZXZpY2UtPmRldjsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoZXRpX2IxX3NuZF9kZXZpY2UpOworCWlmIChyZXQpIHsKKwkJREJHKCJwbGF0Zm9ybSBkZXZpY2UgYWRkIGZhaWxlZFxuIik7CisJCXBsYXRmb3JtX2RldmljZV9wdXQoZXRpX2IxX3NuZF9kZXZpY2UpOworCQlnb3RvIGZhaWxfaW9fdW5tYXA7CisJfQorCisgCXNzY19waW9fbGluZXMgPSBBVDkxX1BJT19URjEgfCBBVDkxX1BJT19USzEgfCBBVDkxX1BJT19URDEKKwkJCXwgQVQ5MV9QSU9fUkQxIC8qIHwgQVQ5MV9QSU9fUksxICovIHwgQVQ5MV9QSU9fUkYxOworCisJLyogUmVzZXQgYWxsIFBJTyByZWdpc3RlcnMgYW5kIGFzc2lnbiBsaW5lcyB0byBwZXJpcGhlcmFsIEEgKi8KKyAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9CICsgUElPX1BEUiwgIHNzY19waW9fbGluZXMpOworIAlhdDkxX3N5c193cml0ZShBVDkxX1BJT0IgKyBQSU9fT0RSLCAgc3NjX3Bpb19saW5lcyk7CisgCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQiArIFBJT19JRkRSLCBzc2NfcGlvX2xpbmVzKTsKKyAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9CICsgUElPX0NPRFIsIHNzY19waW9fbGluZXMpOworIAlhdDkxX3N5c193cml0ZShBVDkxX1BJT0IgKyBQSU9fSURSLCAgc3NjX3Bpb19saW5lcyk7CisgCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQiArIFBJT19NRERSLCBzc2NfcGlvX2xpbmVzKTsKKyAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QSU9CICsgUElPX1BVRFIsIHNzY19waW9fbGluZXMpOworIAlhdDkxX3N5c193cml0ZShBVDkxX1BJT0IgKyBQSU9fQVNSLCAgc3NjX3Bpb19saW5lcyk7CisgCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElPQiArIFBJT19PV0RSLCBzc2NfcGlvX2xpbmVzKTsKKworCS8qCisJICogU2V0IFBDSzEgcGFyZW50IHRvIFBMTEIgYW5kIGl0cyByYXRlIHRvIDEyIE1oei4KKwkgKi8KKwlwbGxiX2NsayA9IGNsa19nZXQoTlVMTCwgInBsbGIiKTsKKwlwY2sxX2NsayA9IGNsa19nZXQoTlVMTCwgInBjazEiKTsKKworCWNsa19zZXRfcGFyZW50KHBjazFfY2xrLCBwbGxiX2Nsayk7CisJY2xrX3NldF9yYXRlKHBjazFfY2xrLCAxMjAwMDAwMCk7CisKKwlEQkcoIk1DTEsgcmF0ZSAlbHVIelxuIiwgY2xrX2dldF9yYXRlKHBjazFfY2xrKSk7CisKKwkvKiBhc3NpZ24gdGhlIEdQSU8gcGluIHRvIFBDSzEgKi8KKwlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTI0LCAwKTsKKworI2lmZGVmIENPTkZJR19TTkRfQVQ5MV9TT0NfRVRJX1NMQVZFCisJcHJpbnRrKEtFUk5fSU5GTyAiZXRpX2IxX3dtODczMTogQ29kZWMgaW4gU2xhdmUgTW9kZVxuIik7CisjZWxzZQorCXByaW50ayhLRVJOX0lORk8gImV0aV9iMV93bTg3MzE6IENvZGVjIGluIE1hc3RlciBNb2RlXG4iKTsKKyNlbmRpZgorCXJldHVybiByZXQ7CisKK2ZhaWxfaW9fdW5tYXA6CisJaW91bm1hcChzc2MtPmJhc2UpOworZmFpbF9yZWxlYXNlX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24oQVQ5MVJNOTIwMF9CQVNFX1NTQzEsIFNaXzE2Syk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV0aV9iMV9leGl0KHZvaWQpCit7CisJc3RydWN0IGF0OTFfc3NjX3BlcmlwaCAqc3NjID0gZXRpX2IxX2RhaS5jcHVfZGFpLT5wcml2YXRlX2RhdGE7CisKKwljbGtfcHV0KHBjazFfY2xrKTsKKwljbGtfcHV0KHBsbGJfY2xrKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGV0aV9iMV9zbmRfZGV2aWNlKTsKKworCWlvdW5tYXAoc3NjLT5iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oQVQ5MVJNOTIwMF9CQVNFX1NTQzEsIFNaXzE2Syk7Cit9CisKK21vZHVsZV9pbml0KGV0aV9iMV9pbml0KTsKK21vZHVsZV9leGl0KGV0aV9iMV9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJGcmFuayBNYW5kYXJpbm8gPGZtYW5kYXJpbm9AZW5kcmVsaWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBFVEktQjEtV004NzMxIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhYzI2OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwpAQCAtMCwwICsxLDE1IEBACitjb25maWcgU05EX1NPQ19BQzk3X0NPREVDCisJdHJpc3RhdGUKKwlkZXBlbmRzIFNORF9TT0MKKworY29uZmlnIFNORF9TT0NfV004NzMxCisJdHJpc3RhdGUKKwlkZXBlbmRzIFNORF9TT0MKKworY29uZmlnIFNORF9TT0NfV004NzUwCisJdHJpc3RhdGUKKwlkZXBlbmRzIFNORF9TT0MKKworY29uZmlnIFNORF9TT0NfV005NzEyCisJdHJpc3RhdGUKKwlkZXBlbmRzIFNORF9TT0MKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNDlhNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorc25kLXNvYy1hYzk3LW9ianMgOj0gYWM5Ny5vCitzbmQtc29jLXdtODczMS1vYmpzIDo9IHdtODczMS5vCitzbmQtc29jLXdtODc1MC1vYmpzIDo9IHdtODc1MC5vCitzbmQtc29jLXdtOTcxMi1vYmpzIDo9IHdtOTcxMi5vCisKK29iai0kKENPTkZJR19TTkRfU09DX0FDOTdfQ09ERUMpCSs9IHNuZC1zb2MtYWM5Ny5vCitvYmotJChDT05GSUdfU05EX1NPQ19XTTg3MzEpCSs9IHNuZC1zb2Mtd204NzMxLm8KK29iai0kKENPTkZJR19TTkRfU09DX1dNODc1MCkJKz0gc25kLXNvYy13bTg3NTAubworb2JqLSQoQ09ORklHX1NORF9TT0NfV005NzEyKQkrPSBzbmQtc29jLXdtOTcxMi5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YmM1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIGFjOTcuYyAgLS0gIEFMU0EgU29jIEFDOTcgY29kZWMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMTd0aCBPY3QgMjAwNSAgIEluaXRpYWwgdmVyc2lvbi4KKyAqCisgKiBHZW5lcmljIEFDOTcgc3VwcG9ydC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCisjZGVmaW5lIEFDOTdfVkVSU0lPTiAiMC42IgorCitzdGF0aWMgaW50IGFjOTdfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwlpbnQgcmVnID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spID8KKwkJICBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSA6IEFDOTdfUENNX0xSX0FEQ19SQVRFOworCXJldHVybiBzbmRfYWM5N19zZXRfcmF0ZShjb2RlYy0+YWM5NywgcmVnLCBydW50aW1lLT5yYXRlKTsKK30KKworI2RlZmluZSBTVERfQUM5N19SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHxcCisJCVNORFJWX1BDTV9SQVRFXzIyMDUwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCkKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSBhYzk3X2RhaSA9IHsKKwkubmFtZSA9ICJBQzk3IEhpRmkiLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkFDOTcgUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNURF9BQzk3X1JBVEVTLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLH0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJBQzk3IENhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFNURF9BQzk3X1JBVEVTLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLH0sCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSBhYzk3X3ByZXBhcmUsfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWM5N19yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiBzb2NfYWM5N19vcHMucmVhZChjb2RlYy0+YWM5NywgcmVnKTsKK30KKworc3RhdGljIGludCBhYzk3X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwl1bnNpZ25lZCBpbnQgdmFsKQoreworCXNvY19hYzk3X29wcy53cml0ZShjb2RlYy0+YWM5NywgcmVnLCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjOTdfc29jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHNuZF9hYzk3X2J1cyAqYWM5N19idXM7CisJc3RydWN0IHNuZF9hYzk3X3RlbXBsYXRlIGFjOTdfdGVtcGxhdGU7CisJaW50IHJldCA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJBQzk3IFNvQyBBdWRpbyBDb2RlYyAlc1xuIiwgQUM5N19WRVJTSU9OKTsKKworCXNvY2Rldi0+Y29kZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyksIEdGUF9LRVJORUwpOworCWlmIChzb2NkZXYtPmNvZGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwltdXRleF9pbml0KCZjb2RlYy0+bXV0ZXgpOworCisJY29kZWMtPm5hbWUgPSAiQUM5NyI7CisJY29kZWMtPm93bmVyID0gVEhJU19NT0RVTEU7CisJY29kZWMtPmRhaSA9ICZhYzk3X2RhaTsKKwljb2RlYy0+bnVtX2RhaSA9IDE7CisJY29kZWMtPndyaXRlID0gYWM5N193cml0ZTsKKwljb2RlYy0+cmVhZCA9IGFjOTdfcmVhZDsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fd2lkZ2V0cyk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3BhdGhzKTsKKworCS8qIHJlZ2lzdGVyIHBjbXMgKi8KKwlyZXQgPSBzbmRfc29jX25ld19wY21zKHNvY2RldiwgU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEpOworCWlmKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJLyogYWRkIGNvZGVjIGFzIGJ1cyBkZXZpY2UgZm9yIHN0YW5kYXJkIGFjOTcgKi8KKwlyZXQgPSBzbmRfYWM5N19idXMoY29kZWMtPmNhcmQsIDAsICZzb2NfYWM5N19vcHMsIE5VTEwsICZhYzk3X2J1cyk7CisJaWYocmV0IDwgMCkKKwkJZ290byBidXNfZXJyOworCisJbWVtc2V0KCZhYzk3X3RlbXBsYXRlLCAwLCBzaXplb2Yoc3RydWN0IHNuZF9hYzk3X3RlbXBsYXRlKSk7CisJcmV0ID0gc25kX2FjOTdfbWl4ZXIoYWM5N19idXMsICZhYzk3X3RlbXBsYXRlLCAmY29kZWMtPmFjOTcpOworCWlmKHJldCA8IDApCisJCWdvdG8gYnVzX2VycjsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChzb2NkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGJ1c19lcnI7CisJcmV0dXJuIDA7CisKK2J1c19lcnI6CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKworZXJyOgorCWtmcmVlKHNvY2Rldi0+Y29kZWMtPnJlZ19jYWNoZSk7CisJa2ZyZWUoc29jZGV2LT5jb2RlYyk7CisJc29jZGV2LT5jb2RlYyA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhYzk3X3NvY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwlpZihjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CisJa2ZyZWUoc29jZGV2LT5jb2RlYy0+cmVnX2NhY2hlKTsKKwlrZnJlZShzb2NkZXYtPmNvZGVjKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl9hYzk3PSB7CisJLnByb2JlID0gCWFjOTdfc29jX3Byb2JlLAorCS5yZW1vdmUgPSAJYWM5N19zb2NfcmVtb3ZlLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoc29jX2NvZGVjX2Rldl9hYzk3KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb2MgR2VuZXJpYyBBQzk3IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hYzk3LmggYi9zb3VuZC9zb2MvY29kZWNzL2FjOTcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBkZGZjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hYzk3LmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGxpbnV4L3NvdW5kL2NvZGVjcy9hYzk3LmggLS0gQUxTQSBTb0MgTGF5ZXIKKyAqCisgKiBBdXRob3I6CQlMaWFtIEdpcmR3b29kCisgKiBDcmVhdGVkOgkJRGVjIDFzdCAyMDA1CisgKiBDb3B5cmlnaHQ6CVdvbGZzb24gTWljcm9lbGVjdHJvbmljcy4gUExDLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1NORF9TT0NfQUM5N19ICisjZGVmaW5lIF9fTElOVVhfU05EX1NPQ19BQzk3X0gKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X2FjOTc7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMGI1MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKQEAgLTAsMCArMSw3NTggQEAKKy8qCisgKiB3bTg3MzEuYyAgLS0gIFdNODczMSBBTFNBIFNvQyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3I6IFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqIEJhc2VkIG9uIHdtODc1My5jIGJ5IExpYW0gR2lyZHdvb2QKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgIndtODczMS5oIgorCisjZGVmaW5lIEFVRElPX05BTUUgIndtODczMSIKKyNkZWZpbmUgV004NzMxX1ZFUlNJT04gIjAuMTMiCisKKy8qCisgKiBEZWJ1ZworICovCisKKyNkZWZpbmUgV004NzMxX0RFQlVHIDAKKworI2lmZGVmIFdNODczMV9ERUJVRworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBBVURJT19OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0VSUiBBVURJT19OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9JTkZPIEFVRElPX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX1dBUk5JTkcgQVVESU9fTkFNRSAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl93bTg3MzE7CisKKy8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLworc3RydWN0IHdtODczMV9wcml2IHsKKwl1bnNpZ25lZCBpbnQgc3lzY2xrOworfTsKKworLyoKKyAqIHdtODczMSByZWdpc3RlciBjYWNoZQorICogV2UgY2FuJ3QgcmVhZCB0aGUgV004NzMxIHJlZ2lzdGVyIHNwYWNlIHdoZW4gd2UgYXJlCisgKiB1c2luZyAyIHdpcmUgZm9yIGRldmljZSBjb250cm9sLCBzbyB3ZSBjYWNoZSB0aGVtIGluc3RlYWQuCisgKiBUaGVyZSBpcyBubyBwb2ludCBpbiBjYWNoaW5nIHRoZSByZXNldCByZWdpc3RlcgorICovCitzdGF0aWMgY29uc3QgdTE2IHdtODczMV9yZWdbV004NzMxX0NBQ0hFUkVHTlVNXSA9IHsKKyAgICAweDAwOTcsIDB4MDA5NywgMHgwMDc5LCAweDAwNzksCisgICAgMHgwMDBhLCAweDAwMDgsIDB4MDA5ZiwgMHgwMDBhLAorICAgIDB4MDAwMCwgMHgwMDAwCit9OworCisvKgorICogcmVhZCB3bTg3MzEgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgd204NzMxX3JlYWRfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnKQoreworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCWlmIChyZWcgPT0gV004NzMxX1JFU0VUKQorCQlyZXR1cm4gMDsKKwlpZiAocmVnID49IFdNODczMV9DQUNIRVJFR05VTSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBjYWNoZVtyZWddOworfQorCisvKgorICogd3JpdGUgd204NzMxIHJlZ2lzdGVyIGNhY2hlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3bTg3MzFfd3JpdGVfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1MTYgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisJaWYgKHJlZyA+PSBXTTg3MzFfQ0FDSEVSRUdOVU0pCisJCXJldHVybjsKKwljYWNoZVtyZWddID0gdmFsdWU7Cit9CisKKy8qCisgKiB3cml0ZSB0byB0aGUgV004NzMxIHJlZ2lzdGVyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgd204NzMxX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwl1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdTggZGF0YVsyXTsKKworCS8qIGRhdGEgaXMKKwkgKiAgIEQxNS4uRDkgV004NzMxIHJlZ2lzdGVyIG9mZnNldAorCSAqICAgRDguLi5EMCByZWdpc3RlciBkYXRhCisJICovCisJZGF0YVswXSA9IChyZWcgPDwgMSkgfCAoKHZhbHVlID4+IDgpICYgMHgwMDAxKTsKKwlkYXRhWzFdID0gdmFsdWUgJiAweDAwZmY7CisKKwl3bTg3MzFfd3JpdGVfcmVnX2NhY2hlIChjb2RlYywgcmVnLCB2YWx1ZSk7CisJaWYgKGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKSA9PSAyKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtRUlPOworfQorCisjZGVmaW5lIHdtODczMV9yZXNldChjKQl3bTg3MzFfd3JpdGUoYywgV004NzMxX1JFU0VULCAwKQorCitzdGF0aWMgY29uc3QgY2hhciAqd204NzMxX2lucHV0X3NlbGVjdFtdID0geyJMaW5lIEluIiwgIk1pYyJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODczMV9kZWVtcGhbXSA9IHsiTm9uZSIsICIzMktoeiIsICI0NC4xS2h6IiwgIjQ4S2h6In07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204NzMxX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEUoV004NzMxX0FQQU5BLCAyLCAyLCB3bTg3MzFfaW5wdXRfc2VsZWN0KSwKKwlTT0NfRU5VTV9TSU5HTEUoV004NzMxX0FQRElHSSwgMSwgNCwgd204NzMxX2RlZW1waCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzMxX3NuZF9jb250cm9sc1tdID0geworCitTT0NfRE9VQkxFX1IoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCBXTTg3MzFfTE9VVDFWLCBXTTg3MzFfUk9VVDFWLAorCTAsIDEyNywgMCksCitTT0NfRE9VQkxFX1IoIk1hc3RlciBQbGF5YmFjayBaQyBTd2l0Y2giLCBXTTg3MzFfTE9VVDFWLCBXTTg3MzFfUk9VVDFWLAorCTcsIDEsIDApLAorCitTT0NfRE9VQkxFX1IoIkNhcHR1cmUgVm9sdW1lIiwgV004NzMxX0xJTlZPTCwgV004NzMxX1JJTlZPTCwgMCwgMzEsIDApLAorU09DX0RPVUJMRV9SKCJMaW5lIENhcHR1cmUgU3dpdGNoIiwgV004NzMxX0xJTlZPTCwgV004NzMxX1JJTlZPTCwgNywgMSwgMSksCisKK1NPQ19TSU5HTEUoIk1pYyBCb29zdCAoKzIwZEIpIiwgV004NzMxX0FQQU5BLCAwLCAxLCAwKSwKK1NPQ19TSU5HTEUoIkNhcHR1cmUgTWljIFN3aXRjaCIsIFdNODczMV9BUEFOQSwgMSwgMSwgMSksCisKK1NPQ19TSU5HTEUoIlNpZGV0b25lIFBsYXliYWNrIFZvbHVtZSIsIFdNODczMV9BUEFOQSwgNiwgMywgMSksCisKK1NPQ19TSU5HTEUoIkFEQyBIaWdoIFBhc3MgRmlsdGVyIFN3aXRjaCIsIFdNODczMV9BUERJR0ksIDAsIDEsIDEpLAorU09DX1NJTkdMRSgiU3RvcmUgREMgT2Zmc2V0IFN3aXRjaCIsIFdNODczMV9BUERJR0ksIDQsIDEsIDApLAorCitTT0NfRU5VTSgiUGxheWJhY2sgRGUtZW1waGFzaXMiLCB3bTg3MzFfZW51bVsxXSksCit9OworCisvKiBhZGQgbm9uIGRhcG0gY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgd204NzMxX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGVyciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9zbmRfY29udHJvbHMpOyBpKyspIHsKKwkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKKwkJCQlzbmRfc29jX2NuZXcoJndtODczMV9zbmRfY29udHJvbHNbaV0sY29kZWMsIE5VTEwpKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogT3V0cHV0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzMxX291dHB1dF9taXhlcl9jb250cm9sc1tdID0geworU09DX0RBUE1fU0lOR0xFKCJMaW5lIEJ5cGFzcyBTd2l0Y2giLCBXTTg3MzFfQVBBTkEsIDMsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJNaWMgU2lkZXRvbmUgU3dpdGNoIiwgV004NzMxX0FQQU5BLCA1LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiSGlGaSBQbGF5YmFjayBTd2l0Y2giLCBXTTg3MzFfQVBBTkEsIDQsIDEsIDApLAorfTsKKworLyogSW5wdXQgbXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzMxX2lucHV0X211eF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJJbnB1dCBTZWxlY3QiLCB3bTg3MzFfZW51bVswXSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3MzFfZGFwbV93aWRnZXRzW10gPSB7CitTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBNaXhlciIsIFdNODczMV9QV1IsIDQsIDEsCisJJndtODczMV9vdXRwdXRfbWl4ZXJfY29udHJvbHNbMF0sCisJQVJSQVlfU0laRSh3bTg3MzFfb3V0cHV0X21peGVyX2NvbnRyb2xzKSksCitTTkRfU09DX0RBUE1fREFDKCJEQUMiLCAiSGlGaSBQbGF5YmFjayIsIFdNODczMV9QV1IsIDMsIDEpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiTE9VVCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiTEhQT1VUIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJST1VUIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJSSFBPVVQiKSwKK1NORF9TT0NfREFQTV9BREMoIkFEQyIsICJIaUZpIENhcHR1cmUiLCBXTTg3MzFfUFdSLCAyLCAxKSwKK1NORF9TT0NfREFQTV9NVVgoIklucHV0IE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJndtODczMV9pbnB1dF9tdXhfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX1BHQSgiTGluZSBJbnB1dCIsIFdNODczMV9QV1IsIDAsIDEsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX01JQ0JJQVMoIk1pYyBCaWFzIiwgV004NzMxX1BXUiwgMSwgMSksCitTTkRfU09DX0RBUE1fSU5QVVQoIk1JQ0lOIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIlJMSU5FSU4iKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTExJTkVJTiIpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmludGVyY29uW11bM10gPSB7CisJLyogb3V0cHV0IG1peGVyICovCisJeyJPdXRwdXQgTWl4ZXIiLCAiTGluZSBCeXBhc3MgU3dpdGNoIiwgIkxpbmUgSW5wdXQifSwKKwl7Ik91dHB1dCBNaXhlciIsICJIaUZpIFBsYXliYWNrIFN3aXRjaCIsICJEQUMifSwKKwl7Ik91dHB1dCBNaXhlciIsICJNaWMgU2lkZXRvbmUgU3dpdGNoIiwgIk1pYyBCaWFzIn0sCisKKwkvKiBvdXRwdXRzICovCisJeyJSSFBPVVQiLCBOVUxMLCAiT3V0cHV0IE1peGVyIn0sCisJeyJST1VUIiwgTlVMTCwgIk91dHB1dCBNaXhlciJ9LAorCXsiTEhQT1VUIiwgTlVMTCwgIk91dHB1dCBNaXhlciJ9LAorCXsiTE9VVCIsIE5VTEwsICJPdXRwdXQgTWl4ZXIifSwKKworCS8qIGlucHV0IG11eCAqLworCXsiSW5wdXQgTXV4IiwgIkxpbmUgSW4iLCAiTGluZSBJbnB1dCJ9LAorCXsiSW5wdXQgTXV4IiwgIk1pYyIsICJNaWMgQmlhcyJ9LAorCXsiQURDIiwgTlVMTCwgIklucHV0IE11eCJ9LAorCisJLyogaW5wdXRzICovCisJeyJMaW5lIElucHV0IiwgTlVMTCwgIkxMSU5FSU4ifSwKKwl7IkxpbmUgSW5wdXQiLCBOVUxMLCAiUkxJTkVJTiJ9LAorCXsiTWljIEJpYXMiLCBOVUxMLCAiTUlDSU4ifSwKKworCS8qIHRlcm1pbmF0b3IgKi8KKwl7TlVMTCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgaW50IHdtODczMV9hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9kYXBtX3dpZGdldHMpOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd204NzMxX2RhcG1fd2lkZ2V0c1tpXSk7CisJfQorCisJLyogc2V0IHVwIGF1ZGlvIHBhdGggaW50ZXJjb25uZWN0cyAqLworCWZvcihpID0gMDsgaW50ZXJjb25baV1bMF0gIT0gTlVMTDsgaSsrKSB7CisJCXNuZF9zb2NfZGFwbV9jb25uZWN0X2lucHV0KGNvZGVjLCBpbnRlcmNvbltpXVswXSwKKwkJCWludGVyY29uW2ldWzFdLCBpbnRlcmNvbltpXVsyXSk7CisJfQorCisJc25kX3NvY19kYXBtX25ld193aWRnZXRzKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IF9jb2VmZl9kaXYgeworCXUzMiBtY2xrOworCXUzMiByYXRlOworCXUxNiBmczsKKwl1OCBzcjo0OworCXU4IGJvc3I6MTsKKwl1OCB1c2I6MTsKK307CisKKy8qIGNvZGVjIG1jbGsgY2xvY2sgZGl2aWRlciBjb2VmZmljaWVudHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgX2NvZWZmX2RpdiBjb2VmZl9kaXZbXSA9IHsKKwkvKiA0OGsgKi8KKwl7MTIyODgwMDAsIDQ4MDAwLCAyNTYsIDB4MCwgMHgwLCAweDB9LAorCXsxODQzMjAwMCwgNDgwMDAsIDM4NCwgMHgwLCAweDEsIDB4MH0sCisJezEyMDAwMDAwLCA0ODAwMCwgMjUwLCAweDAsIDB4MCwgMHgxfSwKKworCS8qIDMyayAqLworCXsxMjI4ODAwMCwgMzIwMDAsIDM4NCwgMHg2LCAweDAsIDB4MH0sCisJezE4NDMyMDAwLCAzMjAwMCwgNTc2LCAweDYsIDB4MSwgMHgwfSwKKwl7MTIwMDAwMDAsIDMyMDAwLCAzNzUsIDB4NiwgMHgwLCAweDF9LAorCisJLyogOGsgKi8KKwl7MTIyODgwMDAsIDgwMDAsIDE1MzYsIDB4MywgMHgwLCAweDB9LAorCXsxODQzMjAwMCwgODAwMCwgMjMwNCwgMHgzLCAweDEsIDB4MH0sCisJezExMjg5NjAwLCA4MDAwLCAxNDA4LCAweGIsIDB4MCwgMHgwfSwKKwl7MTY5MzQ0MDAsIDgwMDAsIDIxMTIsIDB4YiwgMHgxLCAweDB9LAorCXsxMjAwMDAwMCwgODAwMCwgMTUwMCwgMHgzLCAweDAsIDB4MX0sCisKKwkvKiA5NmsgKi8KKwl7MTIyODgwMDAsIDk2MDAwLCAxMjgsIDB4NywgMHgwLCAweDB9LAorCXsxODQzMjAwMCwgOTYwMDAsIDE5MiwgMHg3LCAweDEsIDB4MH0sCisJezEyMDAwMDAwLCA5NjAwMCwgMTI1LCAweDcsIDB4MCwgMHgxfSwKKworCS8qIDQ0LjFrICovCisJezExMjg5NjAwLCA0NDEwMCwgMjU2LCAweDgsIDB4MCwgMHgwfSwKKwl7MTY5MzQ0MDAsIDQ0MTAwLCAzODQsIDB4OCwgMHgxLCAweDB9LAorCXsxMjAwMDAwMCwgNDQxMDAsIDI3MiwgMHg4LCAweDEsIDB4MX0sCisKKwkvKiA4OC4yayAqLworCXsxMTI4OTYwMCwgODgyMDAsIDEyOCwgMHhmLCAweDAsIDB4MH0sCisJezE2OTM0NDAwLCA4ODIwMCwgMTkyLCAweGYsIDB4MSwgMHgwfSwKKwl7MTIwMDAwMDAsIDg4MjAwLCAxMzYsIDB4ZiwgMHgxLCAweDF9LAorfTsKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2NvZWZmKGludCBtY2xrLCBpbnQgcmF0ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZWZmX2Rpdik7IGkrKykgeworCQlpZiAoY29lZmZfZGl2W2ldLnJhdGUgPT0gcmF0ZSAmJiBjb2VmZl9kaXZbaV0ubWNsayA9PSBtY2xrKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczMV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlzdHJ1Y3Qgd204NzMxX3ByaXYgKndtODczMSA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJdTE2IGlmYWNlID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfSUZBQ0UpICYgMHhmZmYzOworCWludCBpID0gZ2V0X2NvZWZmKHdtODczMS0+c3lzY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwl1MTYgc3JhdGUgPSAoY29lZmZfZGl2W2ldLnNyIDw8IDIpIHwKKwkJKGNvZWZmX2RpdltpXS5ib3NyIDw8IDEpIHwgY29lZmZfZGl2W2ldLnVzYjsKKworCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX1NSQVRFLCBzcmF0ZSk7CisKKwkvKiBiaXQgc2l6ZSAqLworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCWlmYWNlIHw9IDB4MDAwNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJaWZhY2UgfD0gMHgwMDA4OworCQlicmVhazsKKwl9CisKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9JRkFDRSwgaWZhY2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczMV9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCisJLyogc2V0IGFjdGl2ZSAqLworCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX0FDVElWRSwgMHgwMDAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3bTg3MzFfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCS8qIGRlYWN0aXZhdGUgKi8KKwlpZiAoIWNvZGVjLT5hY3RpdmUpIHsKKwkJdWRlbGF5KDUwKTsKKwkJd204NzMxX3dyaXRlKGNvZGVjLCBXTTg3MzFfQUNUSVZFLCAweDApOworCX0KK30KKworc3RhdGljIGludCB3bTg3MzFfbXV0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1MTYgbXV0ZV9yZWcgPSB3bTg3MzFfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODczMV9BUERJR0kpICYgMHhmZmY3OworCisJaWYgKG11dGUpCisJCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX0FQRElHSSwgbXV0ZV9yZWcgfCAweDgpOworCWVsc2UKKwkJd204NzMxX3dyaXRlKGNvZGVjLCBXTTg3MzFfQVBESUdJLCBtdXRlX3JlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzMxX3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpLAorCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXN0cnVjdCB3bTg3MzFfcHJpdiAqd204NzMxID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoZnJlcSkgeworCWNhc2UgMTEyODk2MDA6CisJY2FzZSAxMjAwMDAwMDoKKwljYXNlIDEyMjg4MDAwOgorCWNhc2UgMTY5MzQ0MDA6CisJY2FzZSAxODQzMjAwMDoKKwkJd204NzMxLT5zeXNjbGsgPSBmcmVxOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworc3RhdGljIGludCB3bTg3MzFfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWksCisJCXVuc2lnbmVkIGludCBmbXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwl1MTYgaWZhY2UgPSAwOworCisJLyogc2V0IG1hc3Rlci9zbGF2ZSBhdWRpbyBpbnRlcmZhY2UgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQlpZmFjZSB8PSAweDAwNDA7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaW50ZXJmYWNlIGZvcm1hdCAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJaWZhY2UgfD0gMHgwMDAyOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQlpZmFjZSB8PSAweDAwMDE7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJCWlmYWNlIHw9IDB4MDAwMzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJaWZhY2UgfD0gMHgwMDEzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjbG9jayBpbnZlcnNpb24gKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJaWZhY2UgfD0gMHgwMDkwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQlpZmFjZSB8PSAweDAwODA7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfSUY6CisJCWlmYWNlIHw9IDB4MDAxMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc2V0IGlmYWNlICovCisJd204NzMxX3dyaXRlKGNvZGVjLCBXTTg3MzFfSUZBQ0UsIGlmYWNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg3MzFfZGFwbV9ldmVudChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBldmVudCkKK3sKKwl1MTYgcmVnID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfUFdSKSAmIDB4ZmY3ZjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMDogLyogZnVsbCBPbiAqLworCQkvKiB2cmVmL21pZCwgb3NjIG9uLCBkYWMgdW5tdXRlICovCisJCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX1BXUiwgcmVnKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDE6IC8qIHBhcnRpYWwgT24gKi8KKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMjogLyogcGFydGlhbCBPbiAqLworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2hvdDogLyogT2ZmLCB3aXRoIHBvd2VyICovCisJCS8qIGV2ZXJ5dGhpbmcgb2ZmIGV4Y2VwdCB2cmVmL3ZtaWQsICovCisJCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX1BXUiwgcmVnIHwgMHgwMDQwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDNjb2xkOiAvKiBPZmYsIHdpdGhvdXQgcG93ZXIgKi8KKwkJLyogZXZlcnl0aGluZyBvZmYsIGRhYyBtdXRlLCBpbmFjdGl2ZSAqLworCQl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9BQ1RJVkUsIDB4MCk7CisJCXdtODczMV93cml0ZShjb2RlYywgV004NzMxX1BXUiwgMHhmZmZmKTsKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5kYXBtX3N0YXRlID0gZXZlbnQ7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgV004NzMxX1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfFwKKwkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8XAorCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHxcCisJCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfFwKKwkJU05EUlZfUENNX1JBVEVfOTYwMDApCisKKyNkZWZpbmUgV004NzMxX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHxcCisJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCisKK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSB3bTg3MzFfZGFpID0geworCS5uYW1lID0gIldNODczMSIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFdNODczMV9SQVRFUywKKwkJLmZvcm1hdHMgPSBXTTg3MzFfRk9STUFUUyx9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzMxX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODczMV9GT1JNQVRTLH0sCisJLm9wcyA9IHsKKwkJLnByZXBhcmUgPSB3bTg3MzFfcGNtX3ByZXBhcmUsCisJCS5od19wYXJhbXMgPSB3bTg3MzFfaHdfcGFyYW1zLAorCQkuc2h1dGRvd24gPSB3bTg3MzFfc2h1dGRvd24sCisJfSwKKwkuZGFpX29wcyA9IHsKKwkJLmRpZ2l0YWxfbXV0ZSA9IHdtODczMV9tdXRlLAorCQkuc2V0X3N5c2NsayA9IHdtODczMV9zZXRfZGFpX3N5c2NsaywKKwkJLnNldF9mbXQgPSB3bTg3MzFfc2V0X2RhaV9mbXQsCisJfQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHdtODczMV9kYWkpOworCitzdGF0aWMgaW50IHdtODczMV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9BQ1RJVkUsIDB4MCk7CisJd204NzMxX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczMV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IGk7CisJdTggZGF0YVsyXTsKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzMxX3JlZyk7IGkrKykgeworCQlkYXRhWzBdID0gKGkgPDwgMSkgfCAoKGNhY2hlW2ldID4+IDgpICYgMHgwMDAxKTsKKwkJZGF0YVsxXSA9IGNhY2hlW2ldICYgMHgwMGZmOworCQljb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMik7CisJfQorCXdtODczMV9kYXBtX2V2ZW50KGNvZGVjLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOworCXdtODczMV9kYXBtX2V2ZW50KGNvZGVjLCBjb2RlYy0+c3VzcGVuZF9kYXBtX3N0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIFdNODczMSBkcml2ZXIKKyAqIHJlZ2lzdGVyIHRoZSBtaXhlciBhbmQgZHNwIGludGVyZmFjZXMgd2l0aCB0aGUga2VybmVsCisgKi8KK3N0YXRpYyBpbnQgd204NzMxX2luaXQoc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgcmVnLCByZXQgPSAwOworCisJY29kZWMtPm5hbWUgPSAiV004NzMxIjsKKwljb2RlYy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljb2RlYy0+cmVhZCA9IHdtODczMV9yZWFkX3JlZ19jYWNoZTsKKwljb2RlYy0+d3JpdGUgPSB3bTg3MzFfd3JpdGU7CisJY29kZWMtPmRhcG1fZXZlbnQgPSB3bTg3MzFfZGFwbV9ldmVudDsKKwljb2RlYy0+ZGFpID0gJndtODczMV9kYWk7CisJY29kZWMtPm51bV9kYWkgPSAxOworCWNvZGVjLT5yZWdfY2FjaGVfc2l6ZSA9IHNpemVvZih3bTg3MzFfcmVnKTsKKwljb2RlYy0+cmVnX2NhY2hlID0ga21lbWR1cCh3bTg3MzFfcmVnLCBzaXplb2Yod204NzMxX3JlZyksIEdGUF9LRVJORUwpOworCWlmIChjb2RlYy0+cmVnX2NhY2hlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd204NzMxX3Jlc2V0KGNvZGVjKTsKKworCS8qIHJlZ2lzdGVyIHBjbXMgKi8KKwlyZXQgPSBzbmRfc29jX25ld19wY21zKHNvY2RldiwgU05EUlZfREVGQVVMVF9JRFgxLCBTTkRSVl9ERUZBVUxUX1NUUjEpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAid204NzMxOiBmYWlsZWQgdG8gY3JlYXRlIHBjbXNcbiIpOworCQlnb3RvIHBjbV9lcnI7CisJfQorCisJLyogcG93ZXIgb24gZGV2aWNlICovCisJd204NzMxX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CisKKwkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCisJcmVnID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfTE9VVDFWKTsKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9MT1VUMVYsIHJlZyB8IDB4MDEwMCk7CisJcmVnID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfUk9VVDFWKTsKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9ST1VUMVYsIHJlZyB8IDB4MDEwMCk7CisJcmVnID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfTElOVk9MKTsKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9MSU5WT0wsIHJlZyB8IDB4MDEwMCk7CisJcmVnID0gd204NzMxX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3MzFfUklOVk9MKTsKKwl3bTg3MzFfd3JpdGUoY29kZWMsIFdNODczMV9SSU5WT0wsIHJlZyB8IDB4MDEwMCk7CisKKwl3bTg3MzFfYWRkX2NvbnRyb2xzKGNvZGVjKTsKKwl3bTg3MzFfYWRkX3dpZGdldHMoY29kZWMpOworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChzb2NkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAid204NzMxOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2FyZFxuIik7CisJCWdvdG8gY2FyZF9lcnI7CisJfQorCisJcmV0dXJuIHJldDsKKworY2FyZF9lcnI6CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOworcGNtX2VycjoKKwlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlICp3bTg3MzFfc29jZGV2OworCisjaWYgZGVmaW5lZCAoQ09ORklHX0kyQykgfHwgZGVmaW5lZCAoQ09ORklHX0kyQ19NT0RVTEUpCisKKy8qCisgKiBXTTg3MzEgMiB3aXJlIGFkZHJlc3MgaXMgZGV0ZXJtaW5lZCBieSBHUElPNQorICogc3RhdGUgZHVyaW5nIHBvd2VydXAuCisgKiAgICBsb3cgID0gMHgxYQorICogICAgaGlnaCA9IDB4MWIKKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMCwgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogTWFnaWMgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgdmFyaWFibGVzIGFuZCB0aGluZ3MgKi8KK0kyQ19DTElFTlRfSU5TTU9EOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzMxX2kyY19kcml2ZXI7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOworCisvKiBJZiB0aGUgaTJjIGxheWVyIHdlcmVuJ3Qgc28gYnJva2VuLCB3ZSBjb3VsZCBwYXNzIHRoaXMga2luZCBvZiBkYXRhCisgICBhcm91bmQgKi8KKworc3RhdGljIGludCB3bTg3MzFfY29kZWNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSB3bTg3MzFfc29jZGV2OworCXN0cnVjdCB3bTg3MzFfc2V0dXBfZGF0YSAqc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOworCWludCByZXQ7CisKKwlpZiAoYWRkciAhPSBzZXR1cC0+aTJjX2FkZHJlc3MpCisJCXJldHVybiAtRU5PREVWOworCisJY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOworCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKKworCWkyYyA9IGttZW1kdXAoJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKGNsaWVudF90ZW1wbGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChpMmMgPT0gTlVMTCkgeworCQlrZnJlZShjb2RlYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBjb2RlYyk7CisJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGkyYzsKKworCXJldCA9IGkyY19hdHRhY2hfY2xpZW50KGkyYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCJmYWlsZWQgdG8gYXR0YWNoIGNvZGVjIGF0IGFkZHIgJXhcbiIsIGFkZHIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSB3bTg3MzFfaW5pdChzb2NkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWVycigiZmFpbGVkIHRvIGluaXRpYWxpc2UgV004NzMxXG4iKTsKKwkJZ290byBlcnI7CisJfQorCXJldHVybiByZXQ7CisKK2VycjoKKwlrZnJlZShjb2RlYyk7CisJa2ZyZWUoaTJjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtODczMV9pMmNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMqIGNvZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczMV9pMmNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHdtODczMV9jb2RlY19wcm9iZSk7Cit9CisKKy8qIGNvcmdpIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzMxX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiV004NzMxIEkyQyBDb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLmlkID0gICAgICAgICAgICAgSTJDX0RSSVZFUklEX1dNODczMSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSB3bTg3MzFfaTJjX2F0dGFjaCwKKwkuZGV0YWNoX2NsaWVudCA9ICB3bTg3MzFfaTJjX2RldGFjaCwKKwkuY29tbWFuZCA9ICAgICAgICBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKKwkubmFtZSA9ICAgIldNODczMSIsCisJLmRyaXZlciA9ICZ3bTg3MzFfaTJjX2RyaXZlciwKK307CisjZW5kaWYKKworc3RhdGljIGludCB3bTg3MzFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB3bTg3MzFfc2V0dXBfZGF0YSAqc2V0dXA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3bTg3MzFfcHJpdiAqd204NzMxOworCWludCByZXQgPSAwOworCisJaW5mbygiV004NzMxIEF1ZGlvIENvZGVjICVzIiwgV004NzMxX1ZFUlNJT04pOworCisJc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CisJY29kZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyksIEdGUF9LRVJORUwpOworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdtODczMSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg3MzFfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICh3bTg3MzEgPT0gTlVMTCkgeworCQlrZnJlZShjb2RlYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNvZGVjLT5wcml2YXRlX2RhdGEgPSB3bTg3MzE7CisJc29jZGV2LT5jb2RlYyA9IGNvZGVjOworCW11dGV4X2luaXQoJmNvZGVjLT5tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3dpZGdldHMpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV9wYXRocyk7CisKKwl3bTg3MzFfc29jZGV2ID0gc29jZGV2OworI2lmIGRlZmluZWQgKENPTkZJR19JMkMpIHx8IGRlZmluZWQgKENPTkZJR19JMkNfTU9EVUxFKQorCWlmIChzZXR1cC0+aTJjX2FkZHJlc3MpIHsKKwkJbm9ybWFsX2kyY1swXSA9IHNldHVwLT5pMmNfYWRkcmVzczsKKwkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOworCQlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204NzMxX2kyY19kcml2ZXIpOworCQlpZiAocmV0ICE9IDApCisJCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFkZCBpMmMgZHJpdmVyIik7CisJfQorI2Vsc2UKKwkvKiBBZGQgb3RoZXIgaW50ZXJmYWNlcyBoZXJlICovCisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKiBwb3dlciBkb3duIGNoaXAgKi8KK3N0YXRpYyBpbnQgd204NzMxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCWlmIChjb2RlYy0+Y29udHJvbF9kYXRhKQorCQl3bTg3MzFfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzY29sZCk7CisKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CisjaWYgZGVmaW5lZCAoQ09ORklHX0kyQykgfHwgZGVmaW5lZCAoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX2RlbF9kcml2ZXIoJndtODczMV9pMmNfZHJpdmVyKTsKKyNlbmRpZgorCWtmcmVlKGNvZGVjLT5wcml2YXRlX2RhdGEpOworCWtmcmVlKGNvZGVjKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl93bTg3MzEgPSB7CisJLnByb2JlID0gCXdtODczMV9wcm9iZSwKKwkucmVtb3ZlID0gCXdtODczMV9yZW1vdmUsCisJLnN1c3BlbmQgPSAJd204NzMxX3N1c3BlbmQsCisJLnJlc3VtZSA9CXdtODczMV9yZXN1bWUsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChzb2NfY29kZWNfZGV2X3dtODczMSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBXTTg3MzEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFB1cmRpZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjYWI2YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIHdtODczMS5oICAtLSAgV004NzMxIFNvYyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3I6IFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqIEJhc2VkIG9uIHdtODc1My5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9XTTg3MzFfSAorI2RlZmluZSBfV004NzMxX0gKKworLyogV004NzMxIHJlZ2lzdGVyIHNwYWNlICovCisKKyNkZWZpbmUgV004NzMxX0xJTlZPTCAgIDB4MDAKKyNkZWZpbmUgV004NzMxX1JJTlZPTCAgIDB4MDEKKyNkZWZpbmUgV004NzMxX0xPVVQxViAgIDB4MDIKKyNkZWZpbmUgV004NzMxX1JPVVQxViAgIDB4MDMKKyNkZWZpbmUgV004NzMxX0FQQU5BICAgIDB4MDQKKyNkZWZpbmUgV004NzMxX0FQRElHSSAgIDB4MDUKKyNkZWZpbmUgV004NzMxX1BXUiAgICAgIDB4MDYKKyNkZWZpbmUgV004NzMxX0lGQUNFICAgIDB4MDcKKyNkZWZpbmUgV004NzMxX1NSQVRFICAgIDB4MDgKKyNkZWZpbmUgV004NzMxX0FDVElWRSAgIDB4MDkKKyNkZWZpbmUgV004NzMxX1JFU0VUCTB4MGYKKworI2RlZmluZSBXTTg3MzFfQ0FDSEVSRUdOVU0gCTEwCisKKyNkZWZpbmUgV004NzMxX1NZU0NMSwkwCisjZGVmaW5lIFdNODczMV9EQUkJCTAKKworc3RydWN0IHdtODczMV9zZXR1cF9kYXRhIHsKKwl1bnNpZ25lZCBzaG9ydCBpMmNfYWRkcmVzczsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgd204NzMxX2RhaTsKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl93bTg3MzE7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3M2U4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKQEAgLTAsMCArMSwxMDQ5IEBACisvKgorICogd204NzUwLmMgLS0gV004NzUwIEFMU0EgU29DIGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA1IE9wZW5lZGhhbmQgTHRkLgorICoKKyAqIEF1dGhvcjogUmljaGFyZCBQdXJkaWUgPHJpY2hhcmRAb3BlbmVkaGFuZC5jb20+CisgKgorICogQmFzZWQgb24gV004NzUzLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgIndtODc1MC5oIgorCisjZGVmaW5lIEFVRElPX05BTUUgIldNODc1MCIKKyNkZWZpbmUgV004NzUwX1ZFUlNJT04gIjAuMTIiCisKKy8qCisgKiBEZWJ1ZworICovCisKKyNkZWZpbmUgV004NzUwX0RFQlVHIDAKKworI2lmZGVmIFdNODc1MF9ERUJVRworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBBVURJT19OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0VSUiBBVURJT19OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9JTkZPIEFVRElPX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX1dBUk5JTkcgQVVESU9fTkFNRSAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCisvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCB3bTg3NTBfcHJpdiB7CisJdW5zaWduZWQgaW50IHN5c2NsazsKK307CisKKy8qCisgKiB3bTg3NTAgcmVnaXN0ZXIgY2FjaGUKKyAqIFdlIGNhbid0IHJlYWQgdGhlIFdNODc1MCByZWdpc3RlciBzcGFjZSB3aGVuIHdlCisgKiBhcmUgdXNpbmcgMiB3aXJlIGZvciBkZXZpY2UgY29udHJvbCwgc28gd2UgY2FjaGUgdGhlbSBpbnN0ZWFkLgorICovCitzdGF0aWMgY29uc3QgdTE2IHdtODc1MF9yZWdbXSA9IHsKKwkweDAwOTcsIDB4MDA5NywgMHgwMDc5LCAweDAwNzksICAvKiAgMCAqLworCTB4MDAwMCwgMHgwMDA4LCAweDAwMDAsIDB4MDAwYSwgIC8qICA0ICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDBmZiwgMHgwMGZmLCAgLyogIDggKi8KKwkweDAwMGYsIDB4MDAwZiwgMHgwMDAwLCAweDAwMDAsICAvKiAxMiAqLworCTB4MDAwMCwgMHgwMDdiLCAweDAwMDAsIDB4MDAzMiwgIC8qIDE2ICovCisJMHgwMDAwLCAweDAwYzMsIDB4MDBjMywgMHgwMGMwLCAgLyogMjAgKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsICAvKiAyNCAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgIC8qIDI4ICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDA1MCwgMHgwMDUwLCAgLyogMzIgKi8KKwkweDAwNTAsIDB4MDA1MCwgMHgwMDUwLCAweDAwNTAsICAvKiAzNiAqLworCTB4MDA3OSwgMHgwMDc5LCAweDAwNzksICAgICAgICAgIC8qIDQwICovCit9OworCisvKgorICogcmVhZCB3bTg3NTAgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgd204NzUwX3JlYWRfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnKQoreworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCWlmIChyZWcgPiBXTTg3NTBfQ0FDSEVfUkVHTlVNKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGNhY2hlW3JlZ107Cit9CisKKy8qCisgKiB3cml0ZSB3bTg3NTAgcmVnaXN0ZXIgY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdtODc1MF93cml0ZV9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwlpZiAocmVnID4gV004NzUwX0NBQ0hFX1JFR05VTSkKKwkJcmV0dXJuOworCWNhY2hlW3JlZ10gPSB2YWx1ZTsKK30KKworc3RhdGljIGludCB3bTg3NTBfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCXVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1OCBkYXRhWzJdOworCisJLyogZGF0YSBpcworCSAqICAgRDE1Li5EOSBXTTg3NTMgcmVnaXN0ZXIgb2Zmc2V0CisJICogICBEOC4uLkQwIHJlZ2lzdGVyIGRhdGEKKwkgKi8KKwlkYXRhWzBdID0gKHJlZyA8PCAxKSB8ICgodmFsdWUgPj4gOCkgJiAweDAwMDEpOworCWRhdGFbMV0gPSB2YWx1ZSAmIDB4MDBmZjsKKworCXdtODc1MF93cml0ZV9yZWdfY2FjaGUgKGNvZGVjLCByZWcsIHZhbHVlKTsKKwlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpID09IDIpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKKyNkZWZpbmUgd204NzUwX3Jlc2V0KGMpCXdtODc1MF93cml0ZShjLCBXTTg3NTBfUkVTRVQsIDApCisKKy8qCisgKiBXTTg3NTAgQ29udHJvbHMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1MF9iYXNzW10gPSB7IkxpbmVhciBDb250cm9sIiwgIkFkYXB0aXZlIEJvb3N0In07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUwX2Jhc3NfZmlsdGVyW10gPSB7ICIxMzBIeiBAIDQ4a0h6IiwgIjIwMEh6IEAgNDhrSHoiIH07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUwX3RyZWJsZVtdID0geyI4a0h6IiwgIjRrSHoifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfM2RfbGNbXSA9IHsiMjAwSHoiLCAiNTAwSHoifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfM2RfdWNbXSA9IHsiMi4ya0h6IiwgIjEuNWtIeiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1MF8zZF9mdW5jW10gPSB7IkNhcHR1cmUiLCAiUGxheWJhY2sifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfYWxjX2Z1bmNbXSA9IHsiT2ZmIiwgIlJpZ2h0IiwgIkxlZnQiLCAiU3RlcmVvIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUwX25nX3R5cGVbXSA9IHsiQ29uc3RhbnQgUEdBIEdhaW4iLAorCSJNdXRlIEFEQyBPdXRwdXQifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfbGluZV9tdXhbXSA9IHsiTGluZSAxIiwgIkxpbmUgMiIsICJMaW5lIDMiLCAiUEdBIiwKKwkiRGlmZmVyZW50aWFsIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUwX3BnYV9zZWxbXSA9IHsiTGluZSAxIiwgIkxpbmUgMiIsICJMaW5lIDMiLAorCSJEaWZmZXJlbnRpYWwifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfb3V0M1tdID0geyJWUkVGIiwgIlJPVVQxICsgVm9sIiwgIk1vbm9PdXQiLAorCSJST1VUMSJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1MF9kaWZmX3NlbFtdID0geyJMaW5lIDEiLCAiTGluZSAyIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUwX2FkY3BvbFtdID0geyJOb3JtYWwiLCAiTCBJbnZlcnQiLCAiUiBJbnZlcnQiLAorCSJMICsgUiBJbnZlcnQifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTBfZGVlbXBoW10gPSB7Ik5vbmUiLCAiMzJLaHoiLCAiNDQuMUtoeiIsICI0OEtoeiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1MF9tb25vX211eFtdID0geyJTdGVyZW8iLCAiTW9ubyAoTGVmdCkiLAorCSJNb25vIChSaWdodCkiLCAiRGlnaXRhbCBNb25vIn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204NzUwX2VudW1bXSA9IHsKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfQkFTUywgNywgMiwgd204NzUwX2Jhc3MpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1MF9CQVNTLCA2LCAyLCB3bTg3NTBfYmFzc19maWx0ZXIpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1MF9UUkVCTEUsIDYsIDIsIHdtODc1MF90cmVibGUpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1MF8zRCwgNSwgMiwgd204NzUwXzNkX2xjKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfM0QsIDYsIDIsIHdtODc1MF8zZF91YyksCitTT0NfRU5VTV9TSU5HTEUoV004NzUwXzNELCA3LCAyLCB3bTg3NTBfM2RfZnVuYyksCitTT0NfRU5VTV9TSU5HTEUoV004NzUwX0FMQzEsIDcsIDQsIHdtODc1MF9hbGNfZnVuYyksCitTT0NfRU5VTV9TSU5HTEUoV004NzUwX05HQVRFLCAxLCAyLCB3bTg3NTBfbmdfdHlwZSksCitTT0NfRU5VTV9TSU5HTEUoV004NzUwX0xPVVRNMSwgMCwgNSwgd204NzUwX2xpbmVfbXV4KSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfUk9VVE0xLCAwLCA1LCB3bTg3NTBfbGluZV9tdXgpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1MF9MQURDSU4sIDYsIDQsIHdtODc1MF9wZ2Ffc2VsKSwgLyogMTAgKi8KK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfUkFEQ0lOLCA2LCA0LCB3bTg3NTBfcGdhX3NlbCksCitTT0NfRU5VTV9TSU5HTEUoV004NzUwX0FEQ1RMMiwgNywgNCwgd204NzUwX291dDMpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1MF9BRENJTiwgOCwgMiwgd204NzUwX2RpZmZfc2VsKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfQURDREFDLCA1LCA0LCB3bTg3NTBfYWRjcG9sKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfQURDREFDLCAxLCA0LCB3bTg3NTBfZGVlbXBoKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTBfQURDSU4sIDYsIDQsIHdtODc1MF9tb25vX211eCksIC8qIDE2ICovCisKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTBfc25kX2NvbnRyb2xzW10gPSB7CisKK1NPQ19ET1VCTEVfUigiQ2FwdHVyZSBWb2x1bWUiLCBXTTg3NTBfTElOVk9MLCBXTTg3NTBfUklOVk9MLCAwLCA2MywgMCksCitTT0NfRE9VQkxFX1IoIkNhcHR1cmUgWkMgU3dpdGNoIiwgV004NzUwX0xJTlZPTCwgV004NzUwX1JJTlZPTCwgNiwgMSwgMCksCitTT0NfRE9VQkxFX1IoIkNhcHR1cmUgU3dpdGNoIiwgV004NzUwX0xJTlZPTCwgV004NzUwX1JJTlZPTCwgNywgMSwgMSksCisKK1NPQ19ET1VCTEVfUigiSGVhZHBob25lIFBsYXliYWNrIFpDIFN3aXRjaCIsIFdNODc1MF9MT1VUMVYsCisJV004NzUwX1JPVVQxViwgNywgMSwgMCksCitTT0NfRE9VQkxFX1IoIlNwZWFrZXIgUGxheWJhY2sgWkMgU3dpdGNoIiwgV004NzUwX0xPVVQyViwKKwlXTTg3NTBfUk9VVDJWLCA3LCAxLCAwKSwKKworU09DX0VOVU0oIlBsYXliYWNrIERlLWVtcGhhc2lzIiwgd204NzUwX2VudW1bMTVdKSwKKworU09DX0VOVU0oIkNhcHR1cmUgUG9sYXJpdHkiLCB3bTg3NTBfZW51bVsxNF0pLAorU09DX1NJTkdMRSgiUGxheWJhY2sgNmRCIEF0dGVudWF0ZSIsIFdNODc1MF9BRENEQUMsIDcsIDEsIDApLAorU09DX1NJTkdMRSgiQ2FwdHVyZSA2ZEIgQXR0ZW51YXRlIiwgV004NzUwX0FEQ0RBQywgOCwgMSwgMCksCisKK1NPQ19ET1VCTEVfUigiUENNIFZvbHVtZSIsIFdNODc1MF9MREFDLCBXTTg3NTBfUkRBQywgMCwgMjU1LCAwKSwKKworU09DX0VOVU0oIkJhc3MgQm9vc3QiLCB3bTg3NTBfZW51bVswXSksCitTT0NfRU5VTSgiQmFzcyBGaWx0ZXIiLCB3bTg3NTBfZW51bVsxXSksCitTT0NfU0lOR0xFKCJCYXNzIFZvbHVtZSIsIFdNODc1MF9CQVNTLCAwLCAxNSwgMSksCisKK1NPQ19TSU5HTEUoIlRyZWJsZSBWb2x1bWUiLCBXTTg3NTBfVFJFQkxFLCAwLCAxNSwgMCksCitTT0NfRU5VTSgiVHJlYmxlIEN1dC1vZmYiLCB3bTg3NTBfZW51bVsyXSksCisKK1NPQ19TSU5HTEUoIjNEIFN3aXRjaCIsIFdNODc1MF8zRCwgMCwgMSwgMCksCitTT0NfU0lOR0xFKCIzRCBWb2x1bWUiLCBXTTg3NTBfM0QsIDEsIDE1LCAwKSwKK1NPQ19FTlVNKCIzRCBMb3dlciBDdXQtb2ZmIiwgd204NzUwX2VudW1bM10pLAorU09DX0VOVU0oIjNEIFVwcGVyIEN1dC1vZmYiLCB3bTg3NTBfZW51bVs0XSksCitTT0NfRU5VTSgiM0QgTW9kZSIsIHdtODc1MF9lbnVtWzVdKSwKKworU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgVGFyZ2V0IFZvbHVtZSIsIFdNODc1MF9BTEMxLCAwLCA3LCAwKSwKK1NPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIE1heCBWb2x1bWUiLCBXTTg3NTBfQUxDMSwgNCwgNywgMCksCitTT0NfRU5VTSgiQUxDIENhcHR1cmUgRnVuY3Rpb24iLCB3bTg3NTBfZW51bVs2XSksCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBaQyBTd2l0Y2giLCBXTTg3NTBfQUxDMiwgNywgMSwgMCksCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBIb2xkIFRpbWUiLCBXTTg3NTBfQUxDMiwgMCwgMTUsIDApLAorU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgRGVjYXkgVGltZSIsIFdNODc1MF9BTEMzLCA0LCAxNSwgMCksCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBBdHRhY2sgVGltZSIsIFdNODc1MF9BTEMzLCAwLCAxNSwgMCksCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBORyBUaHJlc2hvbGQiLCBXTTg3NTBfTkdBVEUsIDMsIDMxLCAwKSwKK1NPQ19FTlVNKCJBTEMgQ2FwdHVyZSBORyBUeXBlIiwgd204NzUwX2VudW1bNF0pLAorU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgTkcgU3dpdGNoIiwgV004NzUwX05HQVRFLCAwLCAxLCAwKSwKKworU09DX1NJTkdMRSgiTGVmdCBBREMgQ2FwdHVyZSBWb2x1bWUiLCBXTTg3NTBfTEFEQywgMCwgMjU1LCAwKSwKK1NPQ19TSU5HTEUoIlJpZ2h0IEFEQyBDYXB0dXJlIFZvbHVtZSIsIFdNODc1MF9SQURDLCAwLCAyNTUsIDApLAorCitTT0NfU0lOR0xFKCJaQyBUaW1lb3V0IFN3aXRjaCIsIFdNODc1MF9BRENUTDEsIDAsIDEsIDApLAorU09DX1NJTkdMRSgiUGxheWJhY2sgSW52ZXJ0IFN3aXRjaCIsIFdNODc1MF9BRENUTDEsIDEsIDEsIDApLAorCitTT0NfU0lOR0xFKCJSaWdodCBTcGVha2VyIFBsYXliYWNrIEludmVydCBTd2l0Y2giLCBXTTg3NTBfQURDVEwyLCA0LCAxLCAwKSwKKworLyogVW5pbXBsZW1lbnRlZCAqLworLyogQURDREFDIEJpdCAwIC0gQURDSFBEICovCisvKiBBRENEQUMgQml0IDQgLSBIUE9SICovCisvKiBBRENUTDEgQml0IDIsMyAtIERBVFNFTCAqLworLyogQURDVEwxIEJpdCA0LDUgLSBETU9OT01JWCAqLworLyogQURDVEwxIEJpdCA2LDcgLSBWU0VMICovCisvKiBBRENUTDIgQml0IDIgLSBMUkNNICovCisvKiBBRENUTDIgQml0IDMgLSBUUkkgKi8KKy8qIEFEQ1RMMyBCaXQgNSAtIEhQRkxSRU4gKi8KKy8qIEFEQ1RMMyBCaXQgNiAtIFZST0kgKi8KKy8qIEFEQ1RMMyBCaXQgNyw4IC0gQURDTFJNICovCisvKiBBRENJTiBCaXQgNCAtIExEQ00gKi8KKy8qIEFEQ0lOIEJpdCA1IC0gUkRDTSAqLworCitTT0NfRE9VQkxFX1IoIk1pYyBCb29zdCIsIFdNODc1MF9MQURDSU4sIFdNODc1MF9SQURDSU4sIDQsIDMsIDApLAorCitTT0NfRE9VQkxFX1IoIkJ5cGFzcyBMZWZ0IFBsYXliYWNrIFZvbHVtZSIsIFdNODc1MF9MT1VUTTEsCisJV004NzUwX0xPVVRNMiwgNCwgNywgMSksCitTT0NfRE9VQkxFX1IoIkJ5cGFzcyBSaWdodCBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NTBfUk9VVE0xLAorCVdNODc1MF9ST1VUTTIsIDQsIDcsIDEpLAorU09DX0RPVUJMRV9SKCJCeXBhc3MgTW9ubyBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NTBfTU9VVE0xLAorCVdNODc1MF9NT1VUTTIsIDQsIDcsIDEpLAorCitTT0NfU0lOR0xFKCJNb25vIFBsYXliYWNrIFpDIFN3aXRjaCIsIFdNODc1MF9NT1VUViwgNywgMSwgMCksCisKK1NPQ19ET1VCTEVfUigiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIFdNODc1MF9MT1VUMVYsIFdNODc1MF9ST1VUMVYsCisJMCwgMTI3LCAwKSwKK1NPQ19ET1VCTEVfUigiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NTBfTE9VVDJWLCBXTTg3NTBfUk9VVDJWLAorCTAsIDEyNywgMCksCisKK1NPQ19TSU5HTEUoIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgV004NzUwX01PVVRWLCAwLCAxMjcsIDApLAorCit9OworCisvKiBhZGQgbm9uIGRhcG0gY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgd204NzUwX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGVyciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODc1MF9zbmRfY29udHJvbHMpOyBpKyspIHsKKwkJZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsCisJCQkJc25kX3NvY19jbmV3KCZ3bTg3NTBfc25kX2NvbnRyb2xzW2ldLGNvZGVjLCBOVUxMKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEQVBNIENvbnRyb2xzCisgKi8KKworLyogTGVmdCBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1MF9sZWZ0X21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIlBsYXliYWNrIFN3aXRjaCIsIFdNODc1MF9MT1VUTTEsIDgsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJMZWZ0IEJ5cGFzcyBTd2l0Y2giLCBXTTg3NTBfTE9VVE0xLCA3LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgUGxheWJhY2sgU3dpdGNoIiwgV004NzUwX0xPVVRNMiwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCBXTTg3NTBfTE9VVE0yLCA3LCAxLCAwKSwKK307CisKKy8qIFJpZ2h0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUwX3JpZ2h0X21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgV004NzUwX1JPVVRNMSwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkxlZnQgQnlwYXNzIFN3aXRjaCIsIFdNODc1MF9ST1VUTTEsIDcsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJQbGF5YmFjayBTd2l0Y2giLCBXTTg3NTBfUk9VVE0yLCA4LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgQnlwYXNzIFN3aXRjaCIsIFdNODc1MF9ST1VUTTIsIDcsIDEsIDApLAorfTsKKworLyogTW9ubyBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1MF9tb25vX21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgV004NzUwX01PVVRNMSwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkxlZnQgQnlwYXNzIFN3aXRjaCIsIFdNODc1MF9NT1VUTTEsIDcsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJSaWdodCBQbGF5YmFjayBTd2l0Y2giLCBXTTg3NTBfTU9VVE0yLCA4LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgQnlwYXNzIFN3aXRjaCIsIFdNODc1MF9NT1VUTTIsIDcsIDEsIDApLAorfTsKKworLyogTGVmdCBMaW5lIE11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1MF9sZWZ0X2xpbmVfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTBfZW51bVs4XSk7CisKKy8qIFJpZ2h0IExpbmUgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUwX3JpZ2h0X2xpbmVfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTBfZW51bVs5XSk7CisKKy8qIExlZnQgUEdBIE11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1MF9sZWZ0X3BnYV9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODc1MF9lbnVtWzEwXSk7CisKKy8qIFJpZ2h0IFBHQSBNdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTBfcmlnaHRfcGdhX2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204NzUwX2VudW1bMTFdKTsKKworLyogT3V0IDMgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUwX291dDNfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTBfZW51bVsxMl0pOworCisvKiBEaWZmZXJlbnRpYWwgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUwX2RpZmZtdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTBfZW51bVsxM10pOworCisvKiBNb25vIEFEQyBNdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTBfbW9ub211eF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODc1MF9lbnVtWzE2XSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3NTBfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX01JWEVSKCJMZWZ0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmd204NzUwX2xlZnRfbWl4ZXJfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUod204NzUwX2xlZnRfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJpZ2h0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmd204NzUwX3JpZ2h0X21peGVyX2NvbnRyb2xzWzBdLAorCQlBUlJBWV9TSVpFKHdtODc1MF9yaWdodF9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiTW9ubyBNaXhlciIsIFdNODc1MF9QV1IyLCAyLCAwLAorCQkmd204NzUwX21vbm9fbWl4ZXJfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUod204NzUwX21vbm9fbWl4ZXJfY29udHJvbHMpKSwKKworCVNORF9TT0NfREFQTV9QR0EoIlJpZ2h0IE91dCAyIiwgV004NzUwX1BXUjIsIDMsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkxlZnQgT3V0IDIiLCBXTTg3NTBfUFdSMiwgNCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiUmlnaHQgT3V0IDEiLCBXTTg3NTBfUFdSMiwgNSwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTGVmdCBPdXQgMSIsIFdNODc1MF9QV1IyLCA2LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJSaWdodCBEQUMiLCAiUmlnaHQgUGxheWJhY2siLCBXTTg3NTBfUFdSMiwgNywgMCksCisJU05EX1NPQ19EQVBNX0RBQygiTGVmdCBEQUMiLCAiTGVmdCBQbGF5YmFjayIsIFdNODc1MF9QV1IyLCA4LCAwKSwKKworCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNaWMgQmlhcyIsIFdNODc1MF9QV1IxLCAxLCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJSaWdodCBBREMiLCAiUmlnaHQgQ2FwdHVyZSIsIFdNODc1MF9QV1IxLCAyLCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJMZWZ0IEFEQyIsICJMZWZ0IENhcHR1cmUiLCBXTTg3NTBfUFdSMSwgMywgMCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJMZWZ0IFBHQSBNdXgiLCBXTTg3NTBfUFdSMSwgNSwgMCwKKwkJJndtODc1MF9sZWZ0X3BnYV9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiUmlnaHQgUEdBIE11eCIsIFdNODc1MF9QV1IxLCA0LCAwLAorCQkmd204NzUwX3JpZ2h0X3BnYV9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiTGVmdCBMaW5lIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJndtODc1MF9sZWZ0X2xpbmVfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IExpbmUgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmd204NzUwX3JpZ2h0X2xpbmVfY29udHJvbHMpLAorCisJU05EX1NPQ19EQVBNX01VWCgiT3V0MyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZ3bTg3NTBfb3V0M19jb250cm9scyksCisJU05EX1NPQ19EQVBNX1BHQSgiT3V0IDMiLCBXTTg3NTBfUFdSMiwgMSwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTW9ubyBPdXQgMSIsIFdNODc1MF9QV1IyLCAyLCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9NVVgoIkRpZmZlcmVudGlhbCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ3bTg3NTBfZGlmZm11eF9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiTGVmdCBBREMgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmd204NzUwX21vbm9tdXhfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IEFEQyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ3bTg3NTBfbW9ub211eF9jb250cm9scyksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMSIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlJPVVQxIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiTE9VVDIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJST1VUMiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIk1PTk8iKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJPVVQzIiksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTlBVVDEiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTlBVVDIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTlBVVDMiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIlJJTlBVVDEiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIlJJTlBVVDIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIlJJTlBVVDMiKSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphdWRpb19tYXBbXVszXSA9IHsKKwkvKiBsZWZ0IG1peGVyICovCisJeyJMZWZ0IE1peGVyIiwgIlBsYXliYWNrIFN3aXRjaCIsICJMZWZ0IERBQyJ9LAorCXsiTGVmdCBNaXhlciIsICJMZWZ0IEJ5cGFzcyBTd2l0Y2giLCAiTGVmdCBMaW5lIE11eCJ9LAorCXsiTGVmdCBNaXhlciIsICJSaWdodCBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgREFDIn0sCisJeyJMZWZ0IE1peGVyIiwgIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCAiUmlnaHQgTGluZSBNdXgifSwKKworCS8qIHJpZ2h0IG1peGVyICovCisJeyJSaWdodCBNaXhlciIsICJMZWZ0IFBsYXliYWNrIFN3aXRjaCIsICJMZWZ0IERBQyJ9LAorCXsiUmlnaHQgTWl4ZXIiLCAiTGVmdCBCeXBhc3MgU3dpdGNoIiwgIkxlZnQgTGluZSBNdXgifSwKKwl7IlJpZ2h0IE1peGVyIiwgIlBsYXliYWNrIFN3aXRjaCIsICJSaWdodCBEQUMifSwKKwl7IlJpZ2h0IE1peGVyIiwgIlJpZ2h0IEJ5cGFzcyBTd2l0Y2giLCAiUmlnaHQgTGluZSBNdXgifSwKKworCS8qIGxlZnQgb3V0IDEgKi8KKwl7IkxlZnQgT3V0IDEiLCBOVUxMLCAiTGVmdCBNaXhlciJ9LAorCXsiTE9VVDEiLCBOVUxMLCAiTGVmdCBPdXQgMSJ9LAorCisJLyogbGVmdCBvdXQgMiAqLworCXsiTGVmdCBPdXQgMiIsIE5VTEwsICJMZWZ0IE1peGVyIn0sCisJeyJMT1VUMiIsIE5VTEwsICJMZWZ0IE91dCAyIn0sCisKKwkvKiByaWdodCBvdXQgMSAqLworCXsiUmlnaHQgT3V0IDEiLCBOVUxMLCAiUmlnaHQgTWl4ZXIifSwKKwl7IlJPVVQxIiwgTlVMTCwgIlJpZ2h0IE91dCAxIn0sCisKKwkvKiByaWdodCBvdXQgMiAqLworCXsiUmlnaHQgT3V0IDIiLCBOVUxMLCAiUmlnaHQgTWl4ZXIifSwKKwl7IlJPVVQyIiwgTlVMTCwgIlJpZ2h0IE91dCAyIn0sCisKKwkvKiBtb25vIG1peGVyICovCisJeyJNb25vIE1peGVyIiwgIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgIkxlZnQgREFDIn0sCisJeyJNb25vIE1peGVyIiwgIkxlZnQgQnlwYXNzIFN3aXRjaCIsICJMZWZ0IExpbmUgTXV4In0sCisJeyJNb25vIE1peGVyIiwgIlJpZ2h0IFBsYXliYWNrIFN3aXRjaCIsICJSaWdodCBEQUMifSwKKwl7Ik1vbm8gTWl4ZXIiLCAiUmlnaHQgQnlwYXNzIFN3aXRjaCIsICJSaWdodCBMaW5lIE11eCJ9LAorCisJLyogbW9ubyBvdXQgKi8KKwl7Ik1vbm8gT3V0IDEiLCBOVUxMLCAiTW9ubyBNaXhlciJ9LAorCXsiTU9OTzEiLCBOVUxMLCAiTW9ubyBPdXQgMSJ9LAorCisJLyogb3V0IDMgKi8KKwl7Ik91dDMgTXV4IiwgIlZSRUYiLCAiVlJFRiJ9LAorCXsiT3V0MyBNdXgiLCAiUk9VVDEgKyBWb2wiLCAiUk9VVDEifSwKKwl7Ik91dDMgTXV4IiwgIlJPVVQxIiwgIlJpZ2h0IE1peGVyIn0sCisJeyJPdXQzIE11eCIsICJNb25vT3V0IiwgIk1PTk8xIn0sCisJeyJPdXQgMyIsIE5VTEwsICJPdXQzIE11eCJ9LAorCXsiT1VUMyIsIE5VTEwsICJPdXQgMyJ9LAorCisJLyogTGVmdCBMaW5lIE11eCAqLworCXsiTGVmdCBMaW5lIE11eCIsICJMaW5lIDEiLCAiTElOUFVUMSJ9LAorCXsiTGVmdCBMaW5lIE11eCIsICJMaW5lIDIiLCAiTElOUFVUMiJ9LAorCXsiTGVmdCBMaW5lIE11eCIsICJMaW5lIDMiLCAiTElOUFVUMyJ9LAorCXsiTGVmdCBMaW5lIE11eCIsICJQR0EiLCAiTGVmdCBQR0EgTXV4In0sCisJeyJMZWZ0IExpbmUgTXV4IiwgIkRpZmZlcmVudGlhbCIsICJEaWZmZXJlbnRpYWwgTXV4In0sCisKKwkvKiBSaWdodCBMaW5lIE11eCAqLworCXsiUmlnaHQgTGluZSBNdXgiLCAiTGluZSAxIiwgIlJJTlBVVDEifSwKKwl7IlJpZ2h0IExpbmUgTXV4IiwgIkxpbmUgMiIsICJSSU5QVVQyIn0sCisJeyJSaWdodCBMaW5lIE11eCIsICJMaW5lIDMiLCAiUklOUFVUMyJ9LAorCXsiUmlnaHQgTGluZSBNdXgiLCAiUEdBIiwgIlJpZ2h0IFBHQSBNdXgifSwKKwl7IlJpZ2h0IExpbmUgTXV4IiwgIkRpZmZlcmVudGlhbCIsICJEaWZmZXJlbnRpYWwgTXV4In0sCisKKwkvKiBMZWZ0IFBHQSBNdXggKi8KKwl7IkxlZnQgUEdBIE11eCIsICJMaW5lIDEiLCAiTElOUFVUMSJ9LAorCXsiTGVmdCBQR0EgTXV4IiwgIkxpbmUgMiIsICJMSU5QVVQyIn0sCisJeyJMZWZ0IFBHQSBNdXgiLCAiTGluZSAzIiwgIkxJTlBVVDMifSwKKwl7IkxlZnQgUEdBIE11eCIsICJEaWZmZXJlbnRpYWwiLCAiRGlmZmVyZW50aWFsIE11eCJ9LAorCisJLyogUmlnaHQgUEdBIE11eCAqLworCXsiUmlnaHQgUEdBIE11eCIsICJMaW5lIDEiLCAiUklOUFVUMSJ9LAorCXsiUmlnaHQgUEdBIE11eCIsICJMaW5lIDIiLCAiUklOUFVUMiJ9LAorCXsiUmlnaHQgUEdBIE11eCIsICJMaW5lIDMiLCAiUklOUFVUMyJ9LAorCXsiUmlnaHQgUEdBIE11eCIsICJEaWZmZXJlbnRpYWwiLCAiRGlmZmVyZW50aWFsIE11eCJ9LAorCisJLyogRGlmZmVyZW50aWFsIE11eCAqLworCXsiRGlmZmVyZW50aWFsIE11eCIsICJMaW5lIDEiLCAiTElOUFVUMSJ9LAorCXsiRGlmZmVyZW50aWFsIE11eCIsICJMaW5lIDEiLCAiUklOUFVUMSJ9LAorCXsiRGlmZmVyZW50aWFsIE11eCIsICJMaW5lIDIiLCAiTElOUFVUMiJ9LAorCXsiRGlmZmVyZW50aWFsIE11eCIsICJMaW5lIDIiLCAiUklOUFVUMiJ9LAorCisJLyogTGVmdCBBREMgTXV4ICovCisJeyJMZWZ0IEFEQyBNdXgiLCAiU3RlcmVvIiwgIkxlZnQgUEdBIE11eCJ9LAorCXsiTGVmdCBBREMgTXV4IiwgIk1vbm8gKExlZnQpIiwgIkxlZnQgUEdBIE11eCJ9LAorCXsiTGVmdCBBREMgTXV4IiwgIkRpZ2l0YWwgTW9ubyIsICJMZWZ0IFBHQSBNdXgifSwKKworCS8qIFJpZ2h0IEFEQyBNdXggKi8KKwl7IlJpZ2h0IEFEQyBNdXgiLCAiU3RlcmVvIiwgIlJpZ2h0IFBHQSBNdXgifSwKKwl7IlJpZ2h0IEFEQyBNdXgiLCAiTW9ubyAoUmlnaHQpIiwgIlJpZ2h0IFBHQSBNdXgifSwKKwl7IlJpZ2h0IEFEQyBNdXgiLCAiRGlnaXRhbCBNb25vIiwgIlJpZ2h0IFBHQSBNdXgifSwKKworCS8qIEFEQyAqLworCXsiTGVmdCBBREMiLCBOVUxMLCAiTGVmdCBBREMgTXV4In0sCisJeyJSaWdodCBBREMiLCBOVUxMLCAiUmlnaHQgQURDIE11eCJ9LAorCisJLyogdGVybWluYXRvciAqLworCXtOVUxMLCBOVUxMLCBOVUxMfSwKK307CisKK3N0YXRpYyBpbnQgd204NzUwX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzUwX2RhcG1fd2lkZ2V0cyk7IGkrKykgeworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2woY29kZWMsICZ3bTg3NTBfZGFwbV93aWRnZXRzW2ldKTsKKwl9CisKKwkvKiBzZXQgdXAgYXVkaW8gcGF0aCBhdWRpb19tYXBuZWN0cyAqLworCWZvcihpID0gMDsgYXVkaW9fbWFwW2ldWzBdICE9IE5VTEw7IGkrKykgeworCQlzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dChjb2RlYywgYXVkaW9fbWFwW2ldWzBdLAorCQkJYXVkaW9fbWFwW2ldWzFdLCBhdWRpb19tYXBbaV1bMl0pOworCX0KKworCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBfY29lZmZfZGl2IHsKKwl1MzIgbWNsazsKKwl1MzIgcmF0ZTsKKwl1MTYgZnM7CisJdTggc3I6NTsKKwl1OCB1c2I6MTsKK307CisKKy8qIGNvZGVjIGhpZmkgbWNsayBjbG9jayBkaXZpZGVyIGNvZWZmaWNpZW50cyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBfY29lZmZfZGl2IGNvZWZmX2RpdltdID0geworCS8qIDhrICovCisJezEyMjg4MDAwLCA4MDAwLCAxNTM2LCAweDYsIDB4MH0sCisJezExMjg5NjAwLCA4MDAwLCAxNDA4LCAweDE2LCAweDB9LAorCXsxODQzMjAwMCwgODAwMCwgMjMwNCwgMHg3LCAweDB9LAorCXsxNjkzNDQwMCwgODAwMCwgMjExMiwgMHgxNywgMHgwfSwKKwl7MTIwMDAwMDAsIDgwMDAsIDE1MDAsIDB4NiwgMHgxfSwKKworCS8qIDExLjAyNWsgKi8KKwl7MTEyODk2MDAsIDExMDI1LCAxMDI0LCAweDE4LCAweDB9LAorCXsxNjkzNDQwMCwgMTEwMjUsIDE1MzYsIDB4MTksIDB4MH0sCisJezEyMDAwMDAwLCAxMTAyNSwgMTA4OCwgMHgxOSwgMHgxfSwKKworCS8qIDE2ayAqLworCXsxMjI4ODAwMCwgMTYwMDAsIDc2OCwgMHhhLCAweDB9LAorCXsxODQzMjAwMCwgMTYwMDAsIDExNTIsIDB4YiwgMHgwfSwKKwl7MTIwMDAwMDAsIDE2MDAwLCA3NTAsIDB4YSwgMHgxfSwKKworCS8qIDIyLjA1ayAqLworCXsxMTI4OTYwMCwgMjIwNTAsIDUxMiwgMHgxYSwgMHgwfSwKKwl7MTY5MzQ0MDAsIDIyMDUwLCA3NjgsIDB4MWIsIDB4MH0sCisJezEyMDAwMDAwLCAyMjA1MCwgNTQ0LCAweDFiLCAweDF9LAorCisJLyogMzJrICovCisJezEyMjg4MDAwLCAzMjAwMCwgMzg0LCAweGMsIDB4MH0sCisJezE4NDMyMDAwLCAzMjAwMCwgNTc2LCAweGQsIDB4MH0sCisJezEyMDAwMDAwLCAzMjAwMCwgMzc1LCAweGEsIDB4MX0sCisKKwkvKiA0NC4xayAqLworCXsxMTI4OTYwMCwgNDQxMDAsIDI1NiwgMHgxMCwgMHgwfSwKKwl7MTY5MzQ0MDAsIDQ0MTAwLCAzODQsIDB4MTEsIDB4MH0sCisJezEyMDAwMDAwLCA0NDEwMCwgMjcyLCAweDExLCAweDF9LAorCisJLyogNDhrICovCisJezEyMjg4MDAwLCA0ODAwMCwgMjU2LCAweDAsIDB4MH0sCisJezE4NDMyMDAwLCA0ODAwMCwgMzg0LCAweDEsIDB4MH0sCisJezEyMDAwMDAwLCA0ODAwMCwgMjUwLCAweDAsIDB4MX0sCisKKwkvKiA4OC4yayAqLworCXsxMTI4OTYwMCwgODgyMDAsIDEyOCwgMHgxZSwgMHgwfSwKKwl7MTY5MzQ0MDAsIDg4MjAwLCAxOTIsIDB4MWYsIDB4MH0sCisJezEyMDAwMDAwLCA4ODIwMCwgMTM2LCAweDFmLCAweDF9LAorCisJLyogOTZrICovCisJezEyMjg4MDAwLCA5NjAwMCwgMTI4LCAweGUsIDB4MH0sCisJezE4NDMyMDAwLCA5NjAwMCwgMTkyLCAweGYsIDB4MH0sCisJezEyMDAwMDAwLCA5NjAwMCwgMTI1LCAweGUsIDB4MX0sCit9OworCitzdGF0aWMgaW5saW5lIGludCBnZXRfY29lZmYoaW50IG1jbGssIGludCByYXRlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29lZmZfZGl2KTsgaSsrKSB7CisJCWlmIChjb2VmZl9kaXZbaV0ucmF0ZSA9PSByYXRlICYmIGNvZWZmX2RpdltpXS5tY2xrID09IG1jbGspCisJCQlyZXR1cm4gaTsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgIndtODc1MDogY291bGQgbm90IGdldCBjb2VmZiBmb3IgbWNsayAlZCBAIHJhdGUgJWRcbiIsCisJCW1jbGssIHJhdGUpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHdtODc1MF9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgd204NzUwX3ByaXYgKndtODc1MCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGZyZXEpIHsKKwljYXNlIDExMjg5NjAwOgorCWNhc2UgMTIwMDAwMDA6CisJY2FzZSAxMjI4ODAwMDoKKwljYXNlIDE2OTM0NDAwOgorCWNhc2UgMTg0MzIwMDA6CisJCXdtODc1MC0+c3lzY2xrID0gZnJlcTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHdtODc1MF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXUxNiBpZmFjZSA9IDA7CisKKwkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWlmYWNlID0gMHgwMDQwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGludGVyZmFjZSBmb3JtYXQgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWlmYWNlIHw9IDB4MDAwMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJaWZhY2UgfD0gMHgwMDAxOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQlpZmFjZSB8PSAweDAwMDM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWlmYWNlIHw9IDB4MDAxMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2xvY2sgaW52ZXJzaW9uICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCWlmYWNlIHw9IDB4MDA5MDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJaWZhY2UgfD0gMHgwMDgwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlpZmFjZSB8PSAweDAwMTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0lGQUNFLCBpZmFjZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzUwX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlzdHJ1Y3Qgd204NzUwX3ByaXYgKndtODc1MCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJdTE2IGlmYWNlID0gd204NzUwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTBfSUZBQ0UpICYgMHgxZjM7CisJdTE2IHNyYXRlID0gd204NzUwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTBfU1JBVEUpICYgMHgxYzA7CisJaW50IGNvZWZmID0gZ2V0X2NvZWZmKHdtODc1MC0+c3lzY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKworCS8qIGJpdCBzaXplICovCisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJaWZhY2UgfD0gMHgwMDA0OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQlpZmFjZSB8PSAweDAwMDg7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCWlmYWNlIHw9IDB4MDAwYzsKKwkJYnJlYWs7CisJfQorCisJLyogc2V0IGlmYWNlICYgc3JhdGUgKi8KKwl3bTg3NTBfd3JpdGUoY29kZWMsIFdNODc1MF9JRkFDRSwgaWZhY2UpOworCWlmIChjb2VmZiA+PSAwKQorCQl3bTg3NTBfd3JpdGUoY29kZWMsIFdNODc1MF9TUkFURSwgc3JhdGUgfAorCQkJKGNvZWZmX2Rpdltjb2VmZl0uc3IgPDwgMSkgfCBjb2VmZl9kaXZbY29lZmZdLnVzYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg3NTBfbXV0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1MTYgbXV0ZV9yZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9BRENEQUMpICYgMHhmZmY3OworCisJaWYgKG11dGUpCisJCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0FEQ0RBQywgbXV0ZV9yZWcgfCAweDgpOworCWVsc2UKKwkJd204NzUwX3dyaXRlKGNvZGVjLCBXTTg3NTBfQURDREFDLCBtdXRlX3JlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzUwX2RhcG1fZXZlbnQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZXZlbnQpCit7CisJdTE2IHB3cl9yZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9QV1IxKSAmIDB4ZmUzZTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMDogLyogZnVsbCBPbiAqLworCQkvKiBzZXQgdm1pZCB0byA1MGsgYW5kIHVubXV0ZSBkYWMgKi8KKwkJd204NzUwX3dyaXRlKGNvZGVjLCBXTTg3NTBfUFdSMSwgcHdyX3JlZyB8IDB4MDBjMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfQ1RMX1BPV0VSX0QxOiAvKiBwYXJ0aWFsIE9uICovCisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDI6IC8qIHBhcnRpYWwgT24gKi8KKwkJLyogc2V0IHZtaWQgdG8gNWsgZm9yIHF1aWNrIHBvd2VyIHVwICovCisJCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX1BXUjEsIHB3cl9yZWcgfCAweDAxYzEpOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2hvdDogLyogT2ZmLCB3aXRoIHBvd2VyICovCisJCS8qIG11dGUgZGFjIGFuZCBzZXQgdm1pZCB0byA1MDBrLCBlbmFibGUgVlJFRiAqLworCQl3bTg3NTBfd3JpdGUoY29kZWMsIFdNODc1MF9QV1IxLCBwd3JfcmVnIHwgMHgwMTQxKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDNjb2xkOiAvKiBPZmYsIHdpdGhvdXQgcG93ZXIgKi8KKwkJd204NzUwX3dyaXRlKGNvZGVjLCBXTTg3NTBfUFdSMSwgMHgwMDAxKTsKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5kYXBtX3N0YXRlID0gZXZlbnQ7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgV004NzUwX1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfFwKKwkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgXAorCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzg4MjAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDApCisKKyNkZWZpbmUgV004NzUwX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHxcCisJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCisKK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSB3bTg3NTBfZGFpID0geworCS5uYW1lID0gIldNODc1MCIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFdNODc1MF9SQVRFUywKKwkJLmZvcm1hdHMgPSBXTTg3NTBfRk9STUFUUyx9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzUwX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODc1MF9GT1JNQVRTLH0sCisJLm9wcyA9IHsKKwkJLmh3X3BhcmFtcyA9IHdtODc1MF9wY21faHdfcGFyYW1zLAorCX0sCisJLmRhaV9vcHMgPSB7CisJCS5kaWdpdGFsX211dGUgPSB3bTg3NTBfbXV0ZSwKKwkJLnNldF9mbXQgPSB3bTg3NTBfc2V0X2RhaV9mbXQsCisJCS5zZXRfc3lzY2xrID0gd204NzUwX3NldF9kYWlfc3lzY2xrLAorCX0sCit9OworRVhQT1JUX1NZTUJPTF9HUEwod204NzUwX2RhaSk7CisKK3N0YXRpYyB2b2lkIHdtODc1MF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNuZF9zb2NfY29kZWMsIGRlbGF5ZWRfd29yay53b3JrKTsKKwl3bTg3NTBfZGFwbV9ldmVudChjb2RlYywgY29kZWMtPmRhcG1fc3RhdGUpOworfQorCitzdGF0aWMgaW50IHdtODc1MF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwl3bTg3NTBfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzY29sZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzUwX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgaTsKKwl1OCBkYXRhWzJdOworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCisJLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg3NTBfcmVnKTsgaSsrKSB7CisJCWlmIChpID09IFdNODc1MF9SRVNFVCkKKwkJCWNvbnRpbnVlOworCQlkYXRhWzBdID0gKGkgPDwgMSkgfCAoKGNhY2hlW2ldID4+IDgpICYgMHgwMDAxKTsKKwkJZGF0YVsxXSA9IGNhY2hlW2ldICYgMHgwMGZmOworCQljb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMik7CisJfQorCisJd204NzUwX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CisKKwkvKiBjaGFyZ2Ugd204NzUwIGNhcHMgKi8KKwlpZiAoY29kZWMtPnN1c3BlbmRfZGFwbV9zdGF0ZSA9PSBTTkRSVl9DVExfUE9XRVJfRDApIHsKKwkJd204NzUwX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EMik7CisJCWNvZGVjLT5kYXBtX3N0YXRlID0gU05EUlZfQ1RMX1BPV0VSX0QwOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogaW5pdGlhbGlzZSB0aGUgV004NzUwIGRyaXZlcgorICogcmVnaXN0ZXIgdGhlIG1peGVyIGFuZCBkc3AgaW50ZXJmYWNlcyB3aXRoIHRoZSBrZXJuZWwKKyAqLworc3RhdGljIGludCB3bTg3NTBfaW5pdChzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCWludCByZWcsIHJldCA9IDA7CisKKwljb2RlYy0+bmFtZSA9ICJXTTg3NTAiOworCWNvZGVjLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNvZGVjLT5yZWFkID0gd204NzUwX3JlYWRfcmVnX2NhY2hlOworCWNvZGVjLT53cml0ZSA9IHdtODc1MF93cml0ZTsKKwljb2RlYy0+ZGFwbV9ldmVudCA9IHdtODc1MF9kYXBtX2V2ZW50OworCWNvZGVjLT5kYWkgPSAmd204NzUwX2RhaTsKKwljb2RlYy0+bnVtX2RhaSA9IDE7CisJY29kZWMtPnJlZ19jYWNoZV9zaXplID0gc2l6ZW9mKHdtODc1MF9yZWcpOworCWNvZGVjLT5yZWdfY2FjaGUgPSBrbWVtZHVwKHdtODc1MF9yZWcsIHNpemVvZih3bTg3NTBfcmVnKSwgR0ZQX0tSRU5FTCk7CisJaWYgKGNvZGVjLT5yZWdfY2FjaGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bTg3NTBfcmVzZXQoY29kZWMpOworCisJLyogcmVnaXN0ZXIgcGNtcyAqLworCXJldCA9IHNuZF9zb2NfbmV3X3BjbXMoc29jZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3NTA6IGZhaWxlZCB0byBjcmVhdGUgcGNtc1xuIik7CisJCWdvdG8gcGNtX2VycjsKKwl9CisKKwkvKiBjaGFyZ2Ugb3V0cHV0IGNhcHMgKi8KKwl3bTg3NTBfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QyKTsKKwljb2RlYy0+ZGFwbV9zdGF0ZSA9IFNORFJWX0NUTF9QT1dFUl9EM2hvdDsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCisJLyogc2V0IHRoZSB1cGRhdGUgYml0cyAqLworCXJlZyA9IHdtODc1MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUwX0xEQUMpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0xEQUMsIHJlZyB8IDB4MDEwMCk7CisJcmVnID0gd204NzUwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTBfUkRBQyk7CisJd204NzUwX3dyaXRlKGNvZGVjLCBXTTg3NTBfUkRBQywgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9MT1VUMVYpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0xPVVQxViwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9ST1VUMVYpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX1JPVVQxViwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9MT1VUMlYpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0xPVVQyViwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9ST1VUMlYpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX1JPVVQyViwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9MSU5WT0wpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX0xJTlZPTCwgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1MF9SSU5WT0wpOworCXdtODc1MF93cml0ZShjb2RlYywgV004NzUwX1JJTlZPTCwgcmVnIHwgMHgwMTAwKTsKKworCXdtODc1MF9hZGRfY29udHJvbHMoY29kZWMpOworCXdtODc1MF9hZGRfd2lkZ2V0cyhjb2RlYyk7CisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKHNvY2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3NTA6IGZhaWxlZCB0byByZWdpc3RlciBjYXJkXG4iKTsKKwkJZ290byBjYXJkX2VycjsKKwl9CisJcmV0dXJuIHJldDsKKworY2FyZF9lcnI6CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2RhcG1fZnJlZShzb2NkZXYpOworcGNtX2VycjoKKwlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBJZiB0aGUgaTJjIGxheWVyIHdlcmVuJ3Qgc28gYnJva2VuLCB3ZSBjb3VsZCBwYXNzIHRoaXMga2luZCBvZiBkYXRhCisgICBhcm91bmQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKndtODc1MF9zb2NkZXY7CisKKyNpZiBkZWZpbmVkIChDT05GSUdfSTJDKSB8fCBkZWZpbmVkIChDT05GSUdfSTJDX01PRFVMRSkKKworLyoKKyAqIFdNODczMSAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEdQSU81CisgKiBzdGF0ZSBkdXJpbmcgcG93ZXJ1cC4KKyAqICAgIGxvdyAgPSAweDFhCisgKiAgICBoaWdoID0gMHgxYgorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAwLCBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBNYWdpYyBkZWZpbml0aW9uIG9mIGFsbCBvdGhlciB2YXJpYWJsZXMgYW5kIHRoaW5ncyAqLworSTJDX0NMSUVOVF9JTlNNT0Q7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg3NTBfaTJjX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGU7CisKK3N0YXRpYyBpbnQgd204NzUwX2NvZGVjX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gd204NzUwX3NvY2RldjsKKwlzdHJ1Y3Qgd204NzUwX3NldHVwX2RhdGEgKnNldHVwID0gc29jZGV2LT5jb2RlY19kYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYzsKKwlpbnQgcmV0OworCisJaWYgKGFkZHIgIT0gc2V0dXAtPmkyY19hZGRyZXNzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNsaWVudF90ZW1wbGF0ZS5hZGFwdGVyID0gYWRhcDsKKwljbGllbnRfdGVtcGxhdGUuYWRkciA9IGFkZHI7CisKKwlpMmMgPSBrbWVtZHVwKCZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihjbGllbnRfdGVtcGxhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaTJjID09IE5VTEwpIHsKKwkJa2ZyZWUoY29kZWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgY29kZWMpOworCWNvZGVjLT5jb250cm9sX2RhdGEgPSBpMmM7CisKKwlyZXQgPSBpMmNfYXR0YWNoX2NsaWVudChpMmMpOworCWlmIChyZXQgPCAwKSB7CisJCWVycigiZmFpbGVkIHRvIGF0dGFjaCBjb2RlYyBhdCBhZGRyICV4XG4iLCBhZGRyKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gd204NzUwX2luaXQoc29jZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCWVycigiZmFpbGVkIHRvIGluaXRpYWxpc2UgV004NzUwXG4iKTsKKwkJZ290byBlcnI7CisJfQorCXJldHVybiByZXQ7CisKK2VycjoKKwlrZnJlZShjb2RlYyk7CisJa2ZyZWUoaTJjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtODc1MF9pMmNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShjb2RlYy0+cmVnX2NhY2hlKTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODc1MF9pMmNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIHdtODc1MF9jb2RlY19wcm9iZSk7Cit9CisKKy8qIGNvcmdpIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzUwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiV004NzUwIEkyQyBDb2RlYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLmlkID0gICAgICAgICAgICAgSTJDX0RSSVZFUklEX1dNODc1MCwKKwkuYXR0YWNoX2FkYXB0ZXIgPSB3bTg3NTBfaTJjX2F0dGFjaCwKKwkuZGV0YWNoX2NsaWVudCA9ICB3bTg3NTBfaTJjX2RldGFjaCwKKwkuY29tbWFuZCA9ICAgICAgICBOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKKwkubmFtZSA9ICAgIldNODc1MCIsCisJLmRyaXZlciA9ICZ3bTg3NTBfaTJjX2RyaXZlciwKK307CisjZW5kaWYKKworc3RhdGljIGludCB3bTg3NTBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB3bTg3NTBfc2V0dXBfZGF0YSAqc2V0dXAgPSBzb2NkZXYtPmNvZGVjX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3bTg3NTBfcHJpdiAqd204NzUwOworCWludCByZXQgPSAwOworCisJaW5mbygiV004NzUwIEF1ZGlvIENvZGVjICVzIiwgV004NzUwX1ZFUlNJT04pOworCWNvZGVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29kZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bTg3NTAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd204NzUwX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAod204NzUwID09IE5VTEwpIHsKKwkJa2ZyZWUoY29kZWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljb2RlYy0+cHJpdmF0ZV9kYXRhID0gd204NzUwOworCXNvY2Rldi0+Y29kZWMgPSBjb2RlYzsKKwltdXRleF9pbml0KCZjb2RlYy0+bXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV93aWRnZXRzKTsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOworCXdtODc1MF9zb2NkZXYgPSBzb2NkZXY7CisJSU5JVF9ERUxBWUVEX1dPUksoJmNvZGVjLT5kZWxheWVkX3dvcmssIHdtODc1MF93b3JrKTsKKwkKKyNpZiBkZWZpbmVkIChDT05GSUdfSTJDKSB8fCBkZWZpbmVkIChDT05GSUdfSTJDX01PRFVMRSkKKwlpZiAoc2V0dXAtPmkyY19hZGRyZXNzKSB7CisJCW5vcm1hbF9pMmNbMF0gPSBzZXR1cC0+aTJjX2FkZHJlc3M7CisJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKKwkJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJndtODc1MF9pMmNfZHJpdmVyKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBhZGQgaTJjIGRyaXZlciIpOworCX0KKyNlbHNlCisJCS8qIEFkZCBvdGhlciBpbnRlcmZhY2VzIGhlcmUgKi8KKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIGFueSBkZWxheWVkIHdvcmsgdG8gYmUgcXVldWVkIGFuZCBydW4uCisgKi8KK3N0YXRpYyBpbnQgcnVuX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaykKK3sKKwlpbnQgcmV0OworCisJLyogY2FuY2VsIGFueSB3b3JrIHdhaXRpbmcgdG8gYmUgcXVldWVkLiAqLworCXJldCA9IGNhbmNlbF9kZWxheWVkX3dvcmsoZHdvcmspOworCisJLyogaWYgdGhlcmUgd2FzIGFueSB3b3JrIHdhaXRpbmcgdGhlbiB3ZSBydW4gaXQgbm93IGFuZAorCSAqIHdhaXQgZm9yIGl0J3MgY29tcGxldGlvbiAqLworCWlmIChyZXQpIHsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKGR3b3JrLCAwKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogcG93ZXIgZG93biBjaGlwICovCitzdGF0aWMgaW50IHdtODc1MF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwlpZiAoY29kZWMtPmNvbnRyb2xfZGF0YSkKKwkJd204NzUwX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQpOworCXJ1bl9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmspOworCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CisJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKKyNpZiBkZWZpbmVkIChDT05GSUdfSTJDKSB8fCBkZWZpbmVkIChDT05GSUdfSTJDX01PRFVMRSkKKwlpMmNfZGVsX2RyaXZlcigmd204NzUwX2kyY19kcml2ZXIpOworI2VuZGlmCisJa2ZyZWUoY29kZWMtPnByaXZhdGVfZGF0YSk7CisJa2ZyZWUoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtODc1MCA9IHsKKwkucHJvYmUgPSAJd204NzUwX3Byb2JlLAorCS5yZW1vdmUgPSAJd204NzUwX3JlbW92ZSwKKwkuc3VzcGVuZCA9IAl3bTg3NTBfc3VzcGVuZCwKKwkucmVzdW1lID0Jd204NzUwX3Jlc3VtZSwKK307CisKK0VYUE9SVF9TWU1CT0xfR1BMKHNvY19jb2RlY19kZXZfd204NzUwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFdNODc1MCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmggYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5N2E1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3I6IFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqIEJhc2VkIG9uIFdNODc1My5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfV004NzUwX0gKKyNkZWZpbmUgX1dNODc1MF9ICisKKy8qIFdNODc1MCByZWdpc3RlciBzcGFjZSAqLworCisjZGVmaW5lIFdNODc1MF9MSU5WT0wgICAgMHgwMAorI2RlZmluZSBXTTg3NTBfUklOVk9MICAgIDB4MDEKKyNkZWZpbmUgV004NzUwX0xPVVQxViAgICAweDAyCisjZGVmaW5lIFdNODc1MF9ST1VUMVYgICAgMHgwMworI2RlZmluZSBXTTg3NTBfQURDREFDICAgIDB4MDUKKyNkZWZpbmUgV004NzUwX0lGQUNFICAgICAweDA3CisjZGVmaW5lIFdNODc1MF9TUkFURSAgICAgMHgwOAorI2RlZmluZSBXTTg3NTBfTERBQyAgICAgIDB4MGEKKyNkZWZpbmUgV004NzUwX1JEQUMgICAgICAweDBiCisjZGVmaW5lIFdNODc1MF9CQVNTICAgICAgMHgwYworI2RlZmluZSBXTTg3NTBfVFJFQkxFICAgIDB4MGQKKyNkZWZpbmUgV004NzUwX1JFU0VUICAgICAweDBmCisjZGVmaW5lIFdNODc1MF8zRCAgICAgICAgMHgxMAorI2RlZmluZSBXTTg3NTBfQUxDMSAgICAgIDB4MTEKKyNkZWZpbmUgV004NzUwX0FMQzIgICAgICAweDEyCisjZGVmaW5lIFdNODc1MF9BTEMzICAgICAgMHgxMworI2RlZmluZSBXTTg3NTBfTkdBVEUgICAgIDB4MTQKKyNkZWZpbmUgV004NzUwX0xBREMgICAgICAweDE1CisjZGVmaW5lIFdNODc1MF9SQURDICAgICAgMHgxNgorI2RlZmluZSBXTTg3NTBfQURDVEwxICAgIDB4MTcKKyNkZWZpbmUgV004NzUwX0FEQ1RMMiAgICAweDE4CisjZGVmaW5lIFdNODc1MF9QV1IxICAgICAgMHgxOQorI2RlZmluZSBXTTg3NTBfUFdSMiAgICAgIDB4MWEKKyNkZWZpbmUgV004NzUwX0FEQ1RMMyAgICAweDFiCisjZGVmaW5lIFdNODc1MF9BRENJTiAgICAgMHgxZgorI2RlZmluZSBXTTg3NTBfTEFEQ0lOICAgIDB4MjAKKyNkZWZpbmUgV004NzUwX1JBRENJTiAgICAweDIxCisjZGVmaW5lIFdNODc1MF9MT1VUTTEgICAgMHgyMgorI2RlZmluZSBXTTg3NTBfTE9VVE0yICAgIDB4MjMKKyNkZWZpbmUgV004NzUwX1JPVVRNMSAgICAweDI0CisjZGVmaW5lIFdNODc1MF9ST1VUTTIgICAgMHgyNQorI2RlZmluZSBXTTg3NTBfTU9VVE0xICAgIDB4MjYKKyNkZWZpbmUgV004NzUwX01PVVRNMiAgICAweDI3CisjZGVmaW5lIFdNODc1MF9MT1VUMlYgICAgMHgyOAorI2RlZmluZSBXTTg3NTBfUk9VVDJWICAgIDB4MjkKKyNkZWZpbmUgV004NzUwX01PVVRWICAgICAweDJhCisKKyNkZWZpbmUgV004NzUwX0NBQ0hFX1JFR05VTSAweDJhCisKKyNkZWZpbmUgV004NzUwX1NZU0NMSwkwCisKK3N0cnVjdCB3bTg3NTBfc2V0dXBfZGF0YSB7CisJdW5zaWduZWQgc2hvcnQgaTJjX2FkZHJlc3M7Cit9OworCitleHRlcm4gc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpIHdtODc1MF9kYWk7CitleHRlcm4gc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlIHNvY19jb2RlY19kZXZfd204NzUwOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTY0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCkBAIC0wLDAgKzEsNzcxIEBACisvKgorICogd205NzEyLmMgIC0tICBBTFNBIFNvYyBXTTk3MTIgY29kZWMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDA2IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgNHRoIEZlYiAyMDA2ICAgSW5pdGlhbCB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisKKyNkZWZpbmUgV005NzEyX1ZFUlNJT04gIjAuNCIKKworc3RhdGljIHVuc2lnbmVkIGludCBhYzk3X3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXVuc2lnbmVkIGludCByZWcpOworc3RhdGljIGludCBhYzk3X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworLyoKKyAqIFdNOTcxMiByZWdpc3RlciBjYWNoZQorICovCitzdGF0aWMgY29uc3QgdTE2IHdtOTcxMl9yZWdbXSA9IHsKKwkweDYxNzQsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIC8vIDYKKwkweGYwZjAsIDB4YWFhMCwgMHhjMDA4LCAweDY4MDgsIC8vIGUKKwkweGU4MDgsIDB4YWFhMCwgMHhhZDAwLCAweDgwMDAsIC8vIDE2CisJMHhlODA4LCAweDMwMDAsIDB4ODAwMCwgMHgwMDAwLCAvLyAxZQorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwZiwgLy8gMjYKKwkweDA0MDUsIDB4MDQxMCwgMHhiYjgwLCAweGJiODAsIC8vIDJlCisJMHgwMDAwLCAweGJiODAsIDB4MDAwMCwgMHgwMDAwLCAvLyAzNgorCTB4MDAwMCwgMHgyMDAwLCAweDAwMDAsIDB4MDAwMCwgLy8gM2UKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIC8vIDQ2CisJMHgwMDAwLCAweDAwMDAsIDB4ZjgzZSwgMHhmZmZmLCAvLyA0ZQorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ZjgzZSwgLy8gNTYKKwkweDAwMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIC8vIDVlCisJMHhiMDMyLCAweDNlMDAsIDB4MDAwMCwgMHgwMDAwLCAvLyA2NgorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgLy8gNmUKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDYsIC8vIDc2CisJMHgwMDAxLCAweDAwMDAsIDB4NTc0ZCwgMHg0YzEyLCAvLyA3ZQorCTB4MDAwMCwgMHgwMDAwIC8vIHZpcnR1YWwgaHAgbWl4ZXJzCit9OworCisvKiB2aXJ0dWFsIEhQIG1peGVycyByZWdzICovCisjZGVmaW5lIEhQTF9NSVhFUgkweDgwCisjZGVmaW5lIEhQUl9NSVhFUgkweDgyCisKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfYWxjX3NlbGVjdFtdID0geyJOb25lIiwgIkxlZnQiLCAiUmlnaHQiLCAiU3RlcmVvIn07CitzdGF0aWMgY29uc3QgY2hhciAqd205NzEyX2FsY19tdXhbXSA9IHsiU3RlcmVvIiwgIkxlZnQiLCAiUmlnaHQiLCAiTm9uZSJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtOTcxMl9vdXQzX3NyY1tdID0geyJMZWZ0IiwgIlZSRUYiLCAiTGVmdCArIFJpZ2h0IiwKKwkiTW9ubyJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtOTcxMl9zcGtfc3JjW10gPSB7IlNwZWFrZXIgTWl4IiwgIkhlYWRwaG9uZSBNaXgifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfcmVjX2FkY1tdID0geyJTdGVyZW8iLCAiTGVmdCIsICJSaWdodCIsICJNdXRlIn07CitzdGF0aWMgY29uc3QgY2hhciAqd205NzEyX2Jhc2VbXSA9IHsiTGluZWFyIENvbnRyb2wiLCAiQWRhcHRpdmUgQm9vc3QifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfcmVjX2dhaW5bXSA9IHsiKzEuNWRCIFN0ZXBzIiwgIiswLjc1ZEIgU3RlcHMifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfbWljW10gPSB7Ik1pYyAxIiwgIkRpZmZlcmVudGlhbCIsICJNaWMgMiIsCisJIlN0ZXJlbyJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtOTcxMl9yZWNfc2VsW10gPSB7Ik1pYyIsICJOQyIsICJOQyIsICJTcGVha2VyIE1peGVyIiwKKwkiTGluZSIsICJIZWFkcGhvbmUgTWl4ZXIiLCAiUGhvbmUgTWl4ZXIiLCAiUGhvbmUifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfbmdfdHlwZVtdID0geyJDb25zdGFudCBHYWluIiwgIk11dGUifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTk3MTJfZGlmZl9zZWxbXSA9IHsiTWljIiwgIkxpbmUifTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTk3MTJfZW51bVtdID0geworU09DX0VOVU1fU0lOR0xFKEFDOTdfUENJX1NWSUQsIDE0LCA0LCB3bTk3MTJfYWxjX3NlbGVjdCksCitTT0NfRU5VTV9TSU5HTEUoQUM5N19WSURFTywgMTIsIDQsIHdtOTcxMl9hbGNfbXV4KSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X0FVWCwgOSwgNCwgd205NzEyX291dDNfc3JjKSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X0FVWCwgOCwgMiwgd205NzEyX3Nwa19zcmMpLAorU09DX0VOVU1fU0lOR0xFKEFDOTdfUkVDX1NFTCwgMTIsIDQsIHdtOTcxMl9yZWNfYWRjKSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X01BU1RFUl9UT05FLCAxNSwgMiwgd205NzEyX2Jhc2UpLAorU09DX0VOVU1fRE9VQkxFKEFDOTdfUkVDX0dBSU4sIDE0LCA2LCAyLCB3bTk3MTJfcmVjX2dhaW4pLAorU09DX0VOVU1fU0lOR0xFKEFDOTdfTUlDLCA1LCA0LCB3bTk3MTJfbWljKSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X1JFQ19TRUwsIDgsIDgsIHdtOTcxMl9yZWNfc2VsKSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X1JFQ19TRUwsIDAsIDgsIHdtOTcxMl9yZWNfc2VsKSwKK1NPQ19FTlVNX1NJTkdMRShBQzk3X1BDSV9TVklELCA1LCAyLCB3bTk3MTJfbmdfdHlwZSksCitTT0NfRU5VTV9TSU5HTEUoMHg1YywgOCwgMiwgd205NzEyX2RpZmZfc2VsKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfc25kX2FjOTdfY29udHJvbHNbXSA9IHsKK1NPQ19ET1VCTEUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgQUM5N19NQVNURVIsIDgsIDAsIDMxLCAxKSwKK1NPQ19TSU5HTEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgQUM5N19NQVNURVIsIDE1LCAxLCAxKSwKK1NPQ19ET1VCTEUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCBBQzk3X0hFQURQSE9ORSwgOCwgMCwgMzEsIDEpLAorU09DX1NJTkdMRSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIEFDOTdfSEVBRFBIT05FLDE1LCAxLCAxKSwKKworU09DX1NJTkdMRSgiU3BlYWtlciBQbGF5YmFjayBaQyBTd2l0Y2giLCBBQzk3X01BU1RFUiwgNywgMSwgMCksCitTT0NfU0lOR0xFKCJTcGVha2VyIFBsYXliYWNrIEludmVydCBTd2l0Y2giLCBBQzk3X01BU1RFUiwgNiwgMSwgMCksCitTT0NfU0lOR0xFKCJIZWFkcGhvbmUgUGxheWJhY2sgWkMgU3dpdGNoIiwgQUM5N19IRUFEUEhPTkUsIDcsIDEsIDApLAorU09DX1NJTkdMRSgiTW9ubyBQbGF5YmFjayBaQyBTd2l0Y2giLCBBQzk3X01BU1RFUl9NT05PLCA3LCAxLCAwKSwKK1NPQ19TSU5HTEUoIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgQUM5N19NQVNURVJfTU9OTywgMCwgMzEsIDApLAorCitTT0NfU0lOR0xFKCJBTEMgVGFyZ2V0IFZvbHVtZSIsIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCAxMiwgMTUsIDApLAorU09DX1NJTkdMRSgiQUxDIEhvbGQgVGltZSIsIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCA4LCAxNSwgMCksCitTT0NfU0lOR0xFKCJBTEMgRGVjYXkgVGltZSIsIEFDOTdfQ09ERUNfQ0xBU1NfUkVWLCA0LCAxNSwgMCksCitTT0NfU0lOR0xFKCJBTEMgQXR0YWNrIFRpbWUiLCBBQzk3X0NPREVDX0NMQVNTX1JFViwgMCwgMTUsIDApLAorU09DX0VOVU0oIkFMQyBGdW5jdGlvbiIsIHdtOTcxMl9lbnVtWzBdKSwKK1NPQ19TSU5HTEUoIkFMQyBNYXggVm9sdW1lIiwgQUM5N19QQ0lfU1ZJRCwgMTEsIDcsIDApLAorU09DX1NJTkdMRSgiQUxDIFpDIFRpbWVvdXQiLCBBQzk3X1BDSV9TVklELCA5LCAzLCAxKSwKK1NPQ19TSU5HTEUoIkFMQyBaQyBTd2l0Y2giLCBBQzk3X1BDSV9TVklELCA4LCAxLCAwKSwKK1NPQ19TSU5HTEUoIkFMQyBORyBTd2l0Y2giLCBBQzk3X1BDSV9TVklELCA3LCAxLCAwKSwKK1NPQ19FTlVNKCJBTEMgTkcgVHlwZSIsIHdtOTcxMl9lbnVtWzEwXSksCitTT0NfU0lOR0xFKCJBTEMgTkcgVGhyZXNob2xkIiwgQUM5N19QQ0lfU1ZJRCwgMCwgMzEsIDEpLAorCitTT0NfU0lOR0xFKCJNaWMgSGVhZHBob25lICBWb2x1bWUiLCBBQzk3X1ZJREVPLCAxMiwgNywgMSksCitTT0NfU0lOR0xFKCJBTEMgSGVhZHBob25lIFZvbHVtZSIsIEFDOTdfVklERU8sIDcsIDcsIDEpLAorCitTT0NfU0lOR0xFKCJPdXQzIFN3aXRjaCIsIEFDOTdfQVVYLCAxNSwgMSwgMSksCitTT0NfU0lOR0xFKCJPdXQzIFpDIFN3aXRjaCIsIEFDOTdfQVVYLCA3LCAxLCAxKSwKK1NPQ19TSU5HTEUoIk91dDMgVm9sdW1lIiwgQUM5N19BVVgsIDAsIDMxLCAxKSwKKworU09DX1NJTkdMRSgiUENCZWVwIEJ5cGFzcyBIZWFkcGhvbmUgVm9sdW1lIiwgQUM5N19QQ19CRUVQLCAxMiwgNywgMSksCitTT0NfU0lOR0xFKCJQQ0JlZXAgQnlwYXNzIFNwZWFrZXIgVm9sdW1lIiwgQUM5N19QQ19CRUVQLCA4LCA3LCAxKSwKK1NPQ19TSU5HTEUoIlBDQmVlcCBCeXBhc3MgUGhvbmUgVm9sdW1lIiwgQUM5N19QQ19CRUVQLCA0LCA3LCAxKSwKKworU09DX1NJTkdMRSgiQXV4IFBsYXliYWNrIEhlYWRwaG9uZSBWb2x1bWUiLCBBQzk3X0NELCAxMiwgNywgMSksCitTT0NfU0lOR0xFKCJBdXggUGxheWJhY2sgU3BlYWtlciBWb2x1bWUiLCBBQzk3X0NELCA4LCA3LCAxKSwKK1NPQ19TSU5HTEUoIkF1eCBQbGF5YmFjayBQaG9uZSBWb2x1bWUiLCBBQzk3X0NELCA0LCA3LCAxKSwKKworU09DX1NJTkdMRSgiUGhvbmUgVm9sdW1lIiwgQUM5N19QSE9ORSwgMCwgMTUsIDApLAorU09DX0RPVUJMRSgiTGluZSBDYXB0dXJlIFZvbHVtZSIsIEFDOTdfTElORSwgOCwgMCwgMzEsIDEpLAorCitTT0NfU0lOR0xFKCJDYXB0dXJlIDIwZEIgQm9vc3QgU3dpdGNoIiwgQUM5N19SRUNfU0VMLCAxNCwgMSwgMCksCitTT0NfU0lOR0xFKCJDYXB0dXJlIHRvIFBob25lIDIwZEIgQm9vc3QgU3dpdGNoIiwgQUM5N19SRUNfU0VMLCAxMSwgMSwgMSksCisKK1NPQ19TSU5HTEUoIjNEIFVwcGVyIEN1dC1vZmYgU3dpdGNoIiwgQUM5N18zRF9DT05UUk9MLCA1LCAxLCAxKSwKK1NPQ19TSU5HTEUoIjNEIExvd2VyIEN1dC1vZmYgU3dpdGNoIiwgQUM5N18zRF9DT05UUk9MLCA0LCAxLCAxKSwKK1NPQ19TSU5HTEUoIjNEIFBsYXliYWNrIFZvbHVtZSIsIEFDOTdfM0RfQ09OVFJPTCwgMCwgMTUsIDApLAorCitTT0NfRU5VTSgiQmFzcyBDb250cm9sIiwgd205NzEyX2VudW1bNV0pLAorU09DX1NJTkdMRSgiQmFzcyBDdXQtb2ZmIFN3aXRjaCIsIEFDOTdfTUFTVEVSX1RPTkUsIDEyLCAxLCAxKSwKK1NPQ19TSU5HTEUoIlRvbmUgQ3V0LW9mZiBTd2l0Y2giLCBBQzk3X01BU1RFUl9UT05FLCA0LCAxLCAxKSwKK1NPQ19TSU5HTEUoIlBsYXliYWNrIEF0dGVudWF0ZSAoLTZkQikgU3dpdGNoIiwgQUM5N19NQVNURVJfVE9ORSwgNiwgMSwgMCksCitTT0NfU0lOR0xFKCJCYXNzIFZvbHVtZSIsIEFDOTdfTUFTVEVSX1RPTkUsIDgsIDE1LCAwKSwKK1NPQ19TSU5HTEUoIlRyZWJsZSBWb2x1bWUiLCBBQzk3X01BU1RFUl9UT05FLCAwLCAxNSwgMCksCisKK1NPQ19TSU5HTEUoIkNhcHR1cmUgQURDIFN3aXRjaCIsIEFDOTdfUkVDX0dBSU4sIDE1LCAxLCAxKSwKK1NPQ19FTlVNKCJDYXB0dXJlIFZvbHVtZSBTdGVwcyIsIHdtOTcxMl9lbnVtWzZdKSwKK1NPQ19ET1VCTEUoIkNhcHR1cmUgVm9sdW1lIiwgQUM5N19SRUNfR0FJTiwgOCwgMCwgNjMsIDEpLAorU09DX1NJTkdMRSgiQ2FwdHVyZSBaQyBTd2l0Y2giLCBBQzk3X1JFQ19HQUlOLCA3LCAxLCAwKSwKKworU09DX1NJTkdMRSgiTWljIDEgVm9sdW1lIiwgQUM5N19NSUMsIDgsIDMxLCAxKSwKK1NPQ19TSU5HTEUoIk1pYyAyIFZvbHVtZSIsIEFDOTdfTUlDLCAwLCAzMSwgMSksCitTT0NfU0lOR0xFKCJNaWMgMjBkQiBCb29zdCBTd2l0Y2giLCBBQzk3X01JQywgNywgMSwgMCksCit9OworCisvKiBhZGQgbm9uIGRhcG0gY29udHJvbHMgKi8KK3N0YXRpYyBpbnQgd205NzEyX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGVyciwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtOTcxMl9zbmRfYWM5N19jb250cm9scyk7IGkrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKKwkJCQlzbmRfc29jX2NuZXcoJndtOTcxMl9zbmRfYWM5N19jb250cm9sc1tpXSxjb2RlYywgTlVMTCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCisvKiBXZSBoYXZlIHRvIGNyZWF0ZSBhIGZha2UgbGVmdCBhbmQgcmlnaHQgSFAgbWl4ZXJzIGJlY2F1c2UKKyAqIHRoZSBjb2RlYyBvbmx5IGhhcyBhIHNpbmdsZSBjb250cm9sIHRoYXQgaXMgc2hhcmVkIGJ5IGJvdGggY2hhbm5lbHMuCisgKiBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gZGV0ZXJtaW5lIHRoZSBhdWRpbyBwYXRoLgorICovCitzdGF0aWMgaW50IG1peGVyX2V2ZW50IChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgaW50IGV2ZW50KQoreworCXUxNiBsLCByLCBiZWVwLCBsaW5lLCBwaG9uZSwgbWljLCBwY20sIGF1eDsKKworCWwgPSBhYzk3X3JlYWQody0+Y29kZWMsIEhQTF9NSVhFUik7CisJciA9IGFjOTdfcmVhZCh3LT5jb2RlYywgSFBSX01JWEVSKTsKKwliZWVwID0gYWM5N19yZWFkKHctPmNvZGVjLCBBQzk3X1BDX0JFRVApOworCW1pYyA9IGFjOTdfcmVhZCh3LT5jb2RlYywgQUM5N19WSURFTyk7CisJcGhvbmUgPSBhYzk3X3JlYWQody0+Y29kZWMsIEFDOTdfUEhPTkUpOworCWxpbmUgPSBhYzk3X3JlYWQody0+Y29kZWMsIEFDOTdfTElORSk7CisJcGNtID0gYWM5N19yZWFkKHctPmNvZGVjLCBBQzk3X1BDTSk7CisJYXV4ID0gYWM5N19yZWFkKHctPmNvZGVjLCBBQzk3X0NEKTsKKworCWlmIChsICYgMHgxIHx8IHIgJiAweDEpCisJCWFjOTdfd3JpdGUody0+Y29kZWMsIEFDOTdfVklERU8sIG1pYyAmIDB4N2ZmZik7CisJZWxzZQorCQlhYzk3X3dyaXRlKHctPmNvZGVjLCBBQzk3X1ZJREVPLCBtaWMgfCAweDgwMDApOworCisJaWYgKGwgJiAweDIgfHwgciAmIDB4MikKKwkJYWM5N193cml0ZSh3LT5jb2RlYywgQUM5N19QQ00sIHBjbSAmIDB4N2ZmZik7CisJZWxzZQorCQlhYzk3X3dyaXRlKHctPmNvZGVjLCBBQzk3X1BDTSwgcGNtIHwgMHg4MDAwKTsKKworCWlmIChsICYgMHg0IHx8IHIgJiAweDQpCisJCWFjOTdfd3JpdGUody0+Y29kZWMsIEFDOTdfTElORSwgbGluZSAmIDB4N2ZmZik7CisJZWxzZQorCQlhYzk3X3dyaXRlKHctPmNvZGVjLCBBQzk3X0xJTkUsIGxpbmUgfCAweDgwMDApOworCisJaWYgKGwgJiAweDggfHwgciAmIDB4OCkKKwkJYWM5N193cml0ZSh3LT5jb2RlYywgQUM5N19QSE9ORSwgcGhvbmUgJiAweDdmZmYpOworCWVsc2UKKwkJYWM5N193cml0ZSh3LT5jb2RlYywgQUM5N19QSE9ORSwgcGhvbmUgfCAweDgwMDApOworCisJaWYgKGwgJiAweDEwIHx8IHIgJiAweDEwKQorCQlhYzk3X3dyaXRlKHctPmNvZGVjLCBBQzk3X0NELCBhdXggJiAweDdmZmYpOworCWVsc2UKKwkJYWM5N193cml0ZSh3LT5jb2RlYywgQUM5N19DRCwgYXV4IHwgMHg4MDAwKTsKKworCWlmIChsICYgMHgyMCB8fCByICYgMHgyMCkKKwkJYWM5N193cml0ZSh3LT5jb2RlYywgQUM5N19QQ19CRUVQLCBiZWVwICYgMHg3ZmZmKTsKKwllbHNlCisJCWFjOTdfd3JpdGUody0+Y29kZWMsIEFDOTdfUENfQkVFUCwgYmVlcCB8IDB4ODAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTGVmdCBIZWFkcGhvbmUgTWl4ZXJzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd205NzEyX2hwbF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiUENCZWVwIEJ5cGFzcyBTd2l0Y2giLCBIUExfTUlYRVIsIDUsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiQXV4IFBsYXliYWNrIFN3aXRjaCIsIEhQTF9NSVhFUiwgNCwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJQaG9uZSBCeXBhc3MgU3dpdGNoIiwgSFBMX01JWEVSLCAzLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkxpbmUgQnlwYXNzIFN3aXRjaCIsIEhQTF9NSVhFUiwgMiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgSFBMX01JWEVSLCAxLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBTaWRldG9uZSBTd2l0Y2giLCBIUExfTUlYRVIsIDAsIDEsIDApLAorfTsKKworLyogUmlnaHQgSGVhZHBob25lIE1peGVycyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtOTcxMl9ocHJfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlBDQmVlcCBCeXBhc3MgU3dpdGNoIiwgSFBSX01JWEVSLCA1LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCBIUFJfTUlYRVIsIDQsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiUGhvbmUgQnlwYXNzIFN3aXRjaCIsIEhQUl9NSVhFUiwgMywgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJMaW5lIEJ5cGFzcyBTd2l0Y2giLCBIUFJfTUlYRVIsIDIsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIEhQUl9NSVhFUiwgMSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJNaWMgU2lkZXRvbmUgU3dpdGNoIiwgSFBSX01JWEVSLCAwLCAxLCAwKSwKK307CisKKy8qIFNwZWFrZXIgTWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfc3BlYWtlcl9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiUENCZWVwIEJ5cGFzcyBTd2l0Y2giLCBBQzk3X1BDX0JFRVAsIDExLCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X0NELCAxMSwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJQaG9uZSBCeXBhc3MgU3dpdGNoIiwgQUM5N19QSE9ORSwgMTQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTGluZSBCeXBhc3MgU3dpdGNoIiwgQUM5N19MSU5FLCAxNCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgQUM5N19QQ00sIDE0LCAxLCAxKSwKK307CisKKy8qIFBob25lIE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd205NzEyX3Bob25lX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJQQ0JlZXAgQnlwYXNzIFN3aXRjaCIsIEFDOTdfUENfQkVFUCwgNywgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJBdXggUGxheWJhY2sgU3dpdGNoIiwgQUM5N19DRCwgNywgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJMaW5lIEJ5cGFzcyBTd2l0Y2giLCBBQzk3X0xJTkUsIDEzLCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCBBQzk3X1BDTSwgMTMsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTWljIDEgU2lkZXRvbmUgU3dpdGNoIiwgQUM5N19NSUMsIDE0LCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyAyIFNpZGV0b25lIFN3aXRjaCIsIEFDOTdfTUlDLCAxMywgMSwgMSksCit9OworCisvKiBBTEMgaGVhZHBob25lIG11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtOTcxMl9hbGNfbXV4X2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd205NzEyX2VudW1bMV0pOworCisvKiBvdXQgMyBtdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfb3V0M19tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTk3MTJfZW51bVsyXSk7CisKKy8qIHNwayBtdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfc3BrX211eF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtOTcxMl9lbnVtWzNdKTsKKworLyogQ2FwdHVyZSB0byBQaG9uZSBtdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfY2FwdHVyZV9waG9uZV9tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTk3MTJfZW51bVs0XSk7CisKKy8qIENhcHR1cmUgbGVmdCBzZWxlY3QgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfY2FwdHVyZV9zZWxlY3RsX2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd205NzEyX2VudW1bOF0pOworCisvKiBDYXB0dXJlIHJpZ2h0IHNlbGVjdCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtOTcxMl9jYXB0dXJlX3NlbGVjdHJfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTk3MTJfZW51bVs5XSk7CisKKy8qIE1pYyBzZWxlY3QgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfbWljX3NyY19jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtOTcxMl9lbnVtWzddKTsKKworLyogZGlmZiBzZWxlY3QgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTk3MTJfZGlmZl9zZWxfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTk3MTJfZW51bVsxMV0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd205NzEyX2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX01VWCgiQUxDIFNpZGV0b25lIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkmd205NzEyX2FsY19tdXhfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01VWCgiT3V0MyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJJndtOTcxMl9vdXQzX211eF9jb250cm9scyksCitTTkRfU09DX0RBUE1fTVVYKCJTcGVha2VyIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkmd205NzEyX3Nwa19tdXhfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01VWCgiQ2FwdHVyZSBQaG9uZSBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJJndtOTcxMl9jYXB0dXJlX3Bob25lX211eF9jb250cm9scyksCitTTkRfU09DX0RBUE1fTVVYKCJMZWZ0IENhcHR1cmUgU2VsZWN0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTk3MTJfY2FwdHVyZV9zZWxlY3RsX2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9NVVgoIlJpZ2h0IENhcHR1cmUgU2VsZWN0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTk3MTJfY2FwdHVyZV9zZWxlY3RyX2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9NVVgoIk1pYyBTZWxlY3QgU291cmNlIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTk3MTJfbWljX3NyY19jb250cm9scyksCitTTkRfU09DX0RBUE1fTVVYKCJEaWZmZXJlbnRpYWwgU291cmNlIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTk3MTJfZGlmZl9zZWxfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01JWEVSKCJBQzk3IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9NSVhFUl9FKCJMZWZ0IEhQIE1peGVyIiwgQUM5N19JTlRfUEFHSU5HLCA5LCAxLAorCSZ3bTk3MTJfaHBsX21peGVyX2NvbnRyb2xzWzBdLCBBUlJBWV9TSVpFKHdtOTcxMl9ocGxfbWl4ZXJfY29udHJvbHMpLAorCW1peGVyX2V2ZW50LCBTTkRfU09DX0RBUE1fUE9TVF9SRUcpLAorU05EX1NPQ19EQVBNX01JWEVSX0UoIlJpZ2h0IEhQIE1peGVyIiwgQUM5N19JTlRfUEFHSU5HLCA4LCAxLAorCSZ3bTk3MTJfaHByX21peGVyX2NvbnRyb2xzWzBdLCBBUlJBWV9TSVpFKHdtOTcxMl9ocHJfbWl4ZXJfY29udHJvbHMpLAorCSBtaXhlcl9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUkVHKSwKK1NORF9TT0NfREFQTV9NSVhFUigiUGhvbmUgTWl4ZXIiLCBBQzk3X0lOVF9QQUdJTkcsIDYsIDEsCisJJndtOTcxMl9waG9uZV9taXhlcl9jb250cm9sc1swXSwgQVJSQVlfU0laRSh3bTk3MTJfcGhvbmVfbWl4ZXJfY29udHJvbHMpKSwKK1NORF9TT0NfREFQTV9NSVhFUigiU3BlYWtlciBNaXhlciIsIEFDOTdfSU5UX1BBR0lORywgNywgMSwKKwkmd205NzEyX3NwZWFrZXJfbWl4ZXJfY29udHJvbHNbMF0sCisJQVJSQVlfU0laRSh3bTk3MTJfc3BlYWtlcl9taXhlcl9jb250cm9scykpLAorU05EX1NPQ19EQVBNX01JWEVSKCJNb25vIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9EQUMoIkxlZnQgREFDIiwgIkxlZnQgSGlGaSBQbGF5YmFjayIsIEFDOTdfSU5UX1BBR0lORywgMTQsIDEpLAorU05EX1NPQ19EQVBNX0RBQygiUmlnaHQgREFDIiwgIlJpZ2h0IEhpRmkgUGxheWJhY2siLCBBQzk3X0lOVF9QQUdJTkcsIDEzLCAxKSwKK1NORF9TT0NfREFQTV9EQUMoIkF1eCBEQUMiLCAiQXV4IFBsYXliYWNrIiwgU05EX1NPQ19OT1BNLCAwLCAwKSwKK1NORF9TT0NfREFQTV9BREMoIkxlZnQgQURDIiwgIkxlZnQgSGlGaSBDYXB0dXJlIiwgQUM5N19JTlRfUEFHSU5HLCAxMiwgMSksCitTTkRfU09DX0RBUE1fQURDKCJSaWdodCBBREMiLCAiUmlnaHQgSGlGaSBDYXB0dXJlIiwgQUM5N19JTlRfUEFHSU5HLCAxMSwgMSksCitTTkRfU09DX0RBUE1fUEdBKCJIZWFkcGhvbmUgUEdBIiwgQUM5N19JTlRfUEFHSU5HLCA0LCAxLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIlNwZWFrZXIgUEdBIiwgQUM5N19JTlRfUEFHSU5HLCAzLCAxLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIk91dCAzIFBHQSIsIEFDOTdfSU5UX1BBR0lORywgNSwgMSwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJMaW5lIFBHQSIsIEFDOTdfSU5UX1BBR0lORywgMiwgMSwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJQaG9uZSBQR0EiLCBBQzk3X0lOVF9QQUdJTkcsIDEsIDEsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiTWljIFBHQSIsIEFDOTdfSU5UX1BBR0lORywgMCwgMSwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEJpYXMiLCBBQzk3X0lOVF9QQUdJTkcsIDEwLCAxKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIk1PTk9PVVQiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIkhQT1VUTCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiSFBPVVRSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMiIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiUk9VVDIiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIk9VVDMiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTElORUlOTCIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJMSU5FSU5SIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIlBIT05FIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIlBDQkVFUCIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzIiKSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphdWRpb19tYXBbXVszXSA9IHsKKwkvKiB2aXJ0dWFsIG1peGVyIC0gbWl4ZXMgbGVmdCAmIHJpZ2h0IGNoYW5uZWxzIGZvciBzcGsgYW5kIG1vbm8gKi8KKwl7IkFDOTcgTWl4ZXIiLCBOVUxMLCAiTGVmdCBEQUMifSwKKwl7IkFDOTcgTWl4ZXIiLCBOVUxMLCAiUmlnaHQgREFDIn0sCisKKwkvKiBMZWZ0IEhQIG1peGVyICovCisJeyJMZWZ0IEhQIE1peGVyIiwgIlBDQmVlcCBCeXBhc3MgU3dpdGNoIiwgIlBDQkVFUCJ9LAorCXsiTGVmdCBIUCBNaXhlciIsICJBdXggUGxheWJhY2sgU3dpdGNoIiwgICJBdXggREFDIn0sCisJeyJMZWZ0IEhQIE1peGVyIiwgIlBob25lIEJ5cGFzcyBTd2l0Y2giLCAgIlBob25lIFBHQSJ9LAorCXsiTGVmdCBIUCBNaXhlciIsICJMaW5lIEJ5cGFzcyBTd2l0Y2giLCAgICJMaW5lIFBHQSJ9LAorCXsiTGVmdCBIUCBNaXhlciIsICJQQ00gUGxheWJhY2sgU3dpdGNoIiwgICJMZWZ0IERBQyJ9LAorCXsiTGVmdCBIUCBNaXhlciIsICJNaWMgU2lkZXRvbmUgU3dpdGNoIiwgICJNaWMgUEdBIn0sCisJeyJMZWZ0IEhQIE1peGVyIiwgTlVMTCwgICJBTEMgU2lkZXRvbmUgTXV4In0sCisJLy97IlJpZ2h0IEhQIE1peGVyIiwgTlVMTCwgIkhQIE1peGVyIn0sCisKKwkvKiBSaWdodCBIUCBtaXhlciAqLworCXsiUmlnaHQgSFAgTWl4ZXIiLCAiUENCZWVwIEJ5cGFzcyBTd2l0Y2giLCAiUENCRUVQIn0sCisJeyJSaWdodCBIUCBNaXhlciIsICJBdXggUGxheWJhY2sgU3dpdGNoIiwgICJBdXggREFDIn0sCisJeyJSaWdodCBIUCBNaXhlciIsICJQaG9uZSBCeXBhc3MgU3dpdGNoIiwgICJQaG9uZSBQR0EifSwKKwl7IlJpZ2h0IEhQIE1peGVyIiwgIkxpbmUgQnlwYXNzIFN3aXRjaCIsICAgIkxpbmUgUEdBIn0sCisJeyJSaWdodCBIUCBNaXhlciIsICJQQ00gUGxheWJhY2sgU3dpdGNoIiwgICJSaWdodCBEQUMifSwKKwl7IlJpZ2h0IEhQIE1peGVyIiwgIk1pYyBTaWRldG9uZSBTd2l0Y2giLCAgIk1pYyBQR0EifSwKKwl7IlJpZ2h0IEhQIE1peGVyIiwgTlVMTCwgICJBTEMgU2lkZXRvbmUgTXV4In0sCisKKwkvKiBzcGVha2VyIG1peGVyICovCisJeyJTcGVha2VyIE1peGVyIiwgIlBDQmVlcCBCeXBhc3MgU3dpdGNoIiwgIlBDQkVFUCJ9LAorCXsiU3BlYWtlciBNaXhlciIsICJMaW5lIEJ5cGFzcyBTd2l0Y2giLCAgICJMaW5lIFBHQSJ9LAorCXsiU3BlYWtlciBNaXhlciIsICJQQ00gUGxheWJhY2sgU3dpdGNoIiwgICJBQzk3IE1peGVyIn0sCisJeyJTcGVha2VyIE1peGVyIiwgIlBob25lIEJ5cGFzcyBTd2l0Y2giLCAgIlBob25lIFBHQSJ9LAorCXsiU3BlYWtlciBNaXhlciIsICJBdXggUGxheWJhY2sgU3dpdGNoIiwgICJBdXggREFDIn0sCisKKwkvKiBQaG9uZSBtaXhlciAqLworCXsiUGhvbmUgTWl4ZXIiLCAiUENCZWVwIEJ5cGFzcyBTd2l0Y2giLCAgIlBDQkVFUCJ9LAorCXsiUGhvbmUgTWl4ZXIiLCAiTGluZSBCeXBhc3MgU3dpdGNoIiwgICAgIkxpbmUgUEdBIn0sCisJeyJQaG9uZSBNaXhlciIsICJBdXggUGxheWJhY2sgU3dpdGNoIiwgICAiQXV4IERBQyJ9LAorCXsiUGhvbmUgTWl4ZXIiLCAiUENNIFBsYXliYWNrIFN3aXRjaCIsICAgIkFDOTcgTWl4ZXIifSwKKwl7IlBob25lIE1peGVyIiwgIk1pYyAxIFNpZGV0b25lIFN3aXRjaCIsICJNaWMgUEdBIn0sCisJeyJQaG9uZSBNaXhlciIsICJNaWMgMiBTaWRldG9uZSBTd2l0Y2giLCAiTWljIFBHQSJ9LAorCisJLyogaW5wdXRzICovCisJeyJMaW5lIFBHQSIsIE5VTEwsICJMSU5FSU5MIn0sCisJeyJMaW5lIFBHQSIsIE5VTEwsICJMSU5FSU5SIn0sCisJeyJQaG9uZSBQR0EiLCBOVUxMLCAiUEhPTkUifSwKKwl7Ik1pYyBQR0EiLCBOVUxMLCAiTUlDMSJ9LAorCXsiTWljIFBHQSIsIE5VTEwsICJNSUMyIn0sCisKKwkvKiBsZWZ0IGNhcHR1cmUgc2VsZWN0b3IgKi8KKwl7IkxlZnQgQ2FwdHVyZSBTZWxlY3QiLCAiTWljIiwgIk1JQzEifSwKKwl7IkxlZnQgQ2FwdHVyZSBTZWxlY3QiLCAiU3BlYWtlciBNaXhlciIsICJTcGVha2VyIE1peGVyIn0sCisJeyJMZWZ0IENhcHR1cmUgU2VsZWN0IiwgIkxpbmUiLCAiTElORUlOTCJ9LAorCXsiTGVmdCBDYXB0dXJlIFNlbGVjdCIsICJIZWFkcGhvbmUgTWl4ZXIiLCAiTGVmdCBIUCBNaXhlciJ9LAorCXsiTGVmdCBDYXB0dXJlIFNlbGVjdCIsICJQaG9uZSBNaXhlciIsICJQaG9uZSBNaXhlciJ9LAorCXsiTGVmdCBDYXB0dXJlIFNlbGVjdCIsICJQaG9uZSIsICJQSE9ORSJ9LAorCisJLyogcmlnaHQgY2FwdHVyZSBzZWxlY3RvciAqLworCXsiUmlnaHQgQ2FwdHVyZSBTZWxlY3QiLCAiTWljIiwgIk1JQzIifSwKKwl7IlJpZ2h0IENhcHR1cmUgU2VsZWN0IiwgIlNwZWFrZXIgTWl4ZXIiLCAiU3BlYWtlciBNaXhlciJ9LAorCXsiUmlnaHQgQ2FwdHVyZSBTZWxlY3QiLCAiTGluZSIsICJMSU5FSU5SIn0sCisJeyJSaWdodCBDYXB0dXJlIFNlbGVjdCIsICJIZWFkcGhvbmUgTWl4ZXIiLCAiUmlnaHQgSFAgTWl4ZXIifSwKKwl7IlJpZ2h0IENhcHR1cmUgU2VsZWN0IiwgIlBob25lIE1peGVyIiwgIlBob25lIE1peGVyIn0sCisJeyJSaWdodCBDYXB0dXJlIFNlbGVjdCIsICJQaG9uZSIsICJQSE9ORSJ9LAorCisJLyogQUxDIFNpZGV0b25lICovCisJeyJBTEMgU2lkZXRvbmUgTXV4IiwgIlN0ZXJlbyIsICJMZWZ0IENhcHR1cmUgU2VsZWN0In0sCisJeyJBTEMgU2lkZXRvbmUgTXV4IiwgIlN0ZXJlbyIsICJSaWdodCBDYXB0dXJlIFNlbGVjdCJ9LAorCXsiQUxDIFNpZGV0b25lIE11eCIsICJMZWZ0IiwgIkxlZnQgQ2FwdHVyZSBTZWxlY3QifSwKKwl7IkFMQyBTaWRldG9uZSBNdXgiLCAiUmlnaHQiLCAiUmlnaHQgQ2FwdHVyZSBTZWxlY3QifSwKKworCS8qIEFEQydzICovCisJeyJMZWZ0IEFEQyIsIE5VTEwsICJMZWZ0IENhcHR1cmUgU2VsZWN0In0sCisJeyJSaWdodCBBREMiLCBOVUxMLCAiUmlnaHQgQ2FwdHVyZSBTZWxlY3QifSwKKworCS8qIG91dHB1dHMgKi8KKwl7Ik1PTk9PVVQiLCBOVUxMLCAiUGhvbmUgTWl4ZXIifSwKKwl7IkhQT1VUTCIsIE5VTEwsICJIZWFkcGhvbmUgUEdBIn0sCisJeyJIZWFkcGhvbmUgUEdBIiwgTlVMTCwgIkxlZnQgSFAgTWl4ZXIifSwKKwl7IkhQT1VUUiIsIE5VTEwsICJIZWFkcGhvbmUgUEdBIn0sCisJeyJIZWFkcGhvbmUgUEdBIiwgTlVMTCwgIlJpZ2h0IEhQIE1peGVyIn0sCisKKwkvKiBtb25vIGhwIG1peGVyICovCisJeyJNb25vIEhQIE1peGVyIiwgTlVMTCwgIkxlZnQgSFAgTWl4ZXIifSwKKwl7Ik1vbm8gSFAgTWl4ZXIiLCBOVUxMLCAiUmlnaHQgSFAgTWl4ZXIifSwKKworCS8qIE91dDMgTXV4ICovCisJeyJPdXQzIE11eCIsICJMZWZ0IiwgIkxlZnQgSFAgTWl4ZXIifSwKKwl7Ik91dDMgTXV4IiwgIk1vbm8iLCAiUGhvbmUgTWl4ZXIifSwKKwl7Ik91dDMgTXV4IiwgIkxlZnQgKyBSaWdodCIsICJNb25vIEhQIE1peGVyIn0sCisJeyJPdXQgMyBQR0EiLCBOVUxMLCAiT3V0MyBNdXgifSwKKwl7Ik9VVDMiLCBOVUxMLCAiT3V0IDMgUEdBIn0sCisKKwkvKiBzcGVha2VyIE11eCAqLworCXsiU3BlYWtlciBNdXgiLCAiU3BlYWtlciBNaXgiLCAiU3BlYWtlciBNaXhlciJ9LAorCXsiU3BlYWtlciBNdXgiLCAiSGVhZHBob25lIE1peCIsICJNb25vIEhQIE1peGVyIn0sCisJeyJTcGVha2VyIFBHQSIsIE5VTEwsICJTcGVha2VyIE11eCJ9LAorCXsiTE9VVDIiLCBOVUxMLCAiU3BlYWtlciBQR0EifSwKKwl7IlJPVVQyIiwgTlVMTCwgIlNwZWFrZXIgUEdBIn0sCisKKwl7TlVMTCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgaW50IHdtOTcxMl9hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtOTcxMl9kYXBtX3dpZGdldHMpOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd205NzEyX2RhcG1fd2lkZ2V0c1tpXSk7CisJfQorCisJLyogc2V0IHVwIGF1ZGlvIHBhdGggYXVkaW9fbWFwbmVjdHMgKi8KKwlmb3IoaSA9IDA7IGF1ZGlvX21hcFtpXVswXSAhPSBOVUxMOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQoY29kZWMsIGF1ZGlvX21hcFtpXVswXSwKKwkJCWF1ZGlvX21hcFtpXVsxXSwgYXVkaW9fbWFwW2ldWzJdKTsKKwl9CisKKwlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFjOTdfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJdW5zaWduZWQgaW50IHJlZykKK3sKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCWlmIChyZWcgPT0gQUM5N19SRVNFVCB8fCByZWcgPT0gQUM5N19HUElPX1NUQVRVUyB8fAorCQlyZWcgPT0gQUM5N19WRU5ET1JfSUQxIHx8IHJlZyA9PSBBQzk3X1ZFTkRPUl9JRDIgfHwKKwkJcmVnID09IEFDOTdfUkVDX0dBSU4pCisJCXJldHVybiBzb2NfYWM5N19vcHMucmVhZChjb2RlYy0+YWM5NywgcmVnKTsKKwllbHNlIHsKKwkJcmVnID0gcmVnID4+IDE7CisKKwkJaWYgKHJlZyA+IChBUlJBWV9TSVpFKHdtOTcxMl9yZWcpKSkKKwkJCXJldHVybiAtRUlPOworCisJCXJldHVybiBjYWNoZVtyZWddOworCX0KK30KKworc3RhdGljIGludCBhYzk3X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwl1bnNpZ25lZCBpbnQgdmFsKQoreworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCisJc29jX2FjOTdfb3BzLndyaXRlKGNvZGVjLT5hYzk3LCByZWcsIHZhbCk7CisJcmVnID0gcmVnID4+IDE7CisJaWYgKHJlZyA8PSAoQVJSQVlfU0laRSh3bTk3MTJfcmVnKSkpCisJCWNhY2hlW3JlZ10gPSB2YWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYzk3X3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCWludCByZWc7CisJdTE2IHZyYTsKKworCXZyYSA9IGFjOTdfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCWFjOTdfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCB2cmEgfCAweDEpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJlZyA9IEFDOTdfUENNX0ZST05UX0RBQ19SQVRFOworCWVsc2UKKwkJcmVnID0gQUM5N19QQ01fTFJfQURDX1JBVEU7CisKKwlyZXR1cm4gYWM5N193cml0ZShjb2RlYywgcmVnLCBydW50aW1lLT5yYXRlKTsKK30KKworc3RhdGljIGludCBhYzk3X2F1eF9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwl1MTYgdnJhLCB4c2xlOworCisJdnJhID0gYWM5N19yZWFkKGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJYWM5N193cml0ZShjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIHZyYSB8IDB4MSk7CisJeHNsZSA9IGFjOTdfcmVhZChjb2RlYywgQUM5N19QQ0lfU0lEKTsKKwlhYzk3X3dyaXRlKGNvZGVjLCBBQzk3X1BDSV9TSUQsIHhzbGUgfCAweDgwMDApOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtICE9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGFjOTdfd3JpdGUoY29kZWMsIEFDOTdfUENNX1NVUlJfREFDX1JBVEUsIHJ1bnRpbWUtPnJhdGUpOworfQorCisjZGVmaW5lIFdNOTcxMl9BQzk3X1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfFwKKwkJU05EUlZfUENNX1JBVEVfMjIwNTAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwKQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgd205NzEyX2RhaVtdID0geworeworCS5uYW1lID0gIkFDOTcgSGlGaSIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiSGlGaSBQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV005NzEyX0FDOTdfUkFURVMsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkhpRmkgQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV005NzEyX0FDOTdfUkFURVMsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkub3BzID0geworCQkucHJlcGFyZSA9IGFjOTdfcHJlcGFyZSx9LAorfSwKK3sKKwkubmFtZSA9ICJBQzk3IEF1eCIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiQXV4IFBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAxLAorCQkucmF0ZXMgPSBXTTk3MTJfQUM5N19SQVRFUywKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCS5vcHMgPSB7CisJCS5wcmVwYXJlID0gYWM5N19hdXhfcHJlcGFyZSx9LAorfQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHdtOTcxMl9kYWkpOworCitzdGF0aWMgaW50IHdtOTcxMl9kYXBtX2V2ZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGV2ZW50KQoreworCXUxNiByZWc7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDA6IC8qIGZ1bGwgT24gKi8KKwkJLyogbGlhbSAtIG1heWJlIGVuYWJsZSB0aGVybWFsIHNodXRkb3duICovCisJCXJlZyA9IGFjOTdfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9NSUQpICYgMHhkZmZmOworCQlhYzk3X3dyaXRlKGNvZGVjLCBBQzk3X0VYVEVOREVEX01JRCwgcmVnKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDE6IC8qIHBhcnRpYWwgT24gKi8KKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMjogLyogcGFydGlhbCBPbiAqLworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2hvdDogLyogT2ZmLCB3aXRoIHBvd2VyICovCisJCS8qIGVuYWJsZSBtYXN0ZXIgYmlhcyBhbmQgdm1pZCAqLworCQlyZWcgPSBhYzk3X3JlYWQoY29kZWMsIEFDOTdfRVhURU5ERURfTUlEKSAmIDB4YmJmZjsKKwkJYWM5N193cml0ZShjb2RlYywgQUM5N19FWFRFTkRFRF9NSUQsIHJlZyk7CisJCWFjOTdfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJET1dOLCAweDAwMDApOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQ6IC8qIE9mZiwgd2l0aG91dCBwb3dlciAqLworCQkvKiBkaXNhYmxlIGV2ZXJ5dGhpbmcgaW5jbHVkaW5nIEFDIGxpbmsgKi8KKwkJYWM5N193cml0ZShjb2RlYywgQUM5N19FWFRFTkRFRF9NSUQsIDB4ZmZmZik7CisJCWFjOTdfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfTVNUQVRVUywgMHhmZmZmKTsKKwkJYWM5N193cml0ZShjb2RlYywgQUM5N19QT1dFUkRPV04sIDB4ZmZmZik7CisJCWJyZWFrOworCX0KKwljb2RlYy0+ZGFwbV9zdGF0ZSA9IGV2ZW50OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtOTcxMl9yZXNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCB0cnlfd2FybSkKK3sKKwlpZiAodHJ5X3dhcm0gJiYgc29jX2FjOTdfb3BzLndhcm1fcmVzZXQpIHsKKwkJc29jX2FjOTdfb3BzLndhcm1fcmVzZXQoY29kZWMtPmFjOTcpOworCQlpZiAoIShhYzk3X3JlYWQoY29kZWMsIDApICYgMHg4MDAwKSkKKwkJCXJldHVybiAxOworCX0KKworCXNvY19hYzk3X29wcy5yZXNldChjb2RlYy0+YWM5Nyk7CisJaWYgKGFjOTdfcmVhZChjb2RlYywgMCkgJiAweDgwMDApCisJCWdvdG8gZXJyOworCXJldHVybiAwOworCitlcnI6CisJcHJpbnRrKEtFUk5fRVJSICJXTTk3MTIgQUM5NyByZXNldCBmYWlsZWRcbiIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IHdtOTcxMl9zb2Nfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwl3bTk3MTJfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzY29sZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd205NzEyX3NvY19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IGksIHJldDsKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCXJldCA9IHdtOTcxMl9yZXNldChjb2RlYywgMSk7CisJaWYgKHJldCA8IDApeworCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCByZXNldCBBQzk3IGNvZGVjXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl3bTk3MTJfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKKworCWlmIChyZXQgPT0gMCkgeworCQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSBhZnRlciBjb2xkIHJlc2V0ICovCisJCWZvciAoaSA9IDI7IGkgPCBBUlJBWV9TSVpFKHdtOTcxMl9yZWcpIDw8IDE7IGkrPTIpIHsKKwkJCWlmIChpID09IEFDOTdfSU5UX1BBR0lORyB8fCBpID09IEFDOTdfUE9XRVJET1dOIHx8CisJCQkJKGkgPiAweDU4ICYmIGkgIT0gMHg1YykpCisJCQkJY29udGludWU7CisJCQlzb2NfYWM5N19vcHMud3JpdGUoY29kZWMtPmFjOTcsIGksIGNhY2hlW2k+PjFdKTsKKwkJfQorCX0KKworCWlmIChjb2RlYy0+c3VzcGVuZF9kYXBtX3N0YXRlID09IFNORFJWX0NUTF9QT1dFUl9EMCkKKwkJd205NzEyX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdtOTcxMl9zb2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlpbnQgcmV0ID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIldNOTcxMS9XTTk3MTIgU29DIEF1ZGlvIENvZGVjICVzXG4iLCBXTTk3MTJfVkVSU0lPTik7CisKKwlzb2NkZXYtPmNvZGVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc29jZGV2LT5jb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwljb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJbXV0ZXhfaW5pdCgmY29kZWMtPm11dGV4KTsKKworCWNvZGVjLT5yZWdfY2FjaGUgPQorCQlremFsbG9jKHNpemVvZih1MTYpICogQVJSQVlfU0laRSh3bTk3MTJfcmVnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNvZGVjLT5yZWdfY2FjaGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGNhY2hlX2VycjsKKwl9CisJbWVtY3B5KGNvZGVjLT5yZWdfY2FjaGUsIHdtOTcxMl9yZWcsIHNpemVvZih1MTYpICogQVJSQVlfU0laRSh3bTk3MTJfcmVnKSk7CisJY29kZWMtPnJlZ19jYWNoZV9zaXplID0gc2l6ZW9mKHUxNikgKiBBUlJBWV9TSVpFKHdtOTcxMl9yZWcpOworCWNvZGVjLT5yZWdfY2FjaGVfc3RlcCA9IDI7CisKKwljb2RlYy0+bmFtZSA9ICJXTTk3MTIiOworCWNvZGVjLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNvZGVjLT5kYWkgPSB3bTk3MTJfZGFpOworCWNvZGVjLT5udW1fZGFpID0gQVJSQVlfU0laRSh3bTk3MTJfZGFpKTsKKwljb2RlYy0+d3JpdGUgPSBhYzk3X3dyaXRlOworCWNvZGVjLT5yZWFkID0gYWM5N19yZWFkOworCWNvZGVjLT5kYXBtX2V2ZW50ID0gd205NzEyX2RhcG1fZXZlbnQ7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3dpZGdldHMpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV9wYXRocyk7CisKKwlyZXQgPSBzbmRfc29jX25ld19hYzk3X2NvZGVjKGNvZGVjLCAmc29jX2FjOTdfb3BzLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIndtOTcxMjogZmFpbGVkIHRvIHJlZ2lzdGVyIEFDOTcgY29kZWNcbiIpOworCQlnb3RvIGNvZGVjX2VycjsKKwl9CisKKwkvKiByZWdpc3RlciBwY21zICovCisJcmV0ID0gc25kX3NvY19uZXdfcGNtcyhzb2NkZXYsIFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBwY21fZXJyOworCisJcmV0ID0gd205NzEyX3Jlc2V0KGNvZGVjLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkFDOTcgbGluayBlcnJvclxuIik7CisJCWdvdG8gcmVzZXRfZXJyOworCX0KKworCS8qIHNldCBhbGMgbXV4IHRvIG5vbmUgKi8KKwlhYzk3X3dyaXRlKGNvZGVjLCBBQzk3X1ZJREVPLCBhYzk3X3JlYWQoY29kZWMsIEFDOTdfVklERU8pIHwgMHgzMDAwKTsKKworCXdtOTcxMl9kYXBtX2V2ZW50KGNvZGVjLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOworCXdtOTcxMl9hZGRfY29udHJvbHMoY29kZWMpOworCXdtOTcxMl9hZGRfd2lkZ2V0cyhjb2RlYyk7CisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKHNvY2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3bTk3MTI6IGZhaWxlZCB0byByZWdpc3RlciBjYXJkXG4iKTsKKwkJZ290byByZXNldF9lcnI7CisJfQorCisJcmV0dXJuIDA7CisKK3Jlc2V0X2VycjoKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCitwY21fZXJyOgorCXNuZF9zb2NfZnJlZV9hYzk3X2NvZGVjKGNvZGVjKTsKKworY29kZWNfZXJyOgorCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCitjYWNoZV9lcnI6CisJa2ZyZWUoc29jZGV2LT5jb2RlYyk7CisJc29jZGV2LT5jb2RlYyA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bTk3MTJfc29jX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CisJc25kX3NvY19mcmVlX3BjbXMoc29jZGV2KTsKKwlzbmRfc29jX2ZyZWVfYWM5N19jb2RlYyhjb2RlYyk7CisJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7CisJa2ZyZWUoY29kZWMpOworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2Ugc29jX2NvZGVjX2Rldl93bTk3MTIgPSB7CisJLnByb2JlID0gCXdtOTcxMl9zb2NfcHJvYmUsCisJLnJlbW92ZSA9IAl3bTk3MTJfc29jX3JlbW92ZSwKKwkuc3VzcGVuZCA9CXdtOTcxMl9zb2Nfc3VzcGVuZCwKKwkucmVzdW1lID0Jd205NzEyX3NvY19yZXN1bWUsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChzb2NfY29kZWNfZGV2X3dtOTcxMik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBXTTk3MTEvV005NzEyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTk3MTIuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5MTA1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIHdtOTcxMi5oICAtLSAgV005NzEyIFNvYyBBdWRpbyBkcml2ZXIKKyAqLworCisjaWZuZGVmIF9XTTk3MTJfSAorI2RlZmluZSBfV005NzEyX0gKKworI2RlZmluZSBXTTk3MTJfREFJX0FDOTdfSElGSQkwCisjZGVmaW5lIFdNOTcxMl9EQUlfQUM5N19BVVgJCTEKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSB3bTk3MTJfZGFpWzJdOworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtOTcxMjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL0tjb25maWcgYi9zb3VuZC9zb2MvcHhhL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5ZTFjOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9weGEvS2NvbmZpZwpAQCAtMCwwICsxLDYwIEBACittZW51ICJTb0MgQXVkaW8gZm9yIHRoZSBJbnRlbCBQWEEyeHgiCisKK2NvbmZpZyBTTkRfUFhBMlhYX1NPQworCXRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIHRoZSBJbnRlbCBQWEEyeHggY2hpcCIKKwlkZXBlbmRzIG9uIEFSQ0hfUFhBICYmIFNORAorCXNlbGVjdCBTTkRfUENNCisJaGVscAorCSAgU2F5IFkgb3IgTSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgY29kZWNzIGF0dGFjaGVkIHRvCisJICB0aGUgUFhBMnh4IEFDOTcsIEkyUyBvciBTU1AgaW50ZXJmYWNlLiBZb3Ugd2lsbCBhbHNvIG5lZWQKKwkgIHRvIHNlbGVjdCB0aGUgYXVkaW8gaW50ZXJmYWNlcyB0byBzdXBwb3J0IGJlbG93LgorCitjb25maWcgU05EX1BYQTJYWF9BQzk3CisJdHJpc3RhdGUKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKworY29uZmlnIFNORF9QWEEyWFhfU09DX0FDOTcKKwl0cmlzdGF0ZQorCXNlbGVjdCBBQzk3X0JVUworCXNlbGVjdCBTTkRfU09DX0FDOTdfQlVTCisKK2NvbmZpZyBTTkRfUFhBMlhYX1NPQ19JMlMKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1BYQTJYWF9TT0NfQ09SR0kKKwl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFNoYXJwIFphdXJ1cyBTTC1DN3gwIgorCWRlcGVuZHMgb24gU05EX1BYQTJYWF9TT0MgJiYgUFhBX1NIQVJQX0M3eHgKKwlzZWxlY3QgU05EX1BYQTJYWF9TT0NfSTJTCisJc2VsZWN0IFNORF9TT0NfV004NzMxCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBTaGFycAorCSAgWmF1cnVzIFNMLUM3eDAgbW9kZWxzIChDb3JnaSwgU2hlcGhlcmQsIEh1c2t5KS4KKworY29uZmlnIFNORF9QWEEyWFhfU09DX1NQSVRaCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBTaGFycCBaYXVydXMgU0wtQ3h4MDAiCisJZGVwZW5kcyBvbiBTTkRfUFhBMlhYX1NPQyAmJiBQWEFfU0hBUlBfQ3h4MDAKKwlzZWxlY3QgU05EX1BYQTJYWF9TT0NfSTJTCisJc2VsZWN0IFNORF9TT0NfV004NzUwCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBTaGFycAorCSAgWmF1cnVzIFNMLUN4eDAwIG1vZGVscyAoU3BpdHosIEJvcnpvaSBhbmQgQWtpdGEpLgorCitjb25maWcgU05EX1BYQTJYWF9TT0NfUE9PRExFCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBQb29kbGUiCisJZGVwZW5kcyBvbiBTTkRfUFhBMlhYX1NPQyAmJiBNQUNIX1BPT0RMRQorCXNlbGVjdCBTTkRfUFhBMlhYX1NPQ19JMlMKKwlzZWxlY3QgU05EX1NPQ19XTTg3MzEKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFNoYXJwCisJICBaYXVydXMgU0wtNTYwMCBtb2RlbCAoUG9vZGxlKS4KKworY29uZmlnIFNORF9QWEEyWFhfU09DX1RPU0EKKwl0cmlzdGF0ZSAiU29DIEFDOTcgQXVkaW8gc3VwcG9ydCBmb3IgVG9zYSIKKwlkZXBlbmRzIG9uIFNORF9QWEEyWFhfU09DICYmIE1BQ0hfVE9TQQorCXNlbGVjdCBTTkRfUFhBMlhYX1NPQ19BQzk3CisJc2VsZWN0IFNORF9TT0NfV005NzEyCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBTaGFycAorCSAgWmF1cnVzIFNMLUM2MDAweCBtb2RlbHMgKFRvc2EpLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL01ha2VmaWxlIGIvc291bmQvc29jL3B4YS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGUwZDZiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3B4YS9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACisjIFBYQSBQbGF0Zm9ybSBTdXBwb3J0CitzbmQtc29jLXB4YTJ4eC1vYmpzIDo9IHB4YTJ4eC1wY20ubworc25kLXNvYy1weGEyeHgtYWM5Ny1vYmpzIDo9IHB4YTJ4eC1hYzk3Lm8KK3NuZC1zb2MtcHhhMnh4LWkycy1vYmpzIDo9IHB4YTJ4eC1pMnMubworCitvYmotJChDT05GSUdfU05EX1BYQTJYWF9TT0MpICs9IHNuZC1zb2MtcHhhMnh4Lm8KK29iai0kKENPTkZJR19TTkRfUFhBMlhYX1NPQ19BQzk3KSArPSBzbmQtc29jLXB4YTJ4eC1hYzk3Lm8KK29iai0kKENPTkZJR19TTkRfUFhBMlhYX1NPQ19JMlMpICs9IHNuZC1zb2MtcHhhMnh4LWkycy5vCisKKyMgUFhBIE1hY2hpbmUgU3VwcG9ydAorc25kLXNvYy1jb3JnaS1vYmpzIDo9IGNvcmdpLm8KK3NuZC1zb2MtcG9vZGxlLW9ianMgOj0gcG9vZGxlLm8KK3NuZC1zb2MtdG9zYS1vYmpzIDo9IHRvc2Eubworc25kLXNvYy1zcGl0ei1vYmpzIDo9IHNwaXR6Lm8KKworb2JqLSQoQ09ORklHX1NORF9QWEEyWFhfU09DX0NPUkdJKSArPSBzbmQtc29jLWNvcmdpLm8KK29iai0kKENPTkZJR19TTkRfUFhBMlhYX1NPQ19QT09ETEUpICs9IHNuZC1zb2MtcG9vZGxlLm8KK29iai0kKENPTkZJR19TTkRfUFhBMlhYX1NPQ19UT1NBKSArPSBzbmQtc29jLXRvc2Eubworb2JqLSQoQ09ORklHX1NORF9QWEEyWFhfU09DX1NQSVRaKSArPSBzbmQtc29jLXNwaXR6Lm8KKwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9jb3JnaS5jIGIvc291bmQvc29jL3B4YS9jb3JnaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTUxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcHhhL2NvcmdpLmMKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBjb3JnaS5jICAtLSAgU29DIGF1ZGlvIGZvciBDb3JnaQorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiAgICAgICAgICBSaWNoYXJkIFB1cmRpZSA8cmljaGFyZEBvcGVuZWRoYW5kLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMzB0aCBOb3YgMjAwNSAgIEluaXRpYWwgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3Njb29wLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvcmdpLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXVkaW8uaD4KKworI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg3MzEuaCIKKyNpbmNsdWRlICJweGEyeHgtcGNtLmgiCisjaW5jbHVkZSAicHhhMnh4LWkycy5oIgorCisjZGVmaW5lIENPUkdJX0hQICAgICAgICAwCisjZGVmaW5lIENPUkdJX01JQyAgICAgICAxCisjZGVmaW5lIENPUkdJX0xJTkUgICAgICAyCisjZGVmaW5lIENPUkdJX0hFQURTRVQgICAzCisjZGVmaW5lIENPUkdJX0hQX09GRiAgICA0CisjZGVmaW5lIENPUkdJX1NQS19PTiAgICAwCisjZGVmaW5lIENPUkdJX1NQS19PRkYgICAxCisKKyAvKiBhdWRpbyBjbG9jayBpbiBIeiAtIHJvdW5kZWQgZnJvbSAxMi4yMzVNSHogKi8KKyNkZWZpbmUgQ09SR0lfQVVESU9fQ0xPQ0sgMTIyODgwMDAKKworc3RhdGljIGludCBjb3JnaV9qYWNrX2Z1bmM7CitzdGF0aWMgaW50IGNvcmdpX3Nwa19mdW5jOworCitzdGF0aWMgdm9pZCBjb3JnaV9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IHNwayA9IDAsIG1pYyA9IDAsIGxpbmUgPSAwLCBocCA9IDAsIGhzID0gMDsKKworCS8qIHNldCB1cCBqYWNrIGNvbm5lY3Rpb24gKi8KKwlzd2l0Y2ggKGNvcmdpX2phY2tfZnVuYykgeworCWNhc2UgQ09SR0lfSFA6CisJCWhwID0gMTsKKwkJLyogc2V0ID0gdW5tdXRlIGhlYWRwaG9uZSAqLworCQlzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTVVURV9MKTsKKwkJc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfUik7CisJCWJyZWFrOworCWNhc2UgQ09SR0lfTUlDOgorCQltaWMgPSAxOworCQkvKiByZXNldCA9IG11dGUgaGVhZHBob25lICovCisJCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfTCk7CisJCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfUik7CisJCWJyZWFrOworCWNhc2UgQ09SR0lfTElORToKKwkJbGluZSA9IDE7CisJCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfTCk7CisJCXJlc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX01VVEVfUik7CisJCWJyZWFrOworCWNhc2UgQ09SR0lfSEVBRFNFVDoKKwkJaHMgPSAxOworCQltaWMgPSAxOworCQlyZXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NVVRFX0wpOworCQlzZXRfc2Nvb3BfZ3BpbygmY29yZ2lzY29vcF9kZXZpY2UuZGV2LCBDT1JHSV9TQ1BfTVVURV9SKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNvcmdpX3Nwa19mdW5jID09IENPUkdJX1NQS19PTikKKwkJc3BrID0gMTsKKworCS8qIHNldCB0aGUgZW5wb2ludHMgdG8gdGhlaXIgbmV3IGNvbm5ldGlvbiBzdGF0ZXMgKi8KKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiRXh0IFNwayIsIHNwayk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk1pYyBKYWNrIiwgbWljKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTGluZSBKYWNrIiwgbGluZSk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgaHApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCBocyk7CisKKwkvKiBzaWduYWwgYSBEQVBNIGV2ZW50ICovCisJc25kX3NvY19kYXBtX3N5bmNfZW5kcG9pbnRzKGNvZGVjKTsKK30KKworc3RhdGljIGludCBjb3JnaV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPnNvY2Rldi0+Y29kZWM7CisKKwkvKiBjaGVjayB0aGUgamFjayBzdGF0dXMgYXQgc3RyZWFtIHN0YXJ0dXAgKi8KKwljb3JnaV9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHdlIG5lZWQgdG8gdW5tdXRlIHRoZSBIUCBhdCBzaHV0ZG93biBhcyB0aGUgbXV0ZSBidXJucyBwb3dlciBvbiBjb3JnaSAqLworc3RhdGljIGludCBjb3JnaV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5zb2NkZXYtPmNvZGVjOworCisJLyogc2V0ID0gdW5tdXRlIGhlYWRwaG9uZSAqLworCXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NVVRFX0wpOworCXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NVVRFX1IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcmdpX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWkgPSBydGQtPmRhaS0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKwl1bnNpZ25lZCBpbnQgY2xrID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgODAwMDoKKwljYXNlIDE2MDAwOgorCWNhc2UgNDgwMDA6CisJY2FzZSA5NjAwMDoKKwkJY2xrID0gMTIyODgwMDA7CisJCWJyZWFrOworCWNhc2UgMTEwMjU6CisJY2FzZSAyMjA1MDoKKwljYXNlIDQ0MTAwOgorCQljbGsgPSAxMTI4OTYwMDsKKwkJYnJlYWs7CisJfQorCisJLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gY29kZWNfZGFpLT5kYWlfb3BzLnNldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGNwdV9kYWktPmRhaV9vcHMuc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCisJcmV0ID0gY29kZWNfZGFpLT5kYWlfb3BzLnNldF9zeXNjbGsoY29kZWNfZGFpLCBXTTg3MzFfU1lTQ0xLLCBjbGssCisJCVNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IHRoZSBJMlMgc3lzdGVtIGNsb2NrIGFzIGlucHV0ICh1bnVzZWQpICovCisJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfc3lzY2xrKGNwdV9kYWksIFBYQTJYWF9JMlNfU1lTQ0xLLCAwLAorCQlTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGNvcmdpX29wcyA9IHsKKwkuc3RhcnR1cCA9IGNvcmdpX3N0YXJ0dXAsCisJLmh3X3BhcmFtcyA9IGNvcmdpX2h3X3BhcmFtcywKKwkuc2h1dGRvd24gPSBjb3JnaV9zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgY29yZ2lfZ2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjb3JnaV9qYWNrX2Z1bmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lfc2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJaWYgKGNvcmdpX2phY2tfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJcmV0dXJuIDA7CisKKwljb3JnaV9qYWNrX2Z1bmMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwljb3JnaV9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lfZ2V0X3NwayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNvcmdpX3Nwa19mdW5jOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcmdpX3NldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWlmIChjb3JnaV9zcGtfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJcmV0dXJuIDA7CisKKwljb3JnaV9zcGtfZnVuYyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWNvcmdpX2V4dF9jb250cm9sKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjb3JnaV9hbXBfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCBldmVudCkKK3sKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJc2V0X3Njb29wX2dwaW8oJmNvcmdpc2Nvb3BfZGV2aWNlLmRldiwgQ09SR0lfU0NQX0FQTV9PTik7CisJZWxzZQorCQlyZXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9BUE1fT04pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29yZ2lfbWljX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBpbnQgZXZlbnQpCit7CisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NSUNfQklBUyk7CisJZWxzZQorCQlyZXNldF9zY29vcF9ncGlvKCZjb3JnaXNjb29wX2RldmljZS5kZXYsIENPUkdJX1NDUF9NSUNfQklBUyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogY29yZ2kgbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3MzFfZGFwbV93aWRnZXRzW10gPSB7CitTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSBKYWNrIiwgTlVMTCksCitTTkRfU09DX0RBUE1fTUlDKCJNaWMgSmFjayIsIGNvcmdpX21pY19ldmVudCksCitTTkRfU09DX0RBUE1fU1BLKCJFeHQgU3BrIiwgY29yZ2lfYW1wX2V2ZW50KSwKK1NORF9TT0NfREFQTV9MSU5FKCJMaW5lIEphY2siLCBOVUxMKSwKK1NORF9TT0NfREFQTV9IUCgiSGVhZHNldCBKYWNrIiwgTlVMTCksCit9OworCisvKiBDb3JnaSBtYWNoaW5lIGF1ZGlvIG1hcCAoY29ubmVjdGlvbnMgdG8gdGhlIGNvZGVjIHBpbnMpICovCitzdGF0aWMgY29uc3QgY2hhciAqYXVkaW9fbWFwW11bM10gPSB7CisKKwkvKiBoZWFkc2V0IEphY2sgIC0gaW4gPSBtaWNpbiwgb3V0ID0gTEhQT1VUKi8KKwl7IkhlYWRzZXQgSmFjayIsIE5VTEwsICJMSFBPVVQifSwKKworCS8qIGhlYWRwaG9uZSBjb25uZWN0ZWQgdG8gTEhQT1VUMSwgUkhQT1VUMSAqLworCXsiSGVhZHBob25lIEphY2siLCBOVUxMLCAiTEhQT1VUIn0sCisJeyJIZWFkcGhvbmUgSmFjayIsIE5VTEwsICJSSFBPVVQifSwKKworCS8qIHNwZWFrZXIgY29ubmVjdGVkIHRvIExPVVQsIFJPVVQgKi8KKwl7IkV4dCBTcGsiLCBOVUxMLCAiUk9VVCJ9LAorCXsiRXh0IFNwayIsIE5VTEwsICJMT1VUIn0sCisKKwkvKiBtaWMgaXMgY29ubmVjdGVkIHRvIE1JQ0lOICh2aWEgcmlnaHQgY2hhbm5lbCBvZiBoZWFkcGhvbmUgamFjaykgKi8KKwl7Ik1JQ0lOIiwgTlVMTCwgIk1pYyBKYWNrIn0sCisKKwkvKiBTYW1lIGFzIHRoZSBhYm92ZSBidXQgbm8gbWljIGJpYXMgZm9yIGxpbmUgc2lnbmFscyAqLworCXsiTUlDSU4iLCBOVUxMLCAiTGluZSBKYWNrIn0sCisKKwl7TlVMTCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqamFja19mdW5jdGlvbltdID0geyJIZWFkcGhvbmUiLCAiTWljIiwgIkxpbmUiLCAiSGVhZHNldCIsCisJIk9mZiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKnNwa19mdW5jdGlvbltdID0geyJPbiIsICJPZmYifTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY29yZ2lfZW51bVtdID0geworCVNPQ19FTlVNX1NJTkdMRV9FWFQoNSwgamFja19mdW5jdGlvbiksCisJU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBzcGtfZnVuY3Rpb24pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODczMV9jb3JnaV9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiSmFjayBGdW5jdGlvbiIsIGNvcmdpX2VudW1bMF0sIGNvcmdpX2dldF9qYWNrLAorCQljb3JnaV9zZXRfamFjayksCisJU09DX0VOVU1fRVhUKCJTcGVha2VyIEZ1bmN0aW9uIiwgY29yZ2lfZW51bVsxXSwgY29yZ2lfZ2V0X3NwaywKKwkJY29yZ2lfc2V0X3NwayksCit9OworCisvKgorICogTG9naWMgZm9yIGEgd204NzMxIGFzIGNvbm5lY3RlZCBvbiBhIFNoYXJwIFNMLUM3eDAgRGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgY29yZ2lfd204NzMxX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBpLCBlcnI7CisKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTExJTkVJTiIsIDApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJSTElORUlOIiwgMCk7CisKKwkvKiBBZGQgY29yZ2kgc3BlY2lmaWMgY29udHJvbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg3MzFfY29yZ2lfY29udHJvbHMpOyBpKyspIHsKKwkJZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsCisJCQlzbmRfc29jX2NuZXcoJndtODczMV9jb3JnaV9jb250cm9sc1tpXSxjb2RlYywgTlVMTCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogQWRkIGNvcmdpIHNwZWNpZmljIHdpZGdldHMgKi8KKwlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9kYXBtX3dpZGdldHMpOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd204NzMxX2RhcG1fd2lkZ2V0c1tpXSk7CisJfQorCisJLyogU2V0IHVwIGNvcmdpIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCisJZm9yKGkgPSAwOyBhdWRpb19tYXBbaV1bMF0gIT0gTlVMTDsgaSsrKSB7CisJCXNuZF9zb2NfZGFwbV9jb25uZWN0X2lucHV0KGNvZGVjLCBhdWRpb19tYXBbaV1bMF0sCisJCQlhdWRpb19tYXBbaV1bMV0sIGF1ZGlvX21hcFtpXVsyXSk7CisJfQorCisJc25kX3NvY19kYXBtX3N5bmNfZW5kcG9pbnRzKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworLyogY29yZ2kgZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgY29yZ2lfZGFpID0geworCS5uYW1lID0gIldNODczMSIsCisJLnN0cmVhbV9uYW1lID0gIldNODczMSIsCisJLmNwdV9kYWkgPSAmcHhhX2kyc19kYWksCisJLmNvZGVjX2RhaSA9ICZ3bTg3MzFfZGFpLAorCS5pbml0ID0gY29yZ2lfd204NzMxX2luaXQsCisJLm9wcyA9ICZjb3JnaV9vcHMsCit9OworCisvKiBjb3JnaSBhdWRpbyBtYWNoaW5lIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX21hY2hpbmUgc25kX3NvY19tYWNoaW5lX2NvcmdpID0geworCS5uYW1lID0gIkNvcmdpIiwKKwkuZGFpX2xpbmsgPSAmY29yZ2lfZGFpLAorCS5udW1fbGlua3MgPSAxLAorfTsKKworLyogY29yZ2kgYXVkaW8gcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgc3RydWN0IHdtODczMV9zZXR1cF9kYXRhIGNvcmdpX3dtODczMV9zZXR1cCA9IHsKKwkuaTJjX2FkZHJlc3MgPSAweDFiLAorfTsKKworLyogY29yZ2kgYXVkaW8gc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlIGNvcmdpX3NuZF9kZXZkYXRhID0geworCS5tYWNoaW5lID0gJnNuZF9zb2NfbWFjaGluZV9jb3JnaSwKKwkucGxhdGZvcm0gPSAmcHhhMnh4X3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfd204NzMxLAorCS5jb2RlY19kYXRhID0gJmNvcmdpX3dtODczMV9zZXR1cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjb3JnaV9zbmRfZGV2aWNlOworCitzdGF0aWMgaW50IF9faW5pdCBjb3JnaV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghKG1hY2hpbmVfaXNfY29yZ2koKSB8fCBtYWNoaW5lX2lzX3NoZXBoZXJkKCkgfHwgbWFjaGluZV9pc19odXNreSgpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljb3JnaV9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CisJaWYgKCFjb3JnaV9zbmRfZGV2aWNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGNvcmdpX3NuZF9kZXZpY2UsICZjb3JnaV9zbmRfZGV2ZGF0YSk7CisJY29yZ2lfc25kX2RldmRhdGEuZGV2ID0gJmNvcmdpX3NuZF9kZXZpY2UtPmRldjsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGNvcmdpX3NuZF9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChjb3JnaV9zbmRfZGV2aWNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb3JnaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoY29yZ2lfc25kX2RldmljZSk7Cit9CisKK21vZHVsZV9pbml0KGNvcmdpX2luaXQpOworbW9kdWxlX2V4aXQoY29yZ2lfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgQ29yZ2kiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMgYi9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTVjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogcG9vZGxlLmMgIC0tICBTb0MgYXVkaW8gZm9yIFBvb2RsZQorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiAgICAgICAgICBSaWNoYXJkIFB1cmRpZSA8cmljaGFyZEBvcGVuZWRoYW5kLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2xvY29tby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9wb29kbGUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdWRpby5oPgorCisjaW5jbHVkZSAiLi4vY29kZWNzL3dtODczMS5oIgorI2luY2x1ZGUgInB4YTJ4eC1wY20uaCIKKyNpbmNsdWRlICJweGEyeHgtaTJzLmgiCisKKyNkZWZpbmUgUE9PRExFX0hQICAgICAgICAxCisjZGVmaW5lIFBPT0RMRV9IUF9PRkYgICAgMAorI2RlZmluZSBQT09ETEVfU1BLX09OICAgIDEKKyNkZWZpbmUgUE9PRExFX1NQS19PRkYgICAwCisKKyAvKiBhdWRpbyBjbG9jayBpbiBIeiAtIHJvdW5kZWQgZnJvbSAxMi4yMzVNSHogKi8KKyNkZWZpbmUgUE9PRExFX0FVRElPX0NMT0NLIDEyMjg4MDAwCisKK3N0YXRpYyBpbnQgcG9vZGxlX2phY2tfZnVuYzsKK3N0YXRpYyBpbnQgcG9vZGxlX3Nwa19mdW5jOworCitzdGF0aWMgdm9pZCBwb29kbGVfZXh0X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBzcGsgPSAwOworCisJLyogc2V0IHVwIGphY2sgY29ubmVjdGlvbiAqLworCWlmIChwb29kbGVfamFja19mdW5jID09IFBPT0RMRV9IUCkgeworCQkvKiBzZXQgPSB1bm11dGUgaGVhZHBob25lICovCisJCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCQlQT09ETEVfTE9DT01PX0dQSU9fTVVURV9MLCAxKTsKKwkJbG9jb21vX2dwaW9fd3JpdGUoJnBvb2RsZV9sb2NvbW9fZGV2aWNlLmRldiwKKwkJCVBPT0RMRV9MT0NPTU9fR1BJT19NVVRFX1IsIDEpOworCQlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCAxKTsKKwl9IGVsc2UgeworCQlsb2NvbW9fZ3Bpb193cml0ZSgmcG9vZGxlX2xvY29tb19kZXZpY2UuZGV2LAorCQkJUE9PRExFX0xPQ09NT19HUElPX01VVEVfTCwgMCk7CisJCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCQlQT09ETEVfTE9DT01PX0dQSU9fTVVURV9SLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgMCk7CisJfQorCisJaWYgKHBvb2RsZV9zcGtfZnVuYyA9PSBQT09ETEVfU1BLX09OKQorCQlzcGsgPSAxOworCisJLyogc2V0IHRoZSBlbnBvaW50cyB0byB0aGVpciBuZXcgY29ubmV0aW9uIHN0YXRlcyAqLworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJFeHQgU3BrIiwgc3BrKTsKKworCS8qIHNpZ25hbCBhIERBUE0gZXZlbnQgKi8KKwlzbmRfc29jX2RhcG1fc3luY19lbmRwb2ludHMoY29kZWMpOworfQorCitzdGF0aWMgaW50IHBvb2RsZV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPnNvY2Rldi0+Y29kZWM7CisKKwkvKiBjaGVjayB0aGUgamFjayBzdGF0dXMgYXQgc3RyZWFtIHN0YXJ0dXAgKi8KKwlwb29kbGVfZXh0X2NvbnRyb2woY29kZWMpOworCXJldHVybiAwOworfQorCisvKiB3ZSBuZWVkIHRvIHVubXV0ZSB0aGUgSFAgYXQgc2h1dGRvd24gYXMgdGhlIG11dGUgYnVybnMgcG93ZXIgb24gcG9vZGxlICovCitzdGF0aWMgaW50IHBvb2RsZV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5zb2NkZXYtPmNvZGVjOworCisJLyogc2V0ID0gdW5tdXRlIGhlYWRwaG9uZSAqLworCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCVBPT0RMRV9MT0NPTU9fR1BJT19NVVRFX0wsIDEpOworCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCVBPT0RMRV9MT0NPTU9fR1BJT19NVVRFX1IsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvb2RsZV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpID0gcnRkLT5kYWktPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gcnRkLT5kYWktPmNwdV9kYWk7CisJdW5zaWduZWQgaW50IGNsayA9IDA7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwljYXNlIDgwMDA6CisJY2FzZSAxNjAwMDoKKwljYXNlIDQ4MDAwOgorCWNhc2UgOTYwMDA6CisJCWNsayA9IDEyMjg4MDAwOworCQlicmVhazsKKwljYXNlIDExMDI1OgorCWNhc2UgMjIwNTA6CisJY2FzZSA0NDEwMDoKKwkJY2xrID0gMTEyODk2MDA7CisJCWJyZWFrOworCX0KKworCS8qIHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGNvZGVjX2RhaS0+ZGFpX29wcy5zZXRfZm10KGNvZGVjX2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKKwkJU05EX1NPQ19EQUlGTVRfTkJfTkYgfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KKwlyZXQgPSBjcHVfZGFpLT5kYWlfb3BzLnNldF9mbXQoY3B1X2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKKwkJU05EX1NPQ19EQUlGTVRfTkJfTkYgfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLworCXJldCA9IGNvZGVjX2RhaS0+ZGFpX29wcy5zZXRfc3lzY2xrKGNvZGVjX2RhaSwgV004NzMxX1NZU0NMSywgY2xrLAorCQlTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNldCB0aGUgSTJTIHN5c3RlbSBjbG9jayBhcyBpbnB1dCAodW51c2VkKSAqLworCXJldCA9IGNwdV9kYWktPmRhaV9vcHMuc2V0X3N5c2NsayhjcHVfZGFpLCBQWEEyWFhfSTJTX1NZU0NMSywgMCwKKwkJU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBwb29kbGVfb3BzID0geworCS5zdGFydHVwID0gcG9vZGxlX3N0YXJ0dXAsCisJLmh3X3BhcmFtcyA9IHBvb2RsZV9od19wYXJhbXMsCisJLnNodXRkb3duID0gcG9vZGxlX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBwb29kbGVfZ2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwb29kbGVfamFja19mdW5jOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvb2RsZV9zZXRfamFjayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJaWYgKHBvb2RsZV9qYWNrX2Z1bmMgPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCXJldHVybiAwOworCisJcG9vZGxlX2phY2tfZnVuYyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXBvb2RsZV9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcG9vZGxlX2dldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwb29kbGVfc3BrX2Z1bmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG9vZGxlX3NldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWlmIChwb29kbGVfc3BrX2Z1bmMgPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCXJldHVybiAwOworCisJcG9vZGxlX3Nwa19mdW5jID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcG9vZGxlX2V4dF9jb250cm9sKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwb29kbGVfYW1wX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBpbnQgZXZlbnQpCit7CisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCQlQT09ETEVfTE9DT01PX0dQSU9fQU1QX09OLCAwKTsKKwllbHNlCisJCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCQlQT09ETEVfTE9DT01PX0dQSU9fQU1QX09OLCAxKTsKKworCXJldHVybiAwOworfQorCisvKiBwb29kbGUgbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3MzFfZGFwbV93aWRnZXRzW10gPSB7CitTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSBKYWNrIiwgTlVMTCksCitTTkRfU09DX0RBUE1fU1BLKCJFeHQgU3BrIiwgcG9vZGxlX2FtcF9ldmVudCksCit9OworCisvKiBDb3JnaSBtYWNoaW5lIGF1ZGlvX21hcG5lY3Rpb25zIHRvIHRoZSBjb2RlYyBwaW5zICovCitzdGF0aWMgY29uc3QgY2hhciAqYXVkaW9fbWFwW11bM10gPSB7CisKKwkvKiBoZWFkcGhvbmUgY29ubmVjdGVkIHRvIExIUE9VVDEsIFJIUE9VVDEgKi8KKwl7IkhlYWRwaG9uZSBKYWNrIiwgTlVMTCwgIkxIUE9VVCJ9LAorCXsiSGVhZHBob25lIEphY2siLCBOVUxMLCAiUkhQT1VUIn0sCisKKwkvKiBzcGVha2VyIGNvbm5lY3RlZCB0byBMT1VULCBST1VUICovCisJeyJFeHQgU3BrIiwgTlVMTCwgIlJPVVQifSwKKwl7IkV4dCBTcGsiLCBOVUxMLCAiTE9VVCJ9LAorCisJe05VTEwsIE5VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmphY2tfZnVuY3Rpb25bXSA9IHsiT2ZmIiwgIkhlYWRwaG9uZSJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKnNwa19mdW5jdGlvbltdID0geyJPZmYiLCAiT24ifTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcG9vZGxlX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIGphY2tfZnVuY3Rpb24pLAorCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgc3BrX2Z1bmN0aW9uKSwKK307CisKK3N0YXRpYyBjb25zdCBzbmRfa2NvbnRyb2xfbmV3X3Qgd204NzMxX3Bvb2RsZV9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiSmFjayBGdW5jdGlvbiIsIHBvb2RsZV9lbnVtWzBdLCBwb29kbGVfZ2V0X2phY2ssCisJCXBvb2RsZV9zZXRfamFjayksCisJU09DX0VOVU1fRVhUKCJTcGVha2VyIEZ1bmN0aW9uIiwgcG9vZGxlX2VudW1bMV0sIHBvb2RsZV9nZXRfc3BrLAorCQlwb29kbGVfc2V0X3NwayksCit9OworCisvKgorICogTG9naWMgZm9yIGEgd204NzMxIGFzIGNvbm5lY3RlZCBvbiBhIFNoYXJwIFNMLUM3eDAgRGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgcG9vZGxlX3dtODczMV9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaSwgZXJyOworCisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkxMSU5FSU4iLCAwKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiUkxJTkVJTiIsIDApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJNSUNJTiIsIDEpOworCisJLyogQWRkIHBvb2RsZSBzcGVjaWZpYyBjb250cm9scyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9wb29kbGVfY29udHJvbHMpOyBpKyspIHsKKwkJZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsCisJCQlzbmRfc29jX2NuZXcoJndtODczMV9wb29kbGVfY29udHJvbHNbaV0sY29kZWMsIE5VTEwpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIEFkZCBwb29kbGUgc3BlY2lmaWMgd2lkZ2V0cyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9kYXBtX3dpZGdldHMpOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd204NzMxX2RhcG1fd2lkZ2V0c1tpXSk7CisJfQorCisJLyogU2V0IHVwIHBvb2RsZSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLworCWZvciAoaSA9IDA7IGF1ZGlvX21hcFtpXVswXSAhPSBOVUxMOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQoY29kZWMsIGF1ZGlvX21hcFtpXVswXSwKKwkJCWF1ZGlvX21hcFtpXVsxXSwgYXVkaW9fbWFwW2ldWzJdKTsKKwl9CisKKwlzbmRfc29jX2RhcG1fc3luY19lbmRwb2ludHMoY29kZWMpOworCXJldHVybiAwOworfQorCisvKiBwb29kbGUgZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgcG9vZGxlX2RhaSA9IHsKKwkubmFtZSA9ICJXTTg3MzEiLAorCS5zdHJlYW1fbmFtZSA9ICJXTTg3MzEiLAorCS5jcHVfZGFpID0gJnB4YV9pMnNfZGFpLAorCS5jb2RlY19kYWkgPSAmd204NzMxX2RhaSwKKwkuaW5pdCA9IHBvb2RsZV93bTg3MzFfaW5pdCwKKwkub3BzID0gJnBvb2RsZV9vcHMsCit9OworCisvKiBwb29kbGUgYXVkaW8gbWFjaGluZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHNuZF9zb2NfbWFjaGluZV9wb29kbGUgPSB7CisJLm5hbWUgPSAiUG9vZGxlIiwKKwkuZGFpX2xpbmsgPSAmcG9vZGxlX2RhaSwKKwkubnVtX2xpbmtzID0gMSwKK307CisKKy8qIHBvb2RsZSBhdWRpbyBwcml2YXRlIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3Qgd204NzMxX3NldHVwX2RhdGEgcG9vZGxlX3dtODczMV9zZXR1cCA9IHsKKwkuaTJjX2FkZHJlc3MgPSAweDFiLAorfTsKKworLyogcG9vZGxlIGF1ZGlvIHN1YnN5c3RlbSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RldmljZSBwb29kbGVfc25kX2RldmRhdGEgPSB7CisJLm1hY2hpbmUgPSAmc25kX3NvY19tYWNoaW5lX3Bvb2RsZSwKKwkucGxhdGZvcm0gPSAmcHhhMnh4X3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfd204NzMxLAorCS5jb2RlY19kYXRhID0gJnBvb2RsZV93bTg3MzFfc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcG9vZGxlX3NuZF9kZXZpY2U7CisKK3N0YXRpYyBpbnQgX19pbml0IHBvb2RsZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghbWFjaGluZV9pc19wb29kbGUoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlsb2NvbW9fZ3Bpb19zZXRfZGlyKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCisJCVBPT0RMRV9MT0NPTU9fR1BJT19BTVBfT04sIDApOworCS8qIHNob3VsZCB3ZSBtdXRlIEhQIGF0IHN0YXJ0dXAgLSBidXJuaW5nIHBvd2VyID8qLworCWxvY29tb19ncGlvX3NldF9kaXIoJnBvb2RsZV9sb2NvbW9fZGV2aWNlLmRldiwKKwkJUE9PRExFX0xPQ09NT19HUElPX01VVEVfTCwgMCk7CisJbG9jb21vX2dwaW9fc2V0X2RpcigmcG9vZGxlX2xvY29tb19kZXZpY2UuZGV2LAorCQlQT09ETEVfTE9DT01PX0dQSU9fTVVURV9SLCAwKTsKKworCXBvb2RsZV9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CisJaWYgKCFwb29kbGVfc25kX2RldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwb29kbGVfc25kX2RldmljZSwgJnBvb2RsZV9zbmRfZGV2ZGF0YSk7CisJcG9vZGxlX3NuZF9kZXZkYXRhLmRldiA9ICZwb29kbGVfc25kX2RldmljZS0+ZGV2OworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQocG9vZGxlX3NuZF9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwb29kbGVfc25kX2RldmljZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcG9vZGxlX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihwb29kbGVfc25kX2RldmljZSk7Cit9CisKK21vZHVsZV9pbml0KHBvb2RsZV9pbml0KTsKK21vZHVsZV9leGl0KHBvb2RsZV9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFB1cmRpZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBQb29kbGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LWFjOTcuYyBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LWFjOTcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmJiZWZmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5jCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogbGludXgvc291bmQvcHhhMnh4LWFjOTcuYyAtLSBBQzk3IHN1cHBvcnQgZm9yIHRoZSBJbnRlbCBQWEEyeHggY2hpcC4KKyAqCisgKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqIENyZWF0ZWQ6CURlYyAwMiwgMjAwNAorICogQ29weXJpZ2h0OglNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXVkaW8uaD4KKworI2luY2x1ZGUgInB4YTJ4eC1wY20uaCIKKyNpbmNsdWRlICJweGEyeHgtYWM5Ny5oIgorCitzdGF0aWMgREVGSU5FX01VVEVYKGNhcl9tdXRleCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZ3NyX3dxKTsKK3N0YXRpYyB2b2xhdGlsZSBsb25nIGdzcl9iaXRzOworCisvKgorICogQmV3YXJlIFBYQTI3eCBidWdzOgorICoKKyAqICAgbyBTbG90IDEyIHJlYWQgZnJvbSBtb2RlbSBzcGFjZSB3aWxsIGhhbmcgY29udHJvbGxlci4KKyAqICAgbyBDRE9ORSwgU0RPTkUgaW50ZXJydXB0IGZhaWxzIGFmdGVyIGFueSBzbG90IDEyIElPLgorICoKKyAqIFdlIHRoZXJlZm9yZSBoYXZlIGFuIGh5YnJpZCBhcHByb2FjaCBmb3Igd2FpdGluZyBvbiBTRE9ORSAoaW50ZXJydXB0IG9yCisgKiAxIGppZmZ5IHRpbWVvdXQgaWYgaW50ZXJydXB0IG5ldmVyIGNvbWVzKS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHhhMnh4X2FjOTdfcmVhZChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsCisJdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXVuc2lnbmVkIHNob3J0IHZhbCA9IC0xOworCXZvbGF0aWxlIHUzMiAqcmVnX2FkZHI7CisKKwltdXRleF9sb2NrKCZjYXJfbXV0ZXgpOworCisJLyogc2V0IHVwIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNvZGVjL21vZGVtIHNwYWNlICovCisjaWZkZWYgQ09ORklHX1BYQTI3eAorCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNBQ19SRUdfQkFTRSA6ICZQQUNfUkVHX0JBU0U7CisjZWxzZQorCWlmIChyZWcgPT0gQUM5N19HUElPX1NUQVRVUykKKwkJcmVnX2FkZHIgPSBhYzk3LT5udW0gPyAmU01DX1JFR19CQVNFIDogJlBNQ19SRUdfQkFTRTsKKwllbHNlCisJCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNBQ19SRUdfQkFTRSA6ICZQQUNfUkVHX0JBU0U7CisjZW5kaWYKKwlyZWdfYWRkciArPSAocmVnID4+IDEpOworCisjaWZuZGVmIENPTkZJR19QWEEyN3gKKwlpZiAocmVnID09IEFDOTdfR1BJT19TVEFUVVMpIHsKKwkJLyogcmVhZCBmcm9tIGNvbnRyb2xsZXIgY2FjaGUgKi8KKwkJdmFsID0gKnJlZ19hZGRyOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKworCS8qIHN0YXJ0IHJlYWQgYWNjZXNzIGFjcm9zcyB0aGUgYWM5NyBsaW5rICovCisJR1NSID0gR1NSX0NET05FIHwgR1NSX1NET05FOworCWdzcl9iaXRzID0gMDsKKwl2YWwgPSAqcmVnX2FkZHI7CisKKwl3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCAoR1NSIHwgZ3NyX2JpdHMpICYgR1NSX1NET05FLCAxKTsKKwlpZiAoISgoR1NSIHwgZ3NyX2JpdHMpICYgR1NSX1NET05FKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWFkIGVycm9yIChhYzk3X3JlZz0leCBHU1I9JSNseClcbiIsCisJCQkJX19GVU5DVElPTl9fLCByZWcsIEdTUiB8IGdzcl9iaXRzKTsKKwkJdmFsID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHZhbGlkIGRhdGEgbm93ICovCisJR1NSID0gR1NSX0NET05FIHwgR1NSX1NET05FOworCWdzcl9iaXRzID0gMDsKKwl2YWwgPSAqcmVnX2FkZHI7CisJLyogYnV0IHdlJ3ZlIGp1c3Qgc3RhcnRlZCBhbm90aGVyIGN5Y2xlLi4uICovCisJd2FpdF9ldmVudF90aW1lb3V0KGdzcl93cSwgKEdTUiB8IGdzcl9iaXRzKSAmIEdTUl9TRE9ORSwgMSk7CisKK291dDoJbXV0ZXhfdW5sb2NrKCZjYXJfbXV0ZXgpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X3dyaXRlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLAorCXVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwl2b2xhdGlsZSB1MzIgKnJlZ19hZGRyOworCisJbXV0ZXhfbG9jaygmY2FyX211dGV4KTsKKworCS8qIHNldCB1cCBwcmltYXJ5IG9yIHNlY29uZGFyeSBjb2RlYy9tb2RlbSBzcGFjZSAqLworI2lmZGVmIENPTkZJR19QWEEyN3gKKwlyZWdfYWRkciA9IGFjOTctPm51bSA/ICZTQUNfUkVHX0JBU0UgOiAmUEFDX1JFR19CQVNFOworI2Vsc2UKKwlpZiAocmVnID09IEFDOTdfR1BJT19TVEFUVVMpCisJCXJlZ19hZGRyID0gYWM5Ny0+bnVtID8gJlNNQ19SRUdfQkFTRSA6ICZQTUNfUkVHX0JBU0U7CisJZWxzZQorCQlyZWdfYWRkciA9IGFjOTctPm51bSA/ICZTQUNfUkVHX0JBU0UgOiAmUEFDX1JFR19CQVNFOworI2VuZGlmCisJcmVnX2FkZHIgKz0gKHJlZyA+PiAxKTsKKworCUdTUiA9IEdTUl9DRE9ORSB8IEdTUl9TRE9ORTsKKwlnc3JfYml0cyA9IDA7CisJKnJlZ19hZGRyID0gdmFsOworCXdhaXRfZXZlbnRfdGltZW91dChnc3Jfd3EsIChHU1IgfCBnc3JfYml0cykgJiBHU1JfQ0RPTkUsIDEpOworCWlmICghKChHU1IgfCBnc3JfYml0cykgJiBHU1JfQ0RPTkUpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB3cml0ZSBlcnJvciAoYWM5N19yZWc9JXggR1NSPSUjbHgpXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgcmVnLCBHU1IgfCBnc3JfYml0cyk7CisKKwltdXRleF91bmxvY2soJmNhcl9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X3dhcm1fcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworCWdzcl9iaXRzID0gMDsKKworI2lmZGVmIENPTkZJR19QWEEyN3gKKwkvKiB3YXJtIHJlc2V0IGJyb2tlbiBvbiBCdWx2ZXJkZSwKKwkgICBzbyBtYW51YWxseSBrZWVwIEFDOTcgcmVzZXQgaGlnaCAqLworCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19PVVQgfCBHUElPX0RGTFRfSElHSCk7CisJdWRlbGF5KDEwKTsKKwlHQ1IgfD0gR0NSX1dBUk1fUlNUOworCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19BTFRfRk5fMl9PVVQpOworCXVkZWxheSg1MDApOworI2Vsc2UKKwlHQ1IgfD0gR0NSX1dBUk1fUlNUIHwgR0NSX1BSSVJEWV9JRU4gfCBHQ1JfU0VDUkRZX0lFTjsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoZ3NyX3dxLCBnc3JfYml0cyAmIChHU1JfUENSIHwgR1NSX1NDUiksIDEpOworI2VuZGlmCisKKwlpZiAoISgoR1NSIHwgZ3NyX2JpdHMpICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB3YXJtIHJlc2V0IHRpbWVvdXQgKEdTUj0lI2x4KVxuIiwKKwkJCQkgX19GVU5DVElPTl9fLCBnc3JfYml0cyk7CisKKwlHQ1IgJj0gfihHQ1JfUFJJUkRZX0lFTnxHQ1JfU0VDUkRZX0lFTik7CisJR0NSIHw9IEdDUl9TRE9ORV9JRXxHQ1JfQ0RPTkVfSUU7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTJ4eF9hYzk3X2NvbGRfcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworCUdDUiAmPSAgR0NSX0NPTERfUlNUOyAgLyogY2xlYXIgZXZlcnl0aGluZyBidXQgbkNSU1QgKi8KKwlHQ1IgJj0gfkdDUl9DT0xEX1JTVDsgIC8qIHRoZW4gYXNzZXJ0IG5DUlNUICovCisKKwlnc3JfYml0cyA9IDA7CisjaWZkZWYgQ09ORklHX1BYQTI3eAorCS8qIFBYQTI3eCBEZXZlbG9wZXJzIE1hbnVhbCBzZWN0aW9uIDEzLjUuMi4yLjEgKi8KKwlweGFfc2V0X2NrZW4oMSA8PCAzMSwgMSk7CisJdWRlbGF5KDUpOworCXB4YV9zZXRfY2tlbigxIDw8IDMxLCAwKTsKKwlHQ1IgPSBHQ1JfQ09MRF9SU1Q7CisJdWRlbGF5KDUwKTsKKyNlbHNlCisJR0NSID0gR0NSX0NPTERfUlNUOworCUdDUiB8PSBHQ1JfQ0RPTkVfSUV8R0NSX1NET05FX0lFOworCXdhaXRfZXZlbnRfdGltZW91dChnc3Jfd3EsIGdzcl9iaXRzICYgKEdTUl9QQ1IgfCBHU1JfU0NSKSwgMSk7CisjZW5kaWYKKworCWlmICghKChHU1IgfCBnc3JfYml0cykgJiAoR1NSX1BDUiB8IEdTUl9TQ1IpKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbGQgcmVzZXQgdGltZW91dCAoR1NSPSUjbHgpXG4iLAorCQkJCSBfX0ZVTkNUSU9OX18sIGdzcl9iaXRzKTsKKworCUdDUiAmPSB+KEdDUl9QUklSRFlfSUVOfEdDUl9TRUNSRFlfSUVOKTsKKwlHQ1IgfD0gR0NSX1NET05FX0lFfEdDUl9DRE9ORV9JRTsKK30KKworc3RhdGljIGlycXJldHVybl90IHB4YTJ4eF9hYzk3X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJbG9uZyBzdGF0dXM7CisKKwlzdGF0dXMgPSBHU1I7CisJaWYgKHN0YXR1cykgeworCQlHU1IgPSBzdGF0dXM7CisJCWdzcl9iaXRzIHw9IHN0YXR1czsKKwkJd2FrZV91cCgmZ3NyX3dxKTsKKworI2lmZGVmIENPTkZJR19QWEEyN3gKKwkJLyogQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRob3NlIHdlIHN0aWxsIG5lZWQgdG8gY2xlYXIgdGhlbQorCQkgICBzaW5jZSB0aGV5IHRlbmQgdG8gc3B1cmlvdXNseSB0cmlnZ2VyIHdoZW4gTU1DIGlzIHVzZWQKKwkJICAgKGhhcmR3YXJlIGJ1Zz8gZ28gZmlndXJlKS4uLiAqLworCQlNSVNSID0gTUlTUl9FT0M7CisJCVBJU1IgPSBQSVNSX0VPQzsKKwkJTUNTUiA9IE1DU1JfRU9DOworI2VuZGlmCisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgc29jX2FjOTdfb3BzID0geworCS5yZWFkCT0gcHhhMnh4X2FjOTdfcmVhZCwKKwkud3JpdGUJPSBweGEyeHhfYWM5N193cml0ZSwKKwkud2FybV9yZXNldAk9IHB4YTJ4eF9hYzk3X3dhcm1fcmVzZXQsCisJLnJlc2V0CT0gcHhhMnh4X2FjOTdfY29sZF9yZXNldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zIHB4YTJ4eF9hYzk3X3BjbV9zdGVyZW9fb3V0ID0geworCS5uYW1lCQkJPSAiQUM5NyBQQ00gU3RlcmVvIG91dCIsCisJLmRldl9hZGRyCQk9IF9fUFJFRyhQQ0RSKSwKKwkuZHJjbXIJCQk9ICZEUkNNUlRYUENEUiwKKwkuZGNtZAkJCT0gRENNRF9JTkNTUkNBRERSIHwgRENNRF9GTE9XVFJHIHwKKwkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2FjOTdfcGNtX3N0ZXJlb19pbiA9IHsKKwkubmFtZQkJCT0gIkFDOTcgUENNIFN0ZXJlbyBpbiIsCisJLmRldl9hZGRyCQk9IF9fUFJFRyhQQ0RSKSwKKwkuZHJjbXIJCQk9ICZEUkNNUlJYUENEUiwKKwkuZGNtZAkJCT0gRENNRF9JTkNUUkdBRERSIHwgRENNRF9GTE9XU1JDIHwKKwkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2FjOTdfcGNtX2F1eF9tb25vX291dCA9IHsKKwkubmFtZQkJCT0gIkFDOTcgQXV4IFBDTSAoU2xvdCA1KSBNb25vIG91dCIsCisJLmRldl9hZGRyCQk9IF9fUFJFRyhNT0RSKSwKKwkuZHJjbXIJCQk9ICZEUkNNUlRYTU9EUiwKKwkuZGNtZAkJCT0gRENNRF9JTkNTUkNBRERSIHwgRENNRF9GTE9XVFJHIHwKKwkJCQkgIERDTURfQlVSU1QxNiB8IERDTURfV0lEVEgyLAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2FjOTdfcGNtX2F1eF9tb25vX2luID0geworCS5uYW1lCQkJPSAiQUM5NyBBdXggUENNIChTbG90IDUpIE1vbm8gaW4iLAorCS5kZXZfYWRkcgkJPSBfX1BSRUcoTU9EUiksCisJLmRyY21yCQkJPSAmRFJDTVJSWE1PRFIsCisJLmRjbWQJCQk9IERDTURfSU5DVFJHQUREUiB8IERDTURfRkxPV1NSQyB8CisJCQkJICBEQ01EX0JVUlNUMTYgfCBEQ01EX1dJRFRIMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3BjbV9kbWFfcGFyYW1zIHB4YTJ4eF9hYzk3X3BjbV9taWNfbW9ub19pbiA9IHsKKwkubmFtZQkJCT0gIkFDOTcgTWljIFBDTSAoU2xvdCA2KSBNb25vIGluIiwKKwkuZGV2X2FkZHIJCT0gX19QUkVHKE1DRFIpLAorCS5kcmNtcgkJCT0gJkRSQ01SUlhNQ0RSLAorCS5kY21kCQkJPSBEQ01EX0lOQ1RSR0FERFIgfCBEQ01EX0ZMT1dTUkMgfAorCQkJCSAgRENNRF9CVVJTVDE2IHwgRENNRF9XSURUSDIsCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHB4YTJ4eF9hYzk3X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpkYWkpCit7CisJR0NSIHw9IEdDUl9BQ0xJTktfT0ZGOworCXB4YV9zZXRfY2tlbihDS0VOMl9BQzk3LCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyeHhfYWM5N19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpkYWkpCit7CisJcHhhX2dwaW9fbW9kZShHUElPMzFfU1lOQ19BQzk3X01EKTsKKwlweGFfZ3Bpb19tb2RlKEdQSU8zMF9TREFUQV9PVVRfQUM5N19NRCk7CisJcHhhX2dwaW9fbW9kZShHUElPMjhfQklUQ0xLX0FDOTdfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzI5X1NEQVRBX0lOX0FDOTdfTUQpOworI2lmZGVmIENPTkZJR19QWEEyN3gKKwkvKiBVc2UgR1BJTyAxMTMgYXMgQUM5NyBSZXNldCBvbiBCdWx2ZXJkZSAqLworCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19BTFRfRk5fMl9PVVQpOworI2VuZGlmCisJcHhhX3NldF9ja2VuKENLRU4yX0FDOTcsIDEpOworCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBweGEyeHhfYWM5N19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgcHhhMnh4X2FjOTdfcmVzdW1lCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IHB4YTJ4eF9hYzk3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9BQzk3LCBweGEyeHhfYWM5N19pcnEsIElSUUZfRElTQUJMRUQsICJBQzk3IiwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJcHhhX2dwaW9fbW9kZShHUElPMzFfU1lOQ19BQzk3X01EKTsKKwlweGFfZ3Bpb19tb2RlKEdQSU8zMF9TREFUQV9PVVRfQUM5N19NRCk7CisJcHhhX2dwaW9fbW9kZShHUElPMjhfQklUQ0xLX0FDOTdfTUQpOworCXB4YV9ncGlvX21vZGUoR1BJTzI5X1NEQVRBX0lOX0FDOTdfTUQpOworI2lmZGVmIENPTkZJR19QWEEyN3gKKwkvKiBVc2UgR1BJTyAxMTMgYXMgQUM5NyBSZXNldCBvbiBCdWx2ZXJkZSAqLworCXB4YV9ncGlvX21vZGUoMTEzIHwgR1BJT19BTFRfRk5fMl9PVVQpOworI2VuZGlmCisJcHhhX3NldF9ja2VuKENLRU4yX0FDOTcsIDEpOworCXJldHVybiAwOworCisgZXJyOgorCWlmIChDS0VOICYgQ0tFTjJfQUM5NykgeworCQlHQ1IgfD0gR0NSX0FDTElOS19PRkY7CisJCWZyZWVfaXJxKElSUV9BQzk3LCBOVUxMKTsKKwkJcHhhX3NldF9ja2VuKENLRU4yX0FDOTcsIDApOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBweGEyeHhfYWM5N19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlHQ1IgfD0gR0NSX0FDTElOS19PRkY7CisJZnJlZV9pcnEoSVJRX0FDOTcsIE5VTEwpOworCXB4YV9zZXRfY2tlbihDS0VOMl9BQzk3LCAwKTsKK30KKworc3RhdGljIGludCBweGEyeHhfYWM5N19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQljcHVfZGFpLT5kbWFfZGF0YSA9ICZweGEyeHhfYWM5N19wY21fc3RlcmVvX291dDsKKwllbHNlCisJCWNwdV9kYWktPmRtYV9kYXRhID0gJnB4YTJ4eF9hYzk3X3BjbV9zdGVyZW9faW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyeHhfYWM5N19od19hdXhfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gcnRkLT5kYWktPmNwdV9kYWk7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJY3B1X2RhaS0+ZG1hX2RhdGEgPSAmcHhhMnh4X2FjOTdfcGNtX2F1eF9tb25vX291dDsKKwllbHNlCisJCWNwdV9kYWktPmRtYV9kYXRhID0gJnB4YTJ4eF9hYzk3X3BjbV9hdXhfbW9ub19pbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9hYzk3X2h3X21pY19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXR1cm4gLUVOT0RFVjsKKwllbHNlCisJCWNwdV9kYWktPmRtYV9kYXRhID0gJnB4YTJ4eF9hYzk3X3BjbV9taWNfbW9ub19pbjsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFBYQTJYWF9BQzk3X1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfFwKKwkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgXAorCQlTTkRSVl9QQ01fUkFURV80ODAwMCkKKworLyoKKyAqIFRoZXJlIGlzIG9ubHkgMSBwaHlzaWNhbCBBQzk3IGludGVyZmFjZSBmb3IgcHhhMnh4LCBidXQgaXQKKyAqIGhhcyBleHRyYSBmaWZvJ3MgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYXV4IERBQ3MgYW5kIEFEQ3MuCisgKi8KK3N0cnVjdCBzbmRfc29jX2NwdV9kYWkgcHhhX2FjOTdfZGFpW10gPSB7Cit7CisJLm5hbWUgPSAicHhhMnh4LWFjOTciLAorCS5pZCA9IDAsCisJLnR5cGUgPSBTTkRfU09DX0RBSV9BQzk3LAorCS5wcm9iZSA9IHB4YTJ4eF9hYzk3X3Byb2JlLAorCS5yZW1vdmUgPSBweGEyeHhfYWM5N19yZW1vdmUsCisJLnN1c3BlbmQgPSBweGEyeHhfYWM5N19zdXNwZW5kLAorCS5yZXN1bWUgPSBweGEyeHhfYWM5N19yZXN1bWUsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiQUM5NyBQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gUFhBMlhYX0FDOTdfUkFURVMsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkFDOTcgQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gUFhBMlhYX0FDOTdfUkFURVMsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkub3BzID0geworCQkuaHdfcGFyYW1zID0gcHhhMnh4X2FjOTdfaHdfcGFyYW1zLH0sCit9LAoreworCS5uYW1lID0gInB4YTJ4eC1hYzk3LWF1eCIsCisJLmlkID0gMSwKKwkudHlwZSA9IFNORF9TT0NfREFJX0FDOTcsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiQUM5NyBBdXggUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDEsCisJCS5yYXRlcyA9IFBYQTJYWF9BQzk3X1JBVEVTLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLH0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJBQzk3IEF1eCBDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAxLAorCQkucmF0ZXMgPSBQWEEyWFhfQUM5N19SQVRFUywKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCS5vcHMgPSB7CisJCS5od19wYXJhbXMgPSBweGEyeHhfYWM5N19od19hdXhfcGFyYW1zLH0sCit9LAoreworCS5uYW1lID0gInB4YTJ4eC1hYzk3LW1pYyIsCisJLmlkID0gMiwKKwkudHlwZSA9IFNORF9TT0NfREFJX0FDOTcsCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJBQzk3IE1pYyBDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAxLAorCQkucmF0ZXMgPSBQWEEyWFhfQUM5N19SQVRFUywKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCS5vcHMgPSB7CisJCS5od19wYXJhbXMgPSBweGEyeHhfYWM5N19od19taWNfcGFyYW1zLH0sCit9LAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwocHhhX2FjOTdfZGFpKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNvY19hYzk3X29wcyk7CisKK01PRFVMRV9BVVRIT1IoIk5pY29sYXMgUGl0cmUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUM5NyBkcml2ZXIgZm9yIHRoZSBJbnRlbCBQWEEyeHggY2hpcCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5oIGIvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNGI4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1hYzk3LmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGxpbnV4L3NvdW5kL2FybS9weGEyeHgtYWM5Ny5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9QWEEyWFhfQUM5N19ICisjZGVmaW5lIF9QWEEyWFhfQUM5N19ICisKKy8qIHB4YTJ4eCBEQUkgSUQncyAqLworI2RlZmluZSBQWEEyWFhfREFJX0FDOTdfSElGSQkwCisjZGVmaW5lIFBYQTJYWF9EQUlfQUM5N19BVVgJCTEKKyNkZWZpbmUgUFhBMlhYX0RBSV9BQzk3X01JQwkJMgorCitleHRlcm4gc3RydWN0IHNuZF9zb2NfY3B1X2RhaSBweGFfYWM5N19kYWlbM107CisKKy8qIHBsYXRmb3JtIGRhdGEgKi8KK2V4dGVybiBzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyBweGEyeHhfYWM5N19vcHM7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtaTJzLmMgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1pMnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVhNjEzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3B4YS9weGEyeHgtaTJzLmMKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBweGEyeHgtaTJzLmMgIC0tICBBTFNBIFNvYyBBdWRpbyBMYXllcgorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMTJ0aCBBdWcgMjAwNSAgIEluaXRpYWwgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXVkaW8uaD4KKworI2luY2x1ZGUgInB4YTJ4eC1wY20uaCIKKyNpbmNsdWRlICJweGEyeHgtaTJzLmgiCisKK3N0cnVjdCBweGFfaTJzX3BvcnQgeworCXUzMiBzYWRpdjsKKwl1MzIgc2FjcjA7CisJdTMyIHNhY3IxOworCXUzMiBzYWltcjsKKwlpbnQgbWFzdGVyOworCXUzMiBmbXQ7Cit9Oworc3RhdGljIHN0cnVjdCBweGFfaTJzX3BvcnQgcHhhX2kyczsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2kyc19wY21fc3RlcmVvX291dCA9IHsKKwkubmFtZQkJCT0gIkkyUyBQQ00gU3RlcmVvIG91dCIsCisJLmRldl9hZGRyCQk9IF9fUFJFRyhTQURSKSwKKwkuZHJjbXIJCQk9ICZEUkNNUlRYU0FEUiwKKwkuZGNtZAkJCT0gRENNRF9JTkNTUkNBRERSIHwgRENNRF9GTE9XVFJHIHwKKwkJCQkgIERDTURfQlVSU1QzMiB8IERDTURfV0lEVEg0LAorfTsKKworc3RhdGljIHN0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgcHhhMnh4X2kyc19wY21fc3RlcmVvX2luID0geworCS5uYW1lCQkJPSAiSTJTIFBDTSBTdGVyZW8gaW4iLAorCS5kZXZfYWRkcgkJPSBfX1BSRUcoU0FEUiksCisJLmRyY21yCQkJPSAmRFJDTVJSWFNBRFIsCisJLmRjbWQJCQk9IERDTURfSU5DVFJHQUREUiB8IERDTURfRkxPV1NSQyB8CisJCQkJICBEQ01EX0JVUlNUMzIgfCBEQ01EX1dJRFRINCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X2dwaW8gZ3Bpb19idXNbXSA9IHsKKwl7IC8qIEkyUyBTb0MgU2xhdmUgKi8KKwkJLnJ4ID0gR1BJTzI5X1NEQVRBX0lOX0kyU19NRCwKKwkJLnR4ID0gR1BJTzMwX1NEQVRBX09VVF9JMlNfTUQsCisJCS5jbGsgPSBHUElPMjhfQklUQ0xLX0lOX0kyU19NRCwKKwkJLmZybSA9IEdQSU8zMV9TWU5DX0kyU19NRCwKKwl9LAorCXsgLyogSTJTIFNvQyBNYXN0ZXIgKi8KKyNpZmRlZiBDT05GSUdfUFhBMjd4CisJCS5zeXMgPSBHUElPMTEzX0kyU19TWVNDTEtfTUQsCisjZWxzZQorCQkuc3lzID0gR1BJTzMyX1NZU0NMS19JMlNfTUQsCisjZW5kaWYKKwkJLnJ4ID0gR1BJTzI5X1NEQVRBX0lOX0kyU19NRCwKKwkJLnR4ID0gR1BJTzMwX1NEQVRBX09VVF9JMlNfTUQsCisJCS5jbGsgPSBHUElPMjhfQklUQ0xLX09VVF9JMlNfTUQsCisJCS5mcm0gPSBHUElPMzFfU1lOQ19JMlNfTUQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgcHhhMnh4X2kyc19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gcnRkLT5kYWktPmNwdV9kYWk7CisKKwlpZiAoIWNwdV9kYWktPmFjdGl2ZSkgeworCQlTQUNSMCB8PSBTQUNSMF9SU1Q7CisJCVNBQ1IwID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogd2FpdCBmb3IgSTJTIGNvbnRyb2xsZXIgdG8gYmUgcmVhZHkgKi8KK3N0YXRpYyBpbnQgcHhhX2kyc193YWl0KHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBmbHVzaCB0aGUgUnggRklGTyAqLworCWZvcihpID0gMDsgaSA8IDE2OyBpKyspCisJCVNBRFI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X2kyc19zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCS8qIGludGVyZmFjZSBmb3JtYXQgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCXB4YV9pMnMuZm10ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCXB4YV9pMnMuZm10ID0gU0FDUjFfQU1TTDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJcHhhX2kycy5tYXN0ZXIgPSAxOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRlM6CisJCXB4YV9pMnMubWFzdGVyID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9pMnNfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSwKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJaWYgKGNsa19pZCAhPSBQWEEyWFhfSTJTX1NZU0NMSykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocHhhX2kycy5tYXN0ZXIgJiYgZGlyID09IFNORF9TT0NfQ0xPQ0tfT1VUKQorCQlweGFfZ3Bpb19tb2RlKGdwaW9fYnVzW3B4YV9pMnMubWFzdGVyXS5zeXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X2kyc19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKworCXB4YV9ncGlvX21vZGUoZ3Bpb19idXNbcHhhX2kycy5tYXN0ZXJdLnJ4KTsKKwlweGFfZ3Bpb19tb2RlKGdwaW9fYnVzW3B4YV9pMnMubWFzdGVyXS50eCk7CisJcHhhX2dwaW9fbW9kZShncGlvX2J1c1tweGFfaTJzLm1hc3Rlcl0uZnJtKTsKKwlweGFfZ3Bpb19tb2RlKGdwaW9fYnVzW3B4YV9pMnMubWFzdGVyXS5jbGspOworCXB4YV9zZXRfY2tlbihDS0VOOF9JMlMsIDEpOworCXB4YV9pMnNfd2FpdCgpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWNwdV9kYWktPmRtYV9kYXRhID0gJnB4YTJ4eF9pMnNfcGNtX3N0ZXJlb19vdXQ7CisJZWxzZQorCQljcHVfZGFpLT5kbWFfZGF0YSA9ICZweGEyeHhfaTJzX3BjbV9zdGVyZW9faW47CisKKwkvKiBpcyBwb3J0IHVzZWQgYnkgYW5vdGhlciBzdHJlYW0gKi8KKwlpZiAoIShTQUNSMCAmIFNBQ1IwX0VOQikpIHsKKworCQlTQUNSMCA9IDA7CisJCVNBQ1IxID0gMDsKKwkJaWYgKHB4YV9pMnMubWFzdGVyKQorCQkJU0FDUjAgfD0gU0FDUjBfQkNLRDsKKworCQlTQUNSMCB8PSBTQUNSMF9SRlRIKDE0KSB8IFNBQ1IwX1RGVEgoMSk7CisJCVNBQ1IxIHw9IHB4YV9pMnMuZm10OworCX0KKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJU0FJTVIgfD0gU0FJTVJfVEZTOworCWVsc2UKKwkJU0FJTVIgfD0gU0FJTVJfUkZTOworCisJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CisJY2FzZSA4MDAwOgorCQlTQURJViA9IDB4NDg7CisJCWJyZWFrOworCWNhc2UgMTEwMjU6CisJCVNBRElWID0gMHgzNDsKKwkJYnJlYWs7CisJY2FzZSAxNjAwMDoKKwkJU0FESVYgPSAweDI0OworCQlicmVhazsKKwljYXNlIDIyMDUwOgorCQlTQURJViA9IDB4MWE7CisJCWJyZWFrOworCWNhc2UgNDQxMDA6CisJCVNBRElWID0gMHhkOworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCQlTQURJViA9IDB4YzsKKwkJYnJlYWs7CisJY2FzZSA5NjAwMDogLyogbm90IGluIG1hbnVhbCBhbmQgcG9zc2libHkgc2xpZ2h0bHkgaW5hY2N1cmF0ZSAqLworCQlTQURJViA9IDB4NjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X2kyc190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlTQUNSMCB8PSBTQUNSMF9FTkI7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBweGEyeHhfaTJzX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCVNBQ1IxIHw9IFNBQ1IxX0RSUEw7CisJCVNBSU1SICY9IH5TQUlNUl9URlM7CisJfSBlbHNlIHsKKwkJU0FDUjEgfD0gU0FDUjFfRFJFQzsKKwkJU0FJTVIgJj0gflNBSU1SX1JGUzsKKwl9CisKKwlpZiAoU0FDUjEgJiAoU0FDUjFfRFJFQyB8IFNBQ1IxX0RSUEwpKSB7CisJCVNBQ1IwICY9IH5TQUNSMF9FTkI7CisJCXB4YV9pMnNfd2FpdCgpOworCQlweGFfc2V0X2NrZW4oQ0tFTjhfSTJTLCAwKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcHhhMnh4X2kyc19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpkYWkpCit7CisJaWYgKCFkYWktPmFjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBzdG9yZSByZWdpc3RlcnMgKi8KKwlweGFfaTJzLnNhY3IwID0gU0FDUjA7CisJcHhhX2kycy5zYWNyMSA9IFNBQ1IxOworCXB4YV9pMnMuc2FpbXIgPSBTQUlNUjsKKwlweGFfaTJzLnNhZGl2ID0gU0FESVY7CisKKwkvKiBkZWFjdGl2YXRlIGxpbmsgKi8KKwlTQUNSMCAmPSB+U0FDUjBfRU5COworCXB4YV9pMnNfd2FpdCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9pMnNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqZGFpKQoreworCWlmICghZGFpLT5hY3RpdmUpCisJCXJldHVybiAwOworCisJcHhhX2kyc193YWl0KCk7CisKKwlTQUNSMCA9IHB4YV9pMnMuc2FjcjAgJj0gflNBQ1IwX0VOQjsKKwlTQUNSMSA9IHB4YV9pMnMuc2FjcjE7CisJU0FJTVIgPSBweGFfaTJzLnNhaW1yOworCVNBRElWID0gcHhhX2kycy5zYWRpdjsKKwlTQUNSMCB8PSBTQUNSMF9FTkI7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgcHhhMnh4X2kyc19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgcHhhMnh4X2kyc19yZXN1bWUJTlVMTAorI2VuZGlmCisKKyNkZWZpbmUgUFhBMlhYX0kyU19SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHxcCisJCVNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFwKKwkJU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCkKKworc3RydWN0IHNuZF9zb2NfY3B1X2RhaSBweGFfaTJzX2RhaSA9IHsKKwkubmFtZSA9ICJweGEyeHgtaTJzIiwKKwkuaWQgPSAwLAorCS50eXBlID0gU05EX1NPQ19EQUlfSTJTLAorCS5zdXNwZW5kID0gcHhhMnh4X2kyc19zdXNwZW5kLAorCS5yZXN1bWUgPSBweGEyeHhfaTJzX3Jlc3VtZSwKKwkucGxheWJhY2sgPSB7CisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gUFhBMlhYX0kyU19SQVRFUywKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCS5jYXB0dXJlID0geworCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFBYQTJYWF9JMlNfUkFURVMsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkub3BzID0geworCQkuc3RhcnR1cCA9IHB4YTJ4eF9pMnNfc3RhcnR1cCwKKwkJLnNodXRkb3duID0gcHhhMnh4X2kyc19zaHV0ZG93biwKKwkJLnRyaWdnZXIgPSBweGEyeHhfaTJzX3RyaWdnZXIsCisJCS5od19wYXJhbXMgPSBweGEyeHhfaTJzX2h3X3BhcmFtcyx9LAorCS5kYWlfb3BzID0geworCQkuc2V0X2ZtdCA9IHB4YTJ4eF9pMnNfc2V0X2RhaV9mbXQsCisJCS5zZXRfc3lzY2xrID0gcHhhMnh4X2kyc19zZXRfZGFpX3N5c2NsaywKKwl9LAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwocHhhX2kyc19kYWkpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QsIGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbSwgd3d3LndvbGZzb25taWNyby5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigicHhhMnh4IEkyUyBTb0MgSW50ZXJmYWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1pMnMuaCBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LWkycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNDg0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1pMnMuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogbGludXgvc291bmQvYXJtL3B4YTJ4eC1pMnMuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfUFhBMlhYX0kyU19ICisjZGVmaW5lIF9QWEEyWFhfSTJTX0gKKworLyogcHhhMnh4IERBSSBJRCdzICovCisjZGVmaW5lIFBYQTJYWF9EQUlfSTJTCQkJMAorCisvKiBJMlMgY2xvY2sgKi8KKyNkZWZpbmUgUFhBMlhYX0kyU19TWVNDTEsJCTAKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgcHhhX2kyc19kYWk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWU4ZmEzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBsaW51eC9zb3VuZC9hcm0vcHhhMnh4LXBjbS5jIC0tIEFMU0EgUENNIGludGVyZmFjZSBmb3IgdGhlIEludGVsIFBYQTJ4eCBjaGlwCisgKgorICogQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiBDcmVhdGVkOglOb3YgMzAsIDIwMDQKKyAqIENvcHlyaWdodDoJKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdWRpby5oPgorCisjaW5jbHVkZSAicHhhMnh4LXBjbS5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgcHhhMnh4X3BjbV9oYXJkd2FyZSA9IHsKKwkuaW5mbwkJCT0gU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX1JFU1VNRSwKKwkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCisJLnBlcmlvZF9ieXRlc19taW4JPSAzMiwKKwkucGVyaW9kX2J5dGVzX21heAk9IDgxOTIgLSAzMiwKKwkucGVyaW9kc19taW4JCT0gMSwKKwkucGVyaW9kc19tYXgJCT0gUEFHRV9TSVpFL3NpemVvZihweGFfZG1hX2Rlc2MpLAorCS5idWZmZXJfYnl0ZXNfbWF4CT0gMTI4ICogMTAyNCwKKwkuZmlmb19zaXplCQk9IDMyLAorfTsKKworc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgeworCWludCBkbWFfY2g7CisJc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyAqcGFyYW1zOworCXB4YV9kbWFfZGVzYyAqZG1hX2Rlc2NfYXJyYXk7CisJZG1hX2FkZHJfdCBkbWFfZGVzY19hcnJheV9waHlzOworfTsKKworc3RhdGljIHZvaWQgcHhhMnh4X3BjbV9kbWFfaXJxKGludCBkbWFfY2gsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGRldl9pZDsKKwlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCBkY3NyOworCisJZGNzciA9IERDU1IoZG1hX2NoKTsKKwlEQ1NSKGRtYV9jaCkgPSBkY3NyICYgfkRDU1JfU1RPUElSUUVOOworCisJaWYgKGRjc3IgJiBEQ1NSX0VORElOVFIpIHsKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCX0gZWxzZSB7CisJCXByaW50ayggS0VSTl9FUlIgIiVzOiBETUEgZXJyb3Igb24gY2hhbm5lbCAlZCAoRENTUj0lI3gpXG4iLAorCQkJcHJ0ZC0+cGFyYW1zLT5uYW1lLCBkbWFfY2gsIGRjc3IgKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgcHhhMnh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHB4YTJ4eF9wY21fZG1hX3BhcmFtcyAqZG1hID0gcnRkLT5kYWktPmNwdV9kYWktPmRtYV9kYXRhOworCXNpemVfdCB0b3RzaXplID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpOworCXNpemVfdCBwZXJpb2QgPSBwYXJhbXNfcGVyaW9kX2J5dGVzKHBhcmFtcyk7CisJcHhhX2RtYV9kZXNjICpkbWFfZGVzYzsKKwlkbWFfYWRkcl90IGRtYV9idWZmX3BoeXMsIG5leHRfZGVzY19waHlzOworCWludCByZXQ7CisKKwkvKiByZXR1cm4gaWYgdGhpcyBpcyBhIGJ1ZmZlcmxlc3MgdHJhbnNmZXIgZS5nLgorCSAqIGNvZGVjIDwtLT4gQlQgY29kZWMgb3IgR1NNIG1vZGVtIC0tIGxnIEZJWE1FICovCisJIGlmICghZG1hKQorCSAJcmV0dXJuIDA7CisKKwkvKiB0aGlzIG1heSBnZXQgY2FsbGVkIHNldmVyYWwgdGltZXMgYnkgb3NzIGVtdWxhdGlvbgorCSAqIHdpdGggZGlmZmVyZW50IHBhcmFtcyAqLworCWlmIChwcnRkLT5wYXJhbXMgPT0gTlVMTCkgeworCQlwcnRkLT5wYXJhbXMgPSBkbWE7CisJCXJldCA9IHB4YV9yZXF1ZXN0X2RtYShwcnRkLT5wYXJhbXMtPm5hbWUsIERNQV9QUklPX0xPVywKKwkJCSAgICAgIHB4YTJ4eF9wY21fZG1hX2lycSwgc3Vic3RyZWFtKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlwcnRkLT5kbWFfY2ggPSByZXQ7CisJfSBlbHNlIGlmIChwcnRkLT5wYXJhbXMgIT0gZG1hKSB7CisJCXB4YV9mcmVlX2RtYShwcnRkLT5kbWFfY2gpOworCQlwcnRkLT5wYXJhbXMgPSBkbWE7CisJCXJldCA9IHB4YV9yZXF1ZXN0X2RtYShwcnRkLT5wYXJhbXMtPm5hbWUsIERNQV9QUklPX0xPVywKKwkJCSAgICAgIHB4YTJ4eF9wY21fZG1hX2lycSwgc3Vic3RyZWFtKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlwcnRkLT5kbWFfY2ggPSByZXQ7CisJfQorCisJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKKwlydW50aW1lLT5kbWFfYnl0ZXMgPSB0b3RzaXplOworCisJZG1hX2Rlc2MgPSBwcnRkLT5kbWFfZGVzY19hcnJheTsKKwluZXh0X2Rlc2NfcGh5cyA9IHBydGQtPmRtYV9kZXNjX2FycmF5X3BoeXM7CisJZG1hX2J1ZmZfcGh5cyA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCWRvIHsKKwkJbmV4dF9kZXNjX3BoeXMgKz0gc2l6ZW9mKHB4YV9kbWFfZGVzYyk7CisJCWRtYV9kZXNjLT5kZGFkciA9IG5leHRfZGVzY19waHlzOworCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkJZG1hX2Rlc2MtPmRzYWRyID0gZG1hX2J1ZmZfcGh5czsKKwkJCWRtYV9kZXNjLT5kdGFkciA9IHBydGQtPnBhcmFtcy0+ZGV2X2FkZHI7CisJCX0gZWxzZSB7CisJCQlkbWFfZGVzYy0+ZHNhZHIgPSBwcnRkLT5wYXJhbXMtPmRldl9hZGRyOworCQkJZG1hX2Rlc2MtPmR0YWRyID0gZG1hX2J1ZmZfcGh5czsKKwkJfQorCQlpZiAocGVyaW9kID4gdG90c2l6ZSkKKwkJCXBlcmlvZCA9IHRvdHNpemU7CisJCWRtYV9kZXNjLT5kY21kID0gcHJ0ZC0+cGFyYW1zLT5kY21kIHwgcGVyaW9kIHwgRENNRF9FTkRJUlFFTjsKKwkJZG1hX2Rlc2MrKzsKKwkJZG1hX2J1ZmZfcGh5cyArPSBwZXJpb2Q7CisJfSB3aGlsZSAodG90c2l6ZSAtPSBwZXJpb2QpOworCWRtYV9kZXNjWy0xXS5kZGFkciA9IHBydGQtPmRtYV9kZXNjX2FycmF5X3BoeXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyeHhfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWlmIChwcnRkICYmIHBydGQtPnBhcmFtcykKKwkJKnBydGQtPnBhcmFtcy0+ZHJjbXIgPSAwOworCisJaWYgKHBydGQtPmRtYV9jaCkgeworCQlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sIE5VTEwpOworCQlweGFfZnJlZV9kbWEocHJ0ZC0+ZG1hX2NoKTsKKwkJcHJ0ZC0+ZG1hX2NoID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyeHhfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHB4YTJ4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCURDU1IocHJ0ZC0+ZG1hX2NoKSAmPSB+RENTUl9SVU47CisJRENTUihwcnRkLT5kbWFfY2gpID0gMDsKKwlEQ01EKHBydGQtPmRtYV9jaCkgPSAwOworCSpwcnRkLT5wYXJhbXMtPmRyY21yID0gcHJ0ZC0+ZG1hX2NoIHwgRFJDTVJfTUFQVkxEOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCUREQURSKHBydGQtPmRtYV9jaCkgPSBwcnRkLT5kbWFfZGVzY19hcnJheV9waHlzOworCQlEQ1NSKHBydGQtPmRtYV9jaCkgPSBEQ1NSX1JVTjsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJRENTUihwcnRkLT5kbWFfY2gpICY9IH5EQ1NSX1JVTjsKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJRENTUihwcnRkLT5kbWFfY2gpIHw9IERDU1JfUlVOOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCUREQURSKHBydGQtPmRtYV9jaCkgPSBwcnRkLT5kbWFfZGVzY19hcnJheV9waHlzOworCQlEQ1NSKHBydGQtPmRtYV9jaCkgfD0gRENTUl9SVU47CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKK3B4YTJ4eF9wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJZG1hX2FkZHJfdCBwdHIgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgPworCQkJIERTQURSKHBydGQtPmRtYV9jaCkgOiBEVEFEUihwcnRkLT5kbWFfY2gpOworCXNuZF9wY21fdWZyYW1lc190IHggPSBieXRlc190b19mcmFtZXMocnVudGltZSwgcHRyIC0gcnVudGltZS0+ZG1hX2FkZHIpOworCisJaWYgKHggPT0gcnVudGltZS0+YnVmZmVyX3NpemUpCisJCXggPSAwOworCXJldHVybiB4OworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkOworCWludCByZXQ7CisKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJnB4YTJ4eF9wY21faGFyZHdhcmUpOworCisJLyoKKwkgKiBGb3IgbXlzdGVyaW91cyByZWFzb25zIChhbmQgZGVzcGl0ZSB3aGF0IHRoZSBtYW51YWwgc2F5cykKKwkgKiBwbGF5YmFjayBzYW1wbGVzIGFyZSBsb3N0IGlmIHRoZSBETUEgY291bnQgaXMgbm90IGEgbXVsdGlwbGUKKwkgKiBvZiB0aGUgRE1BIGJ1cnN0IHNpemUuICBMZXQncyBhZGQgYSBydWxlIHRvIGVuZm9yY2UgdGhhdC4KKwkgKi8KKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAzMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLCAzMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcHJ0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBydGQgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlwcnRkLT5kbWFfZGVzY19hcnJheSA9CisJCWRtYV9hbGxvY193cml0ZWNvbWJpbmUoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgUEFHRV9TSVpFLAorCQkJCSAgICAgICAmcHJ0ZC0+ZG1hX2Rlc2NfYXJyYXlfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcnRkLT5kbWFfZGVzY19hcnJheSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjE7CisJfQorCisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcHJ0ZDsKKwlyZXR1cm4gMDsKKworIGVycjE6CisJa2ZyZWUocHJ0ZCk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHhhMnh4X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBweGEyeHhfcnVudGltZV9kYXRhICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIFBBR0VfU0laRSwKKwkJCSAgICAgIHBydGQtPmRtYV9kZXNjX2FycmF5LCBwcnRkLT5kbWFfZGVzY19hcnJheV9waHlzKTsKKwlrZnJlZShwcnRkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyeHhfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlyZXR1cm4gZG1hX21tYXBfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIHZtYSwKKwkJCQkgICAgIHJ1bnRpbWUtPmRtYV9hcmVhLAorCQkJCSAgICAgcnVudGltZS0+ZG1hX2FkZHIsCisJCQkJICAgICBydW50aW1lLT5kbWFfYnl0ZXMpOworfQorCitzdHJ1Y3Qgc25kX3BjbV9vcHMgcHhhMnh4X3BjbV9vcHMgPSB7CisJLm9wZW4JCT0gcHhhMnh4X3BjbV9vcGVuLAorCS5jbG9zZQkJPSBweGEyeHhfcGNtX2Nsb3NlLAorCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zCT0gcHhhMnh4X3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUJPSBweGEyeHhfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUJPSBweGEyeHhfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIJPSBweGEyeHhfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIJPSBweGEyeHhfcGNtX3BvaW50ZXIsCisJLm1tYXAJCT0gcHhhMnh4X3BjbV9tbWFwLAorfTsKKworc3RhdGljIGludCBweGEyeHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc2l6ZV90IHNpemUgPSBweGEyeHhfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXg7CisJYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKKwlidWYtPmRldi5kZXYgPSBwY20tPmNhcmQtPmRldjsKKwlidWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJYnVmLT5hcmVhID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShwY20tPmNhcmQtPmRldiwgc2l6ZSwKKwkJCQkJICAgJmJ1Zi0+YWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYtPmFyZWEpCisJCXJldHVybiAtRU5PTUVNOworCWJ1Zi0+Ynl0ZXMgPSBzaXplOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBweGEyeHhfcGNtX2ZyZWVfZG1hX2J1ZmZlcnMoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZjsKKwlpbnQgc3RyZWFtOworCisJZm9yIChzdHJlYW0gPSAwOyBzdHJlYW0gPCAyOyBzdHJlYW0rKykgeworCQlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07CisJCWlmICghc3Vic3RyZWFtKQorCQkJY29udGludWU7CisKKwkJYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwkJaWYgKCFidWYtPmFyZWEpCisJCQljb250aW51ZTsKKworCQlkbWFfZnJlZV93cml0ZWNvbWJpbmUocGNtLT5jYXJkLT5kZXYsIGJ1Zi0+Ynl0ZXMsCisJCQkJICAgICAgYnVmLT5hcmVhLCBidWYtPmFkZHIpOworCQlidWYtPmFyZWEgPSBOVUxMOworCX0KK30KKworc3RhdGljIHU2NCBweGEyeHhfcGNtX2RtYW1hc2sgPSBETUFfMzJCSVRfTUFTSzsKKworaW50IHB4YTJ4eF9wY21fbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpkYWksCisJc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY2FyZC0+ZGV2LT5kbWFfbWFzaykKKwkJY2FyZC0+ZGV2LT5kbWFfbWFzayA9ICZweGEyeHhfcGNtX2RtYW1hc2s7CisJaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQorCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BXzMyQklUX01BU0s7CisKKwlpZiAoZGFpLT5wbGF5YmFjay5jaGFubmVsc19taW4pIHsKKwkJcmV0ID0gcHhhMnh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKGRhaS0+Y2FwdHVyZS5jaGFubmVsc19taW4pIHsKKwkJcmV0ID0gcHhhMnh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBzbmRfc29jX3BsYXRmb3JtIHB4YTJ4eF9zb2NfcGxhdGZvcm0gPSB7CisJLm5hbWUJCT0gInB4YTJ4eC1hdWRpbyIsCisJLnBjbV9vcHMgCT0gJnB4YTJ4eF9wY21fb3BzLAorCS5wY21fbmV3CT0gcHhhMnh4X3BjbV9uZXcsCisJLnBjbV9mcmVlCT0gcHhhMnh4X3BjbV9mcmVlX2RtYV9idWZmZXJzLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwocHhhMnh4X3NvY19wbGF0Zm9ybSk7CisKK01PRFVMRV9BVVRIT1IoIk5pY29sYXMgUGl0cmUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgUFhBMnh4IFBDTSBETUEgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uaCBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzljNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uaApAQCAtMCwwICsxLDM0IEBACisvKgorICogbGludXgvc291bmQvYXJtL3B4YTJ4eC1wY20uaCAtLSBBTFNBIFBDTSBpbnRlcmZhY2UgZm9yIHRoZSBJbnRlbCBQWEEyeHggY2hpcAorICoKKyAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogQ3JlYXRlZDoJTm92IDMwLCAyMDA0CisgKiBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1BYQTJYWF9QQ01fSAorI2RlZmluZSBfUFhBMlhYX1BDTV9ICisKK3N0cnVjdCBweGEyeHhfcGNtX2RtYV9wYXJhbXMgeworCWNoYXIgKm5hbWU7CQkJLyogc3RyZWFtIGlkZW50aWZpZXIgKi8KKwl1MzIgZGNtZDsJCQkvKiBETUEgZGVzY3JpcHRvciBkY21kIGZpZWxkICovCisJdm9sYXRpbGUgdTMyICpkcmNtcjsJCS8qIHRoZSBETUEgcmVxdWVzdCBjaGFubmVsIHRvIHVzZSAqLworCXUzMiBkZXZfYWRkcjsJCQkvKiBkZXZpY2UgcGh5c2ljYWwgYWRkcmVzcyBmb3IgRE1BICovCit9OworCitzdHJ1Y3QgcHhhMnh4X2dwaW8geworCXUzMiBzeXM7CisJdTMyCXJ4OworCXUzMiB0eDsKKwl1MzIgY2xrOworCXUzMiBmcm07Cit9OworCisvKiBwbGF0Zm9ybSBkYXRhICovCitleHRlcm4gc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gcHhhMnh4X3NvY19wbGF0Zm9ybTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3NwaXR6LmMgYi9zb3VuZC9zb2MvcHhhL3NwaXR6LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlODIxMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9weGEvc3BpdHouYwpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIHNwaXR6LmMgIC0tICBTb0MgYXVkaW8gZm9yIFNoYXJwIFNMLUN4eDAwIG1vZGVscyBTcGl0eiwgQm9yem9pIGFuZCBBa2l0YQorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3JzOiBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKiAgICAgICAgICBSaWNoYXJkIFB1cmRpZSA8cmljaGFyZEBvcGVuZWRoYW5kLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMzB0aCBOb3YgMjAwNSAgIEluaXRpYWwgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3Njb29wLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2FraXRhLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3BpdHouaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg3NTAuaCIKKyNpbmNsdWRlICJweGEyeHgtcGNtLmgiCisjaW5jbHVkZSAicHhhMnh4LWkycy5oIgorCisjZGVmaW5lIFNQSVRaX0hQICAgICAgICAwCisjZGVmaW5lIFNQSVRaX01JQyAgICAgICAxCisjZGVmaW5lIFNQSVRaX0xJTkUgICAgICAyCisjZGVmaW5lIFNQSVRaX0hFQURTRVQgICAzCisjZGVmaW5lIFNQSVRaX0hQX09GRiAgICA0CisjZGVmaW5lIFNQSVRaX1NQS19PTiAgICAwCisjZGVmaW5lIFNQSVRaX1NQS19PRkYgICAxCisKKyAvKiBhdWRpbyBjbG9jayBpbiBIeiAtIHJvdW5kZWQgZnJvbSAxMi4yMzVNSHogKi8KKyNkZWZpbmUgU1BJVFpfQVVESU9fQ0xPQ0sgMTIyODgwMDAKKworc3RhdGljIGludCBzcGl0el9qYWNrX2Z1bmM7CitzdGF0aWMgaW50IHNwaXR6X3Nwa19mdW5jOworCitzdGF0aWMgdm9pZCBzcGl0el9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaWYgKHNwaXR6X3Nwa19mdW5jID09IFNQSVRaX1NQS19PTikKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkV4dCBTcGsiLCAxKTsKKwllbHNlCisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJFeHQgU3BrIiwgMCk7CisKKwkvKiBzZXQgdXAgamFjayBjb25uZWN0aW9uICovCisJc3dpdGNoIChzcGl0el9qYWNrX2Z1bmMpIHsKKwljYXNlIFNQSVRaX0hQOgorCQkvKiBlbmFibGUgYW5kIHVubXV0ZSBocCBqYWNrLCBkaXNhYmxlIG1pYyBiaWFzICovCisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk1pYyBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJMaW5lIEphY2siLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgMSk7CisJCXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX0wpOworCQlzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9SKTsKKwkJYnJlYWs7CisJY2FzZSBTUElUWl9NSUM6CisJCS8qIGVuYWJsZSBtaWMgamFjayBhbmQgYmlhcywgbXV0ZSBocCAqLworCQlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRzZXQgSmFjayIsIDApOworCQlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTGluZSBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJNaWMgSmFjayIsIDEpOworCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX0wpOworCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wX2RldmljZS5kZXYsIFNQSVRaX1NDUF9NVVRFX1IpOworCQlicmVhazsKKwljYXNlIFNQSVRaX0xJTkU6CisJCS8qIGVuYWJsZSBsaW5lIGphY2ssIGRpc2FibGUgbWljIGJpYXMgYW5kIG11dGUgaHAgKi8KKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk1pYyBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJMaW5lIEphY2siLCAxKTsKKwkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9MKTsKKwkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9SKTsKKwkJYnJlYWs7CisJY2FzZSBTUElUWl9IRUFEU0VUOgorCQkvKiBlbmFibGUgYW5kIHVubXV0ZSBoZWFkc2V0IGphY2sgZW5hYmxlIG1pYyBiaWFzLCBtdXRlIEwgaHAgKi8KKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJNaWMgSmFjayIsIDEpOworCQlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTGluZSBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCAxKTsKKwkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9MKTsKKwkJc2V0X3Njb29wX2dwaW8oJnNwaXR6c2Nvb3BfZGV2aWNlLmRldiwgU1BJVFpfU0NQX01VVEVfUik7CisJCWJyZWFrOworCWNhc2UgU1BJVFpfSFBfT0ZGOgorCisJCS8qIGphY2sgcmVtb3ZlZCwgZXZlcnl0aGluZyBvZmYgKi8KKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCAwKTsKKwkJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk1pYyBKYWNrIiwgMCk7CisJCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJMaW5lIEphY2siLCAwKTsKKwkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9MKTsKKwkJcmVzZXRfc2Nvb3BfZ3Bpbygmc3BpdHpzY29vcF9kZXZpY2UuZGV2LCBTUElUWl9TQ1BfTVVURV9SKTsKKwkJYnJlYWs7CisJfQorCXNuZF9zb2NfZGFwbV9zeW5jX2VuZHBvaW50cyhjb2RlYyk7Cit9CisKK3N0YXRpYyBpbnQgc3BpdHpfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5zb2NkZXYtPmNvZGVjOworCisJLyogY2hlY2sgdGhlIGphY2sgc3RhdHVzIGF0IHN0cmVhbSBzdGFydHVwICovCisJc3BpdHpfZXh0X2NvbnRyb2woY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwaXR6X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWkgPSBydGQtPmRhaS0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBydGQtPmRhaS0+Y3B1X2RhaTsKKwl1bnNpZ25lZCBpbnQgY2xrID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgODAwMDoKKwljYXNlIDE2MDAwOgorCWNhc2UgNDgwMDA6CisJY2FzZSA5NjAwMDoKKwkJY2xrID0gMTIyODgwMDA7CisJCWJyZWFrOworCWNhc2UgMTEwMjU6CisJY2FzZSAyMjA1MDoKKwljYXNlIDQ0MTAwOgorCQljbGsgPSAxMTI4OTYwMDsKKwkJYnJlYWs7CisJfQorCisJLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gY29kZWNfZGFpLT5kYWlfb3BzLnNldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGNwdV9kYWktPmRhaV9vcHMuc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCisJcmV0ID0gY29kZWNfZGFpLT5kYWlfb3BzLnNldF9zeXNjbGsoY29kZWNfZGFpLCBXTTg3NTBfU1lTQ0xLLCBjbGssCisJCVNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IHRoZSBJMlMgc3lzdGVtIGNsb2NrIGFzIGlucHV0ICh1bnVzZWQpICovCisJcmV0ID0gY3B1X2RhaS0+ZGFpX29wcy5zZXRfc3lzY2xrKGNwdV9kYWksIFBYQTJYWF9JMlNfU1lTQ0xLLCAwLAorCQlTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIHNwaXR6X29wcyA9IHsKKwkuc3RhcnR1cCA9IHNwaXR6X3N0YXJ0dXAsCisJLmh3X3BhcmFtcyA9IHNwaXR6X2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBpbnQgc3BpdHpfZ2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzcGl0el9qYWNrX2Z1bmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BpdHpfc2V0X2phY2soc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJaWYgKHNwaXR6X2phY2tfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJcmV0dXJuIDA7CisKKwlzcGl0el9qYWNrX2Z1bmMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlzcGl0el9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc3BpdHpfZ2V0X3NwayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNwaXR6X3Nwa19mdW5jOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwaXR6X3NldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWlmIChzcGl0el9zcGtfZnVuYyA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJcmV0dXJuIDA7CisKKwlzcGl0el9zcGtfZnVuYyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXNwaXR6X2V4dF9jb250cm9sKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzcGl0el9taWNfYmlhcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgaW50IGV2ZW50KQoreworCWlmIChtYWNoaW5lX2lzX2JvcnpvaSgpIHx8IG1hY2hpbmVfaXNfc3BpdHooKSkgeworCQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJCXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wMl9kZXZpY2UuZGV2LAorCQkJCVNQSVRaX1NDUDJfTUlDX0JJQVMpOworCQllbHNlCisJCQlyZXNldF9zY29vcF9ncGlvKCZzcGl0enNjb29wMl9kZXZpY2UuZGV2LAorCQkJCVNQSVRaX1NDUDJfTUlDX0JJQVMpOworCX0KKworCWlmIChtYWNoaW5lX2lzX2FraXRhKCkpIHsKKwkJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCQlha2l0YV9zZXRfaW9leHAoJmFraXRhaW9leHBfZGV2aWNlLmRldiwKKwkJCQlBS0lUQV9JT0VYUF9NSUNfQklBUyk7CisJCWVsc2UKKwkJCWFraXRhX3Jlc2V0X2lvZXhwKCZha2l0YWlvZXhwX2RldmljZS5kZXYsCisJCQkJQUtJVEFfSU9FWFBfTUlDX0JJQVMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogc3BpdHogbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3NTBfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUgSmFjayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIk1pYyBKYWNrIiwgc3BpdHpfbWljX2JpYXMpLAorCVNORF9TT0NfREFQTV9TUEsoIkV4dCBTcGsiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTElORSgiTGluZSBKYWNrIiwgTlVMTCksCisKKwkvKiBoZWFkc2V0IGlzIGEgbWljIGFuZCBtb25vIGhlYWRwaG9uZSAqLworCVNORF9TT0NfREFQTV9IUCgiSGVhZHNldCBKYWNrIiwgTlVMTCksCit9OworCisvKiBTcGl0eiBtYWNoaW5lIGF1ZGlvX21hcCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmF1ZGlvX21hcFtdWzNdID0geworCisJLyogaGVhZHBob25lIGNvbm5lY3RlZCB0byBMT1VUMSwgUk9VVDEgKi8KKwl7IkhlYWRwaG9uZSBKYWNrIiwgTlVMTCwgIkxPVVQxIn0sCisJeyJIZWFkcGhvbmUgSmFjayIsIE5VTEwsICJST1VUMSJ9LAorCisJLyogaGVhZHNldCBjb25uZWN0ZWQgdG8gUk9VVDEgYW5kIExJTlBVVDEgd2l0aCBiaWFzIChkZWYgYmVsb3cpICovCisJeyJIZWFkc2V0IEphY2siLCBOVUxMLCAiUk9VVDEifSwKKworCS8qIGV4dCBzcGVha2VyIGNvbm5lY3RlZCB0byBMT1VUMiwgUk9VVDIgICovCisJeyJFeHQgU3BrIiwgTlVMTCAsICJST1VUMiJ9LAorCXsiRXh0IFNwayIsIE5VTEwgLCAiTE9VVDIifSwKKworCS8qIG1pYyBpcyBjb25uZWN0ZWQgdG8gaW5wdXQgMSAtIHdpdGggYmlhcyAqLworCXsiTElOUFVUMSIsIE5VTEwsICJNaWMgQmlhcyJ9LAorCXsiTWljIEJpYXMiLCBOVUxMLCAiTWljIEphY2sifSwKKworCS8qIGxpbmUgaXMgY29ubmVjdGVkIHRvIGlucHV0IDEgLSBubyBiaWFzICovCisJeyJMSU5QVVQxIiwgTlVMTCwgIkxpbmUgSmFjayJ9LAorCisJe05VTEwsIE5VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmphY2tfZnVuY3Rpb25bXSA9IHsiSGVhZHBob25lIiwgIk1pYyIsICJMaW5lIiwgIkhlYWRzZXQiLAorCSJPZmYifTsKK3N0YXRpYyBjb25zdCBjaGFyICpzcGtfZnVuY3Rpb25bXSA9IHsiT24iLCAiT2ZmIn07CitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNwaXR6X2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDUsIGphY2tfZnVuY3Rpb24pLAorCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgc3BrX2Z1bmN0aW9uKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTBfc3BpdHpfY29udHJvbHNbXSA9IHsKKwlTT0NfRU5VTV9FWFQoIkphY2sgRnVuY3Rpb24iLCBzcGl0el9lbnVtWzBdLCBzcGl0el9nZXRfamFjaywKKwkJc3BpdHpfc2V0X2phY2spLAorCVNPQ19FTlVNX0VYVCgiU3BlYWtlciBGdW5jdGlvbiIsIHNwaXR6X2VudW1bMV0sIHNwaXR6X2dldF9zcGssCisJCXNwaXR6X3NldF9zcGspLAorfTsKKworLyoKKyAqIExvZ2ljIGZvciBhIHdtODc1MCBhcyBjb25uZWN0ZWQgb24gYSBTaGFycCBTTC1DeHgwMCBEZXZpY2UKKyAqLworc3RhdGljIGludCBzcGl0el93bTg3NTBfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGksIGVycjsKKworCS8qIE5DIGNvZGVjIHBpbnMgKi8KKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiUklOUFVUMSIsIDApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJMSU5QVVQyIiwgMCk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIlJJTlBVVDIiLCAwKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTElOUFVUMyIsIDApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJSSU5QVVQzIiwgMCk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk9VVDMiLCAwKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTU9OTyIsIDApOworCisJLyogQWRkIHNwaXR6IHNwZWNpZmljIGNvbnRyb2xzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzUwX3NwaXR6X2NvbnRyb2xzKTsgaSsrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLAorCQkJc25kX3NvY19jbmV3KCZ3bTg3NTBfc3BpdHpfY29udHJvbHNbaV0sIGNvZGVjLCBOVUxMKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBBZGQgc3BpdHogc3BlY2lmaWMgd2lkZ2V0cyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODc1MF9kYXBtX3dpZGdldHMpOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd204NzUwX2RhcG1fd2lkZ2V0c1tpXSk7CisJfQorCisJLyogU2V0IHVwIHNwaXR6IHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCisJZm9yIChpID0gMDsgYXVkaW9fbWFwW2ldWzBdICE9IE5VTEw7IGkrKykgeworCQlzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dChjb2RlYywgYXVkaW9fbWFwW2ldWzBdLAorCQkJYXVkaW9fbWFwW2ldWzFdLCBhdWRpb19tYXBbaV1bMl0pOworCX0KKworCXNuZF9zb2NfZGFwbV9zeW5jX2VuZHBvaW50cyhjb2RlYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHNwaXR6IGRpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0+IENQVSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHNwaXR6X2RhaSA9IHsKKwkubmFtZSA9ICJ3bTg3NTAiLAorCS5zdHJlYW1fbmFtZSA9ICJXTTg3NTAiLAorCS5jcHVfZGFpID0gJnB4YV9pMnNfZGFpLAorCS5jb2RlY19kYWkgPSAmd204NzUwX2RhaSwKKwkuaW5pdCA9IHNwaXR6X3dtODc1MF9pbml0LAorCS5vcHMgPSAmc3BpdHpfb3BzLAorfTsKKworLyogc3BpdHogYXVkaW8gbWFjaGluZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHNuZF9zb2NfbWFjaGluZV9zcGl0eiA9IHsKKwkubmFtZSA9ICJTcGl0eiIsCisJLmRhaV9saW5rID0gJnNwaXR6X2RhaSwKKwkubnVtX2xpbmtzID0gMSwKK307CisKKy8qIHNwaXR6IGF1ZGlvIHByaXZhdGUgZGF0YSAqLworc3RhdGljIHN0cnVjdCB3bTg3NTBfc2V0dXBfZGF0YSBzcGl0el93bTg3NTBfc2V0dXAgPSB7CisJLmkyY19hZGRyZXNzID0gMHgxYiwKK307CisKKy8qIHNwaXR6IGF1ZGlvIHN1YnN5c3RlbSAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RldmljZSBzcGl0el9zbmRfZGV2ZGF0YSA9IHsKKwkubWFjaGluZSA9ICZzbmRfc29jX21hY2hpbmVfc3BpdHosCisJLnBsYXRmb3JtID0gJnB4YTJ4eF9zb2NfcGxhdGZvcm0sCisJLmNvZGVjX2RldiA9ICZzb2NfY29kZWNfZGV2X3dtODc1MCwKKwkuY29kZWNfZGF0YSA9ICZzcGl0el93bTg3NTBfc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3BpdHpfc25kX2RldmljZTsKKworc3RhdGljIGludCBfX2luaXQgc3BpdHpfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoIShtYWNoaW5lX2lzX3NwaXR6KCkgfHwgbWFjaGluZV9pc19ib3J6b2koKSB8fCBtYWNoaW5lX2lzX2FraXRhKCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNwaXR6X3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIC0xKTsKKwlpZiAoIXNwaXR6X3NuZF9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoc3BpdHpfc25kX2RldmljZSwgJnNwaXR6X3NuZF9kZXZkYXRhKTsKKwlzcGl0el9zbmRfZGV2ZGF0YS5kZXYgPSAmc3BpdHpfc25kX2RldmljZS0+ZGV2OworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc3BpdHpfc25kX2RldmljZSk7CisKKwlpZiAocmV0KQorCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNwaXR6X3NuZF9kZXZpY2UpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNwaXR6X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzcGl0el9zbmRfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoc3BpdHpfaW5pdCk7Cittb2R1bGVfZXhpdChzcGl0el9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgU3BpdHoiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvdG9zYS5jIGIvc291bmQvc29jL3B4YS90b3NhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwNGUzMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9weGEvdG9zYS5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogdG9zYS5jICAtLSAgU29DIGF1ZGlvIGZvciBUb3NhCisgKgorICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIENvcHlyaWdodCAyMDA1IE9wZW5lZGhhbmQgTHRkLgorICoKKyAqIEF1dGhvcnM6IExpYW0gR2lyZHdvb2QgPGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbT4KKyAqICAgICAgICAgIFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAzMHRoIE5vdiAyMDA1ICAgSW5pdGlhbCB2ZXJzaW9uLgorICoKKyAqIEdQSU8ncworICogIDEgLSBKYWNrIEluc2VydGlvbgorICogIDUgLSBIb29rc3dpdGNoIChoZWFkc2V0IGFuc3dlci9oYW5nIHVwIHN3aXRjaCkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3RtaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXVkaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90b3NhLmg+CisKKyNpbmNsdWRlICIuLi9jb2RlY3Mvd205NzEyLmgiCisjaW5jbHVkZSAicHhhMnh4LXBjbS5oIgorI2luY2x1ZGUgInB4YTJ4eC1hYzk3LmgiCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lIHRvc2E7CisKKyNkZWZpbmUgVE9TQV9IUCAgICAgICAgMAorI2RlZmluZSBUT1NBX01JQ19JTlQgICAxCisjZGVmaW5lIFRPU0FfSEVBRFNFVCAgIDIKKyNkZWZpbmUgVE9TQV9IUF9PRkYgICAgMworI2RlZmluZSBUT1NBX1NQS19PTiAgICAwCisjZGVmaW5lIFRPU0FfU1BLX09GRiAgIDEKKworc3RhdGljIGludCB0b3NhX2phY2tfZnVuYzsKK3N0YXRpYyBpbnQgdG9zYV9zcGtfZnVuYzsKKworc3RhdGljIHZvaWQgdG9zYV9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IHNwayA9IDAsIG1pY19pbnQgPSAwLCBocCA9IDAsIGhzID0gMDsKKworCS8qIHNldCB1cCBqYWNrIGNvbm5lY3Rpb24gKi8KKwlzd2l0Y2ggKHRvc2FfamFja19mdW5jKSB7CisJY2FzZSBUT1NBX0hQOgorCQlocCA9IDE7CisJCWJyZWFrOworCWNhc2UgVE9TQV9NSUNfSU5UOgorCQltaWNfaW50ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBUT1NBX0hFQURTRVQ6CisJCWhzID0gMTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHRvc2Ffc3BrX2Z1bmMgPT0gVE9TQV9TUEtfT04pCisJCXNwayA9IDE7CisKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiU3BlYWtlciIsIHNwayk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk1pYyAoSW50ZXJuYWwpIiwgbWljX2ludCk7CisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgaHApOworCXNuZF9zb2NfZGFwbV9zZXRfZW5kcG9pbnQoY29kZWMsICJIZWFkc2V0IEphY2siLCBocyk7CisJc25kX3NvY19kYXBtX3N5bmNfZW5kcG9pbnRzKGNvZGVjKTsKK30KKworc3RhdGljIGludCB0b3NhX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+c29jZGV2LT5jb2RlYzsKKworCS8qIGNoZWNrIHRoZSBqYWNrIHN0YXR1cyBhdCBzdHJlYW0gc3RhcnR1cCAqLworCXRvc2FfZXh0X2NvbnRyb2woY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIHRvc2Ffb3BzID0geworCS5zdGFydHVwID0gdG9zYV9zdGFydHVwLAorfTsKKworc3RhdGljIGludCB0b3NhX2dldF9qYWNrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdG9zYV9qYWNrX2Z1bmM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9zYV9zZXRfamFjayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSAgc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJaWYgKHRvc2FfamFja19mdW5jID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlyZXR1cm4gMDsKKworCXRvc2FfamFja19mdW5jID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJdG9zYV9leHRfY29udHJvbChjb2RlYyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdG9zYV9nZXRfc3BrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdG9zYV9zcGtfZnVuYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b3NhX3NldF9zcGsoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCWlmICh0b3NhX3Nwa19mdW5jID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQlyZXR1cm4gMDsKKworCXRvc2Ffc3BrX2Z1bmMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl0b3NhX2V4dF9jb250cm9sKGNvZGVjKTsKKwlyZXR1cm4gMTsKK30KKworLyogdG9zYSBkYXBtIGV2ZW50IGhhbmRsZXJzICovCitzdGF0aWMgaW50IHRvc2FfaHBfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCBldmVudCkKK3sKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJc2V0X3RjNjM5M19ncGlvKCZ0YzYzOTNfZGV2aWNlLmRldixUT1NBX1RDNjM5M19MX01VVEUpOworCWVsc2UKKwkJcmVzZXRfdGM2MzkzX2dwaW8oJnRjNjM5M19kZXZpY2UuZGV2LFRPU0FfVEM2MzkzX0xfTVVURSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHRvc2EgbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0b3NhX2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUgSmFjayIsIHRvc2FfaHBfZXZlbnQpLAorU05EX1NPQ19EQVBNX0hQKCJIZWFkc2V0IEphY2siLCBOVUxMKSwKK1NORF9TT0NfREFQTV9NSUMoIk1pYyAoSW50ZXJuYWwpIiwgTlVMTCksCitTTkRfU09DX0RBUE1fU1BLKCJTcGVha2VyIiwgTlVMTCksCit9OworCisvKiB0b3NhIGF1ZGlvIG1hcCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmF1ZGlvX21hcFtdWzNdID0geworCisJLyogaGVhZHBob25lIGNvbm5lY3RlZCB0byBIUE9VVEwsIEhQT1VUUiAqLworCXsiSGVhZHBob25lIEphY2siLCBOVUxMLCAiSFBPVVRMIn0sCisJeyJIZWFkcGhvbmUgSmFjayIsIE5VTEwsICJIUE9VVFIifSwKKworCS8qIGV4dCBzcGVha2VyIGNvbm5lY3RlZCB0byBMT1VUMiwgUk9VVDIgKi8KKwl7IlNwZWFrZXIiLCBOVUxMLCAiTE9VVDIifSwKKwl7IlNwZWFrZXIiLCBOVUxMLCAiUk9VVDIifSwKKworCS8qIGludGVybmFsIG1pYyBpcyBjb25uZWN0ZWQgdG8gbWljMSwgbWljMiBkaWZmZXJlbnRpYWwgLSB3aXRoIGJpYXMgKi8KKwl7Ik1JQzEiLCBOVUxMLCAiTWljIEJpYXMifSwKKwl7Ik1JQzIiLCBOVUxMLCAiTWljIEJpYXMifSwKKwl7Ik1pYyBCaWFzIiwgTlVMTCwgIk1pYyAoSW50ZXJuYWwpIn0sCisKKwkvKiBoZWFkc2V0IGlzIGNvbm5lY3RlZCB0byBIUE9VVFIsIGFuZCBMSU5FSU5SIHdpdGggYmlhcyAqLworCXsiSGVhZHNldCBKYWNrIiwgTlVMTCwgIkhQT1VUUiJ9LAorCXsiTElORUlOUiIsIE5VTEwsICJNaWMgQmlhcyJ9LAorCXsiTWljIEJpYXMiLCBOVUxMLCAiSGVhZHNldCBKYWNrIn0sCisKKwl7TlVMTCwgTlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqamFja19mdW5jdGlvbltdID0geyJIZWFkcGhvbmUiLCAiTWljIiwgIkxpbmUiLCAiSGVhZHNldCIsCisJIk9mZiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKnNwa19mdW5jdGlvbltdID0geyJPbiIsICJPZmYifTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdG9zYV9lbnVtW10gPSB7CisJU09DX0VOVU1fU0lOR0xFX0VYVCg1LCBqYWNrX2Z1bmN0aW9uKSwKKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIHNwa19mdW5jdGlvbiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdG9zYV9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiSmFjayBGdW5jdGlvbiIsIHRvc2FfZW51bVswXSwgdG9zYV9nZXRfamFjaywKKwkJdG9zYV9zZXRfamFjayksCisJU09DX0VOVU1fRVhUKCJTcGVha2VyIEZ1bmN0aW9uIiwgdG9zYV9lbnVtWzFdLCB0b3NhX2dldF9zcGssCisJCXRvc2Ffc2V0X3NwayksCit9OworCitzdGF0aWMgaW50IHRvc2FfYWM5N19pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaSwgZXJyOworCisJc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChjb2RlYywgIk9VVDMiLCAwKTsKKwlzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KGNvZGVjLCAiTU9OT09VVCIsIDApOworCisJLyogYWRkIHRvc2Egc3BlY2lmaWMgY29udHJvbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0b3NhX2NvbnRyb2xzKTsgaSsrKSB7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLAorCQkJCXNuZF9zb2NfY25ldygmdG9zYV9jb250cm9sc1tpXSxjb2RlYywgTlVMTCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogYWRkIHRvc2Egc3BlY2lmaWMgd2lkZ2V0cyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvc2FfZGFwbV93aWRnZXRzKTsgaSsrKSB7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbChjb2RlYywgJnRvc2FfZGFwbV93aWRnZXRzW2ldKTsKKwl9CisKKwkvKiBzZXQgdXAgdG9zYSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLworCWZvciAoaSA9IDA7IGF1ZGlvX21hcFtpXVswXSAhPSBOVUxMOyBpKyspIHsKKwkJc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQoY29kZWMsIGF1ZGlvX21hcFtpXVswXSwKKwkJCWF1ZGlvX21hcFtpXVsxXSwgYXVkaW9fbWFwW2ldWzJdKTsKKwl9CisKKwlzbmRfc29jX2RhcG1fc3luY19lbmRwb2ludHMoY29kZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgdG9zYV9kYWlbXSA9IHsKK3sKKwkubmFtZSA9ICJBQzk3IiwKKwkuc3RyZWFtX25hbWUgPSAiQUM5NyBIaUZpIiwKKwkuY3B1X2RhaSA9ICZweGFfYWM5N19kYWlbUFhBMlhYX0RBSV9BQzk3X0hJRkldLAorCS5jb2RlY19kYWkgPSAmd205NzEyX2RhaVtXTTk3MTJfREFJX0FDOTdfSElGSV0sCisJLmluaXQgPSB0b3NhX2FjOTdfaW5pdCwKKwkub3BzID0gJnRvc2Ffb3BzLAorfSwKK3sKKwkubmFtZSA9ICJBQzk3IEF1eCIsCisJLnN0cmVhbV9uYW1lID0gIkFDOTcgQXV4IiwKKwkuY3B1X2RhaSA9ICZweGFfYWM5N19kYWlbUFhBMlhYX0RBSV9BQzk3X0FVWF0sCisJLmNvZGVjX2RhaSA9ICZ3bTk3MTJfZGFpW1dNOTcxMl9EQUlfQUM5N19BVVhdLAorCS5vcHMgPSAmdG9zYV9vcHMsCit9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX21hY2hpbmUgdG9zYSA9IHsKKwkubmFtZSA9ICJUb3NhIiwKKwkuZGFpX2xpbmsgPSB0b3NhX2RhaSwKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRSh0b3NhX2RhaSksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlIHRvc2Ffc25kX2RldmRhdGEgPSB7CisJLm1hY2hpbmUgPSAmdG9zYSwKKwkucGxhdGZvcm0gPSAmcHhhMnh4X3NvY19wbGF0Zm9ybSwKKwkuY29kZWNfZGV2ID0gJnNvY19jb2RlY19kZXZfd205NzEyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRvc2Ffc25kX2RldmljZTsKKworc3RhdGljIGludCBfX2luaXQgdG9zYV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghbWFjaGluZV9pc190b3NhKCkpCisJCXJldHVybiAtRU5PREVWOworCisJdG9zYV9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CisJaWYgKCF0b3NhX3NuZF9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEodG9zYV9zbmRfZGV2aWNlLCAmdG9zYV9zbmRfZGV2ZGF0YSk7CisJdG9zYV9zbmRfZGV2ZGF0YS5kZXYgPSAmdG9zYV9zbmRfZGV2aWNlLT5kZXY7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZCh0b3NhX3NuZF9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dCh0b3NhX3NuZF9kZXZpY2UpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRvc2FfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHRvc2Ffc25kX2RldmljZSk7Cit9CisKK21vZHVsZV9pbml0KHRvc2FfaW5pdCk7Cittb2R1bGVfZXhpdCh0b3NhX2V4aXQpOworCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIlJpY2hhcmQgUHVyZGllIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIFRvc2EiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY29yZS5jIGIvc291bmQvc29jL3NvYy1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1MTlhZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC0wLDAgKzEsMTU4NyBAQAorLyoKKyAqIHNvYy1jb3JlLmMgIC0tICBBTFNBIFNvQyBBdWRpbyBMYXllcgorICoKKyAqIENvcHlyaWdodCAyMDA1IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBDb3B5cmlnaHQgMjAwNSBPcGVuZWRoYW5kIEx0ZC4KKyAqCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqICAgICAgICAgd2l0aCBjb2RlLCBjb21tZW50cyBhbmQgaWRlYXMgZnJvbSA6LQorICogICAgICAgICBSaWNoYXJkIFB1cmRpZSA8cmljaGFyZEBvcGVuZWRoYW5kLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMTJ0aCBBdWcgMjAwNSAgIEluaXRpYWwgdmVyc2lvbi4KKyAqICAgIDI1dGggT2N0IDIwMDUgICBXb3JraW5nIENvZGVjLCBJbnRlcmZhY2UgYW5kIFBsYXRmb3JtIHJlZ2lzdHJhdGlvbi4KKyAqCisgKiAgVE9ETzoKKyAqICAgbyBBZGQgaHcgcnVsZXMgdG8gZW5mb3JjZSByYXRlcywgZXRjLgorICogICBvIE1vcmUgdGVzdGluZyB3aXRoIG90aGVyIGNvZGVjcy9tYWNoaW5lcy4KKyAqICAgbyBBZGQgbW9yZSBjb2RlY3MgYW5kIHBsYXRmb3JtcyB0byBlbnN1cmUgZ29vZCBBUEkgY292ZXJhZ2UuCisgKiAgIG8gU3VwcG9ydCBURE0gb24gUENNIGFuZCBJMlMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisKKy8qIGRlYnVnICovCisjZGVmaW5lIFNPQ19ERUJVRyAwCisjaWYgU09DX0RFQlVHCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKGZvcm1hdCwgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKQorI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfTVVURVgocGNtX211dGV4KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoaW9fbXV0ZXgpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNvY19wbV93YWl0cSk7CisKKy8qCisgKiBUaGlzIGlzIGEgdGltZW91dCB0byBkbyBhIERBUE0gcG93ZXJkb3duIGFmdGVyIGEgc3RyZWFtIGlzIGNsb3NlZCgpLgorICogSXQgY2FuIGJlIHVzZWQgdG8gZWxpbWluYXRlIHBvcHMgYmV0d2VlbiBkaWZmZXJlbnQgcGxheWJhY2sgc3RyZWFtcywgZS5nLgorICogYmV0d2VlbiB0d28gYXVkaW8gdHJhY2tzLgorICovCitzdGF0aWMgaW50IHBtZG93bl90aW1lID0gNTAwMDsKK21vZHVsZV9wYXJhbShwbWRvd25fdGltZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG1kb3duX3RpbWUsICJEQVBNIHN0cmVhbSBwb3dlcmRvd24gdGltZSAobXNlY3MpIik7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZvcmNlcyBhbnkgZGVsYXllZCB3b3JrIHRvIGJlIHF1ZXVlZCBhbmQgcnVuLgorICovCitzdGF0aWMgaW50IHJ1bl9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmspCit7CisJaW50IHJldDsKKworCS8qIGNhbmNlbCBhbnkgd29yayB3YWl0aW5nIHRvIGJlIHF1ZXVlZC4gKi8KKwlyZXQgPSBjYW5jZWxfZGVsYXllZF93b3JrKGR3b3JrKTsKKworCS8qIGlmIHRoZXJlIHdhcyBhbnkgd29yayB3YWl0aW5nIHRoZW4gd2UgcnVuIGl0IG5vdyBhbmQKKwkgKiB3YWl0IGZvciBpdCdzIGNvbXBsZXRpb24gKi8KKwlpZiAocmV0KSB7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yayhkd29yaywgMCk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfU05EX1NPQ19BQzk3X0JVUworLyogdW5yZWdpc3RlciBhYzk3IGNvZGVjICovCitzdGF0aWMgaW50IHNvY19hYzk3X2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpZiAoY29kZWMtPmFjOTctPmRldi5idXMpCisJCWRldmljZV91bnJlZ2lzdGVyKCZjb2RlYy0+YWM5Ny0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogc3RvcCBubyBkZXYgcmVsZWFzZSB3YXJuaW5nICovCitzdGF0aWMgdm9pZCBzb2NfYWM5N19kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpe30KKworLyogcmVnaXN0ZXIgYWM5NyBjb2RlYyB0byBidXMgKi8KK3N0YXRpYyBpbnQgc29jX2FjOTdfZGV2X3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgZXJyOworCisJY29kZWMtPmFjOTctPmRldi5idXMgPSAmYWM5N19idXNfdHlwZTsKKwljb2RlYy0+YWM5Ny0+ZGV2LnBhcmVudCA9IE5VTEw7CisJY29kZWMtPmFjOTctPmRldi5yZWxlYXNlID0gc29jX2FjOTdfZGV2aWNlX3JlbGVhc2U7CisKKwlzbnByaW50Zihjb2RlYy0+YWM5Ny0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlZC0lZDolcyIsCisJCSBjb2RlYy0+Y2FyZC0+bnVtYmVyLCAwLCBjb2RlYy0+bmFtZSk7CisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZjb2RlYy0+YWM5Ny0+ZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDYW4ndCByZWdpc3RlciBhYzk3IGJ1c1xuIik7CisJCWNvZGVjLT5hYzk3LT5kZXYuYnVzID0gTlVMTDsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBnZXRfZGFpX25hbWUoaW50IHR5cGUpCit7CisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFNORF9TT0NfREFJX0FDOTc6CisJCXJldHVybiAiQUM5NyI7CisJY2FzZSBTTkRfU09DX0RBSV9JMlM6CisJCXJldHVybiAiSTJTIjsKKwljYXNlIFNORF9TT0NfREFJX1BDTToKKwkJcmV0dXJuICJQQ00iOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIENhbGxlZCBieSBBTFNBIHdoZW4gYSBQQ00gc3Vic3RyZWFtIGlzIG9wZW5lZCwgdGhlIHJ1bnRpbWUtPmh3IHJlY29yZCBpcworICogdGhlbiBpbml0aWFsaXplZCBhbmQgYW55IHByaXZhdGUgZGF0YSBjYW4gYmUgYWxsb2NhdGVkLiBUaGlzIGFsc28gY2FsbHMKKyAqIHN0YXJ0dXAgZm9yIHRoZSBjcHUgREFJLCBwbGF0Zm9ybSwgbWFjaGluZSBhbmQgY29kZWMgREFJLgorICovCitzdGF0aWMgaW50IHNvY19wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICptYWNoaW5lID0gcnRkLT5kYWk7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc29jZGV2LT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gbWFjaGluZS0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSA9IG1hY2hpbmUtPmNvZGVjX2RhaTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnBjbV9tdXRleCk7CisKKwkvKiBzdGFydHVwIHRoZSBhdWRpbyBzdWJzeXN0ZW0gKi8KKwlpZiAoY3B1X2RhaS0+b3BzLnN0YXJ0dXApIHsKKwkJcmV0ID0gY3B1X2RhaS0+b3BzLnN0YXJ0dXAoc3Vic3RyZWFtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogY2FuJ3Qgb3BlbiBpbnRlcmZhY2UgJXNcbiIsCisJCQkJY3B1X2RhaS0+bmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChwbGF0Zm9ybS0+cGNtX29wcy0+b3BlbikgeworCQlyZXQgPSBwbGF0Zm9ybS0+cGNtX29wcy0+b3BlbihzdWJzdHJlYW0pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBvcGVuIHBsYXRmb3JtICVzXG4iLCBwbGF0Zm9ybS0+bmFtZSk7CisJCQlnb3RvIHBsYXRmb3JtX2VycjsKKwkJfQorCX0KKworCWlmIChjb2RlY19kYWktPm9wcy5zdGFydHVwKSB7CisJCXJldCA9IGNvZGVjX2RhaS0+b3BzLnN0YXJ0dXAoc3Vic3RyZWFtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogY2FuJ3Qgb3BlbiBjb2RlYyAlc1xuIiwKKwkJCQljb2RlY19kYWktPm5hbWUpOworCQkJZ290byBjb2RlY19kYWlfZXJyOworCQl9CisJfQorCisJaWYgKG1hY2hpbmUtPm9wcyAmJiBtYWNoaW5lLT5vcHMtPnN0YXJ0dXApIHsKKwkJcmV0ID0gbWFjaGluZS0+b3BzLT5zdGFydHVwKHN1YnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6ICVzIHN0YXJ0dXAgZmFpbGVkXG4iLCBtYWNoaW5lLT5uYW1lKTsKKwkJCWdvdG8gbWFjaGluZV9lcnI7CisJCX0KKwl9CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjb2RlYyBhbmQgY3B1IERBSSdzIGFyZSBjb21wYXRpYmxlICovCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKKwkJcnVudGltZS0+aHcucmF0ZV9taW4gPQorCQkJbWF4KGNvZGVjX2RhaS0+cGxheWJhY2sucmF0ZV9taW4sIGNwdV9kYWktPnBsYXliYWNrLnJhdGVfbWluKTsKKwkJcnVudGltZS0+aHcucmF0ZV9tYXggPQorCQkJbWluKGNvZGVjX2RhaS0+cGxheWJhY2sucmF0ZV9tYXgsIGNwdV9kYWktPnBsYXliYWNrLnJhdGVfbWF4KTsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0KKwkJCW1heChjb2RlY19kYWktPnBsYXliYWNrLmNoYW5uZWxzX21pbiwKKwkJCQljcHVfZGFpLT5wbGF5YmFjay5jaGFubmVsc19taW4pOworCQlydW50aW1lLT5ody5jaGFubmVsc19tYXggPQorCQkJbWluKGNvZGVjX2RhaS0+cGxheWJhY2suY2hhbm5lbHNfbWF4LAorCQkJCWNwdV9kYWktPnBsYXliYWNrLmNoYW5uZWxzX21heCk7CisJCXJ1bnRpbWUtPmh3LmZvcm1hdHMgPQorCQkJY29kZWNfZGFpLT5wbGF5YmFjay5mb3JtYXRzICYgY3B1X2RhaS0+cGxheWJhY2suZm9ybWF0czsKKwkJcnVudGltZS0+aHcucmF0ZXMgPQorCQkJY29kZWNfZGFpLT5wbGF5YmFjay5yYXRlcyAmIGNwdV9kYWktPnBsYXliYWNrLnJhdGVzOworCX0gZWxzZSB7CisJCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0KKwkJCW1heChjb2RlY19kYWktPmNhcHR1cmUucmF0ZV9taW4sIGNwdV9kYWktPmNhcHR1cmUucmF0ZV9taW4pOworCQlydW50aW1lLT5ody5yYXRlX21heCA9CisJCQltaW4oY29kZWNfZGFpLT5jYXB0dXJlLnJhdGVfbWF4LCBjcHVfZGFpLT5jYXB0dXJlLnJhdGVfbWF4KTsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0KKwkJCW1heChjb2RlY19kYWktPmNhcHR1cmUuY2hhbm5lbHNfbWluLAorCQkJCWNwdV9kYWktPmNhcHR1cmUuY2hhbm5lbHNfbWluKTsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0KKwkJCW1pbihjb2RlY19kYWktPmNhcHR1cmUuY2hhbm5lbHNfbWF4LAorCQkJCWNwdV9kYWktPmNhcHR1cmUuY2hhbm5lbHNfbWF4KTsKKwkJcnVudGltZS0+aHcuZm9ybWF0cyA9CisJCQljb2RlY19kYWktPmNhcHR1cmUuZm9ybWF0cyAmIGNwdV9kYWktPmNhcHR1cmUuZm9ybWF0czsKKwkJcnVudGltZS0+aHcucmF0ZXMgPQorCQkJY29kZWNfZGFpLT5jYXB0dXJlLnJhdGVzICYgY3B1X2RhaS0+Y2FwdHVyZS5yYXRlczsKKwl9CisKKwlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOworCWlmICghcnVudGltZS0+aHcucmF0ZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiAlcyA8LT4gJXMgTm8gbWF0Y2hpbmcgcmF0ZXNcbiIsCisJCQljb2RlY19kYWktPm5hbWUsIGNwdV9kYWktPm5hbWUpOworCQlnb3RvIG1hY2hpbmVfZXJyOworCX0KKwlpZiAoIXJ1bnRpbWUtPmh3LmZvcm1hdHMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiAlcyA8LT4gJXMgTm8gbWF0Y2hpbmcgZm9ybWF0c1xuIiwKKwkJCWNvZGVjX2RhaS0+bmFtZSwgY3B1X2RhaS0+bmFtZSk7CisJCWdvdG8gbWFjaGluZV9lcnI7CisJfQorCWlmICghcnVudGltZS0+aHcuY2hhbm5lbHNfbWluIHx8ICFydW50aW1lLT5ody5jaGFubmVsc19tYXgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiAlcyA8LT4gJXMgTm8gbWF0Y2hpbmcgY2hhbm5lbHNcbiIsCisJCQljb2RlY19kYWktPm5hbWUsIGNwdV9kYWktPm5hbWUpOworCQlnb3RvIG1hY2hpbmVfZXJyOworCX0KKworCWRiZygiYXNvYzogJXMgPC0+ICVzIGluZm86XG4iLGNvZGVjX2RhaS0+bmFtZSwgY3B1X2RhaS0+bmFtZSk7CisJZGJnKCJhc29jOiByYXRlIG1hc2sgMHgleFxuIiwgcnVudGltZS0+aHcucmF0ZXMpOworCWRiZygiYXNvYzogbWluIGNoICVkIG1heCBjaCAlZFxuIiwgcnVudGltZS0+aHcuY2hhbm5lbHNfbWluLAorCQlydW50aW1lLT5ody5jaGFubmVsc19tYXgpOworCWRiZygiYXNvYzogbWluIHJhdGUgJWQgbWF4IHJhdGUgJWRcbiIsIHJ1bnRpbWUtPmh3LnJhdGVfbWluLAorCQlydW50aW1lLT5ody5yYXRlX21heCk7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJY3B1X2RhaS0+cGxheWJhY2suYWN0aXZlID0gY29kZWNfZGFpLT5wbGF5YmFjay5hY3RpdmUgPSAxOworCWVsc2UKKwkJY3B1X2RhaS0+Y2FwdHVyZS5hY3RpdmUgPSBjb2RlY19kYWktPmNhcHR1cmUuYWN0aXZlID0gMTsKKwljcHVfZGFpLT5hY3RpdmUgPSBjb2RlY19kYWktPmFjdGl2ZSA9IDE7CisJY3B1X2RhaS0+cnVudGltZSA9IHJ1bnRpbWU7CisJc29jZGV2LT5jb2RlYy0+YWN0aXZlKys7CisJbXV0ZXhfdW5sb2NrKCZwY21fbXV0ZXgpOworCXJldHVybiAwOworCittYWNoaW5lX2VycjoKKwlpZiAobWFjaGluZS0+b3BzICYmIG1hY2hpbmUtPm9wcy0+c2h1dGRvd24pCisJCW1hY2hpbmUtPm9wcy0+c2h1dGRvd24oc3Vic3RyZWFtKTsKKworY29kZWNfZGFpX2VycjoKKwlpZiAocGxhdGZvcm0tPnBjbV9vcHMtPmNsb3NlKQorCQlwbGF0Zm9ybS0+cGNtX29wcy0+Y2xvc2Uoc3Vic3RyZWFtKTsKKworcGxhdGZvcm1fZXJyOgorCWlmIChjcHVfZGFpLT5vcHMuc2h1dGRvd24pCisJCWNwdV9kYWktPm9wcy5zaHV0ZG93bihzdWJzdHJlYW0pOworb3V0OgorCW11dGV4X3VubG9jaygmcGNtX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUG93ZXIgZG93biB0aGUgYXVkaW8gc3Vic3l0ZW0gcG1kb3duX3RpbWUgbXNlY3MgYWZ0ZXIgY2xvc2UgaXMgY2FsbGVkLgorICogVGhpcyBpcyB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIHBvcHMgb3IgY2xpY2tzIGluIGJldHdlZW4gYW55IG11c2ljIHRyYWNrcworICogZHVlIHRvIERBUE0gcG93ZXIgY3ljbGluZy4KKyAqLworc3RhdGljIHZvaWQgY2xvc2VfZGVsYXllZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc25kX3NvY19kZXZpY2UsIGRlbGF5ZWRfd29yay53b3JrKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpOworCWludCBpOworCisJbXV0ZXhfbG9jaygmcGNtX211dGV4KTsKKwlmb3IoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX2RhaTsgaSsrKSB7CisJCWNvZGVjX2RhaSA9ICZjb2RlYy0+ZGFpW2ldOworCisJCWRiZygicG9wIHdxIGNoZWNraW5nOiAlcyBzdGF0dXM6ICVzIHdhaXRpbmc6ICVzXG4iLAorCQkJY29kZWNfZGFpLT5wbGF5YmFjay5zdHJlYW1fbmFtZSwKKwkJCWNvZGVjX2RhaS0+cGxheWJhY2suYWN0aXZlID8gImFjdGl2ZSIgOiAiaW5hY3RpdmUiLAorCQkJY29kZWNfZGFpLT5wb3Bfd2FpdCA/ICJ5ZXMiIDogIm5vIik7CisKKwkJLyogYXJlIHdlIHdhaXRpbmcgb24gdGhpcyBjb2RlYyBEQUkgc3RyZWFtICovCisJCWlmIChjb2RlY19kYWktPnBvcF93YWl0ID09IDEpIHsKKworCQkJY29kZWNfZGFpLT5wb3Bfd2FpdCA9IDA7CisJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLCBjb2RlY19kYWktPnBsYXliYWNrLnN0cmVhbV9uYW1lLAorCQkJCVNORF9TT0NfREFQTV9TVFJFQU1fU1RPUCk7CisKKwkJCS8qIHBvd2VyIGRvd24gdGhlIGNvZGVjIHBvd2VyIGRvbWFpbiBpZiBubyBsb25nZXIgYWN0aXZlICovCisJCQlpZiAoY29kZWMtPmFjdGl2ZSA9PSAwKSB7CisJCQkJZGJnKCJwb3Agd3EgRDMgJXMgJXNcbiIsIGNvZGVjLT5uYW1lLAorCQkJCQljb2RlY19kYWktPnBsYXliYWNrLnN0cmVhbV9uYW1lKTsKKwkJIAkJaWYgKGNvZGVjLT5kYXBtX2V2ZW50KQorCQkJCQljb2RlYy0+ZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKKwkJCX0KKwkJfQorCX0KKwltdXRleF91bmxvY2soJnBjbV9tdXRleCk7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgQUxTQSB3aGVuIGEgUENNIHN1YnN0cmVhbSBpcyBjbG9zZWQuIFByaXZhdGUgZGF0YSBjYW4gYmUKKyAqIGZyZWVkIGhlcmUuIFRoZSBjcHUgREFJLCBjb2RlYyBEQUksIG1hY2hpbmUgYW5kIHBsYXRmb3JtIGFyZSBhbHNvCisgKiBzaHV0ZG93bi4KKyAqLworc3RhdGljIGludCBzb2NfY29kZWNfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKm1hY2hpbmUgPSBydGQtPmRhaTsKKwlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBzb2NkZXYtPnBsYXRmb3JtOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBtYWNoaW5lLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpID0gbWFjaGluZS0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwltdXRleF9sb2NrKCZwY21fbXV0ZXgpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWNwdV9kYWktPnBsYXliYWNrLmFjdGl2ZSA9IGNvZGVjX2RhaS0+cGxheWJhY2suYWN0aXZlID0gMDsKKwllbHNlCisJCWNwdV9kYWktPmNhcHR1cmUuYWN0aXZlID0gY29kZWNfZGFpLT5jYXB0dXJlLmFjdGl2ZSA9IDA7CisKKwlpZiAoY29kZWNfZGFpLT5wbGF5YmFjay5hY3RpdmUgPT0gMCAmJgorCQljb2RlY19kYWktPmNhcHR1cmUuYWN0aXZlID09IDApIHsKKwkJY3B1X2RhaS0+YWN0aXZlID0gY29kZWNfZGFpLT5hY3RpdmUgPSAwOworCX0KKwljb2RlYy0+YWN0aXZlLS07CisKKwlpZiAoY3B1X2RhaS0+b3BzLnNodXRkb3duKQorCQljcHVfZGFpLT5vcHMuc2h1dGRvd24oc3Vic3RyZWFtKTsKKworCWlmIChjb2RlY19kYWktPm9wcy5zaHV0ZG93bikKKwkJY29kZWNfZGFpLT5vcHMuc2h1dGRvd24oc3Vic3RyZWFtKTsKKworCWlmIChtYWNoaW5lLT5vcHMgJiYgbWFjaGluZS0+b3BzLT5zaHV0ZG93bikKKwkJbWFjaGluZS0+b3BzLT5zaHV0ZG93bihzdWJzdHJlYW0pOworCisJaWYgKHBsYXRmb3JtLT5wY21fb3BzLT5jbG9zZSkKKwkJcGxhdGZvcm0tPnBjbV9vcHMtPmNsb3NlKHN1YnN0cmVhbSk7CisJY3B1X2RhaS0+cnVudGltZSA9IE5VTEw7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkvKiBzdGFydCBkZWxheWVkIHBvcCB3cSBoZXJlIGZvciBwbGF5YmFjayBzdHJlYW1zICovCisJCWNvZGVjX2RhaS0+cG9wX3dhaXQgPSAxOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnNvY2Rldi0+ZGVsYXllZF93b3JrLAorCQkJbXNlY3NfdG9famlmZmllcyhwbWRvd25fdGltZSkpOworCX0gZWxzZSB7CisJCS8qIGNhcHR1cmUgc3RyZWFtcyBjYW4gYmUgcG93ZXJlZCBkb3duIG5vdyAqLworCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLAorCQkJY29kZWNfZGFpLT5jYXB0dXJlLnN0cmVhbV9uYW1lLCBTTkRfU09DX0RBUE1fU1RSRUFNX1NUT1ApOworCisJCWlmIChjb2RlYy0+YWN0aXZlID09IDAgJiYgY29kZWNfZGFpLT5wb3Bfd2FpdCA9PSAwKXsKKwkJCWlmIChjb2RlYy0+ZGFwbV9ldmVudCkKKwkJCQljb2RlYy0+ZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmcGNtX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCBieSBBTFNBIHdoZW4gdGhlIFBDTSBzdWJzdHJlYW0gaXMgcHJlcGFyZWQsIGNhbiBzZXQgZm9ybWF0LCBzYW1wbGUKKyAqIHJhdGUsIGV0Yy4gIFRoaXMgZnVuY3Rpb24gaXMgbm9uIGF0b21pYyBhbmQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywKKyAqIGl0IGNhbiByZWZlciB0byB0aGUgcnVudGltZSBpbmZvLgorICovCitzdGF0aWMgaW50IHNvY19wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqbWFjaGluZSA9IHJ0ZC0+ZGFpOworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNvY2Rldi0+cGxhdGZvcm07CisJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IG1hY2hpbmUtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWkgPSBtYWNoaW5lLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnBjbV9tdXRleCk7CisKKwlpZiAobWFjaGluZS0+b3BzICYmIG1hY2hpbmUtPm9wcy0+cHJlcGFyZSkgeworCQlyZXQgPSBtYWNoaW5lLT5vcHMtPnByZXBhcmUoc3Vic3RyZWFtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogbWFjaGluZSBwcmVwYXJlIGVycm9yXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKHBsYXRmb3JtLT5wY21fb3BzLT5wcmVwYXJlKSB7CisJCXJldCA9IHBsYXRmb3JtLT5wY21fb3BzLT5wcmVwYXJlKHN1YnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IHBsYXRmb3JtIHByZXBhcmUgZXJyb3JcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoY29kZWNfZGFpLT5vcHMucHJlcGFyZSkgeworCQlyZXQgPSBjb2RlY19kYWktPm9wcy5wcmVwYXJlKHN1YnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNvZGVjIERBSSBwcmVwYXJlIGVycm9yXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNwdV9kYWktPm9wcy5wcmVwYXJlKSB7CisJCXJldCA9IGNwdV9kYWktPm9wcy5wcmVwYXJlKHN1YnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNwdSBEQUkgcHJlcGFyZSBlcnJvclxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIHdlIG9ubHkgd2FudCB0byBzdGFydCBhIERBUE0gcGxheWJhY2sgc3RyZWFtIGlmIHdlIGFyZSBub3Qgd2FpdGluZworCSAqIG9uIGFuIGV4aXN0aW5nIG9uZSBzdG9wcGluZyAqLworCWlmIChjb2RlY19kYWktPnBvcF93YWl0KSB7CisJCS8qIHdlIGFyZSB3YWl0aW5nIGZvciB0aGUgZGVsYXllZCB3b3JrIHRvIHN0YXJ0ICovCisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChzb2NkZXYtPmNvZGVjLAorCQkJCQljb2RlY19kYWktPmNhcHR1cmUuc3RyZWFtX25hbWUsCisJCQkJCVNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQpOworCQllbHNlIHsKKwkJCWNvZGVjX2RhaS0+cG9wX3dhaXQgPSAwOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmc29jZGV2LT5kZWxheWVkX3dvcmspOworCQkJaWYgKGNvZGVjX2RhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUpCisJCQkJY29kZWNfZGFpLT5kYWlfb3BzLmRpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDApOworCQl9CisJfSBlbHNlIHsKKwkJLyogbm8gZGVsYXllZCB3b3JrIC0gZG8gd2UgbmVlZCB0byBwb3dlciB1cCBjb2RlYyAqLworCQlpZiAoY29kZWMtPmRhcG1fc3RhdGUgIT0gU05EUlZfQ1RMX1BPV0VSX0QwKSB7CisKKwkJCWlmIChjb2RlYy0+ZGFwbV9ldmVudCkKKwkJCQljb2RlYy0+ZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QxKTsKKworCQkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChjb2RlYywKKwkJCQkJY29kZWNfZGFpLT5wbGF5YmFjay5zdHJlYW1fbmFtZSwKKwkJCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVEFSVCk7CisJCQllbHNlCisJCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChjb2RlYywKKwkJCQkJY29kZWNfZGFpLT5jYXB0dXJlLnN0cmVhbV9uYW1lLAorCQkJCQlTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUKTsKKworCQkJaWYgKGNvZGVjLT5kYXBtX2V2ZW50KQorCQkJCWNvZGVjLT5kYXBtX2V2ZW50KGNvZGVjLCBTTkRSVl9DVExfUE9XRVJfRDApOworCQkJaWYgKGNvZGVjX2RhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUpCisJCQkJY29kZWNfZGFpLT5kYWlfb3BzLmRpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDApOworCisJCX0gZWxzZSB7CisJCQkvKiBjb2RlYyBhbHJlYWR5IHBvd2VyZWQgLSBwb3dlciBvbiB3aWRnZXRzICovCisJCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLAorCQkJCQljb2RlY19kYWktPnBsYXliYWNrLnN0cmVhbV9uYW1lLAorCQkJCQlTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUKTsKKwkJCWVsc2UKKwkJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLAorCQkJCQljb2RlY19kYWktPmNhcHR1cmUuc3RyZWFtX25hbWUsCisJCQkJCVNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQpOworCQkJaWYgKGNvZGVjX2RhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUpCisJCQkJY29kZWNfZGFpLT5kYWlfb3BzLmRpZ2l0YWxfbXV0ZShjb2RlY19kYWksIDApOworCQl9CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwY21fbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgQUxTQSB3aGVuIHRoZSBoYXJkd2FyZSBwYXJhbXMgYXJlIHNldCBieSBhcHBsaWNhdGlvbi4gVGhpcworICogZnVuY3Rpb24gY2FuIGFsc28gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFuZCBjYW4gYWxsb2NhdGUgYnVmZmVycworICogKHVzaW5nIHNuZF9wY21fbGliXyogKS4gSXQncyBub24tYXRvbWljLgorICovCitzdGF0aWMgaW50IHNvY19wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICptYWNoaW5lID0gcnRkLT5kYWk7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc29jZGV2LT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gbWFjaGluZS0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSA9IG1hY2hpbmUtPmNvZGVjX2RhaTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnBjbV9tdXRleCk7CisKKwlpZiAobWFjaGluZS0+b3BzICYmIG1hY2hpbmUtPm9wcy0+aHdfcGFyYW1zKSB7CisJCXJldCA9IG1hY2hpbmUtPm9wcy0+aHdfcGFyYW1zKHN1YnN0cmVhbSwgcGFyYW1zKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogbWFjaGluZSBod19wYXJhbXMgZmFpbGVkXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNvZGVjX2RhaS0+b3BzLmh3X3BhcmFtcykgeworCQlyZXQgPSBjb2RlY19kYWktPm9wcy5od19wYXJhbXMoc3Vic3RyZWFtLCBwYXJhbXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBzZXQgY29kZWMgJXMgaHcgcGFyYW1zXG4iLAorCQkJCWNvZGVjX2RhaS0+bmFtZSk7CisJCQlnb3RvIGNvZGVjX2VycjsKKwkJfQorCX0KKworCWlmIChjcHVfZGFpLT5vcHMuaHdfcGFyYW1zKSB7CisJCXJldCA9IGNwdV9kYWktPm9wcy5od19wYXJhbXMoc3Vic3RyZWFtLCBwYXJhbXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBzZXQgaW50ZXJmYWNlICVzIGh3IHBhcmFtc1xuIiwKKwkJCQljcHVfZGFpLT5uYW1lKTsKKwkJCWdvdG8gaW50ZXJmYWNlX2VycjsKKwkJfQorCX0KKworCWlmIChwbGF0Zm9ybS0+cGNtX29wcy0+aHdfcGFyYW1zKSB7CisJCXJldCA9IHBsYXRmb3JtLT5wY21fb3BzLT5od19wYXJhbXMoc3Vic3RyZWFtLCBwYXJhbXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBjYW4ndCBzZXQgcGxhdGZvcm0gJXMgaHcgcGFyYW1zXG4iLAorCQkJCXBsYXRmb3JtLT5uYW1lKTsKKwkJCWdvdG8gcGxhdGZvcm1fZXJyOworCQl9CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwY21fbXV0ZXgpOworCXJldHVybiByZXQ7CisKK3BsYXRmb3JtX2VycjoKKwlpZiAoY3B1X2RhaS0+b3BzLmh3X2ZyZWUpCisJCWNwdV9kYWktPm9wcy5od19mcmVlKHN1YnN0cmVhbSk7CisKK2ludGVyZmFjZV9lcnI6CisJaWYgKGNvZGVjX2RhaS0+b3BzLmh3X2ZyZWUpCisJCWNvZGVjX2RhaS0+b3BzLmh3X2ZyZWUoc3Vic3RyZWFtKTsKKworY29kZWNfZXJyOgorCWlmKG1hY2hpbmUtPm9wcyAmJiBtYWNoaW5lLT5vcHMtPmh3X2ZyZWUpCisJCW1hY2hpbmUtPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0pOworCisJbXV0ZXhfdW5sb2NrKCZwY21fbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGcmVlJ3MgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBod19wYXJhbXMsIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKKyAqLworc3RhdGljIGludCBzb2NfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKm1hY2hpbmUgPSBydGQtPmRhaTsKKwlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBzb2NkZXYtPnBsYXRmb3JtOworCXN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWkgPSBtYWNoaW5lLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpID0gbWFjaGluZS0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwltdXRleF9sb2NrKCZwY21fbXV0ZXgpOworCisJLyogYXBwbHkgY29kZWMgZGlnaXRhbCBtdXRlICovCisJaWYgKCFjb2RlYy0+YWN0aXZlICYmIGNvZGVjX2RhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUpCisJCWNvZGVjX2RhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUoY29kZWNfZGFpLCAxKTsKKworCS8qIGZyZWUgYW55IG1hY2hpbmUgaHcgcGFyYW1zICovCisJaWYgKG1hY2hpbmUtPm9wcyAmJiBtYWNoaW5lLT5vcHMtPmh3X2ZyZWUpCisJCW1hY2hpbmUtPm9wcy0+aHdfZnJlZShzdWJzdHJlYW0pOworCisJLyogZnJlZSBhbnkgRE1BIHJlc291cmNlcyAqLworCWlmIChwbGF0Zm9ybS0+cGNtX29wcy0+aHdfZnJlZSkKKwkJcGxhdGZvcm0tPnBjbV9vcHMtPmh3X2ZyZWUoc3Vic3RyZWFtKTsKKworCS8qIG5vdyBmcmVlIGh3IHBhcmFtcyBmb3IgdGhlIERBSSdzICAqLworCWlmIChjb2RlY19kYWktPm9wcy5od19mcmVlKQorCQljb2RlY19kYWktPm9wcy5od19mcmVlKHN1YnN0cmVhbSk7CisKKwlpZiAoY3B1X2RhaS0+b3BzLmh3X2ZyZWUpCisJCWNwdV9kYWktPm9wcy5od19mcmVlKHN1YnN0cmVhbSk7CisKKwltdXRleF91bmxvY2soJnBjbV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29jX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHJ0ZC0+c29jZGV2OworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICptYWNoaW5lID0gcnRkLT5kYWk7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc29jZGV2LT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gbWFjaGluZS0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSA9IG1hY2hpbmUtPmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJaWYgKGNvZGVjX2RhaS0+b3BzLnRyaWdnZXIpIHsKKwkJcmV0ID0gY29kZWNfZGFpLT5vcHMudHJpZ2dlcihzdWJzdHJlYW0sIGNtZCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocGxhdGZvcm0tPnBjbV9vcHMtPnRyaWdnZXIpIHsKKwkJcmV0ID0gcGxhdGZvcm0tPnBjbV9vcHMtPnRyaWdnZXIoc3Vic3RyZWFtLCBjbWQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGNwdV9kYWktPm9wcy50cmlnZ2VyKSB7CisJCXJldCA9IGNwdV9kYWktPm9wcy50cmlnZ2VyKHN1YnN0cmVhbSwgY21kKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQVNvQyBQQ00gb3BlcmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzb2NfcGNtX29wcyA9IHsKKwkub3BlbgkJPSBzb2NfcGNtX29wZW4sCisJLmNsb3NlCQk9IHNvY19jb2RlY19jbG9zZSwKKwkuaHdfcGFyYW1zCT0gc29jX3BjbV9od19wYXJhbXMsCisJLmh3X2ZyZWUJPSBzb2NfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUJPSBzb2NfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIJPSBzb2NfcGNtX3RyaWdnZXIsCit9OworCisjaWZkZWYgQ09ORklHX1BNCisvKiBwb3dlcnMgZG93biBhdWRpbyBzdWJzeXN0ZW0gZm9yIHN1c3BlbmQgKi8KK3N0YXRpYyBpbnQgc29jX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworIAlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworIAlzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lICptYWNoaW5lID0gc29jZGV2LT5tYWNoaW5lOworIAlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBzb2NkZXYtPnBsYXRmb3JtOworIAlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2UgKmNvZGVjX2RldiA9IHNvY2Rldi0+Y29kZWNfZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisJaW50IGk7CisKKwkvKiBtdXRlIGFueSBhY3RpdmUgREFDJ3MgKi8KKwlmb3IoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmRhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNvZGVjX2RhaTsKKwkJaWYgKGRhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUgJiYgZGFpLT5wbGF5YmFjay5hY3RpdmUpCisJCQlkYWktPmRhaV9vcHMuZGlnaXRhbF9tdXRlKGRhaSwgMSk7CisJfQorCisJaWYgKG1hY2hpbmUtPnN1c3BlbmRfcHJlKQorCQltYWNoaW5lLT5zdXNwZW5kX3ByZShwZGV2LCBzdGF0ZSk7CisKKwlmb3IoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICAqY3B1X2RhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNwdV9kYWk7CisJCWlmIChjcHVfZGFpLT5zdXNwZW5kICYmIGNwdV9kYWktPnR5cGUgIT0gU05EX1NPQ19EQUlfQUM5NykKKwkJCWNwdV9kYWktPnN1c3BlbmQocGRldiwgY3B1X2RhaSk7CisJCWlmIChwbGF0Zm9ybS0+c3VzcGVuZCkKKwkJCXBsYXRmb3JtLT5zdXNwZW5kKHBkZXYsIGNwdV9kYWkpOworCX0KKworCS8qIGNsb3NlIGFueSB3YWl0aW5nIHN0cmVhbXMgYW5kIHNhdmUgc3RhdGUgKi8KKwlydW5fZGVsYXllZF93b3JrKCZzb2NkZXYtPmRlbGF5ZWRfd29yayk7CisJY29kZWMtPnN1c3BlbmRfZGFwbV9zdGF0ZSA9IGNvZGVjLT5kYXBtX3N0YXRlOworCisJZm9yKGkgPSAwOyBpIDwgY29kZWMtPm51bV9kYWk7IGkrKykgeworCQljaGFyICpzdHJlYW0gPSBjb2RlYy0+ZGFpW2ldLnBsYXliYWNrLnN0cmVhbV9uYW1lOworCQlpZiAoc3RyZWFtICE9IE5VTEwpCisJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLCBzdHJlYW0sCisJCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVVNQRU5EKTsKKwkJc3RyZWFtID0gY29kZWMtPmRhaVtpXS5jYXB0dXJlLnN0cmVhbV9uYW1lOworCQlpZiAoc3RyZWFtICE9IE5VTEwpCisJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGNvZGVjLCBzdHJlYW0sCisJCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVVNQRU5EKTsKKwl9CisKKwlpZiAoY29kZWNfZGV2LT5zdXNwZW5kKQorCQljb2RlY19kZXYtPnN1c3BlbmQocGRldiwgc3RhdGUpOworCisJZm9yKGkgPSAwOyBpIDwgbWFjaGluZS0+bnVtX2xpbmtzOyBpKyspIHsKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNwdV9kYWk7CisJCWlmIChjcHVfZGFpLT5zdXNwZW5kICYmIGNwdV9kYWktPnR5cGUgPT0gU05EX1NPQ19EQUlfQUM5NykKKwkJCWNwdV9kYWktPnN1c3BlbmQocGRldiwgY3B1X2RhaSk7CisJfQorCisJaWYgKG1hY2hpbmUtPnN1c3BlbmRfcG9zdCkKKwkJbWFjaGluZS0+c3VzcGVuZF9wb3N0KHBkZXYsIHN0YXRlKTsKKworCXJldHVybiAwOworfQorCisvKiBwb3dlcnMgdXAgYXVkaW8gc3Vic3lzdGVtIGFmdGVyIGEgc3VzcGVuZCAqLworc3RhdGljIGludCBzb2NfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisgCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisgCXN0cnVjdCBzbmRfc29jX21hY2hpbmUgKm1hY2hpbmUgPSBzb2NkZXYtPm1hY2hpbmU7CisgCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNvY2Rldi0+cGxhdGZvcm07CisgCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSAqY29kZWNfZGV2ID0gc29jZGV2LT5jb2RlY19kZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlpbnQgaTsKKworCWlmIChtYWNoaW5lLT5yZXN1bWVfcHJlKQorCQltYWNoaW5lLT5yZXN1bWVfcHJlKHBkZXYpOworCisJZm9yKGkgPSAwOyBpIDwgbWFjaGluZS0+bnVtX2xpbmtzOyBpKyspIHsKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNwdV9kYWk7CisJCWlmIChjcHVfZGFpLT5yZXN1bWUgJiYgY3B1X2RhaS0+dHlwZSA9PSBTTkRfU09DX0RBSV9BQzk3KQorCQkJY3B1X2RhaS0+cmVzdW1lKHBkZXYsIGNwdV9kYWkpOworCX0KKworCWlmIChjb2RlY19kZXYtPnJlc3VtZSkKKwkJY29kZWNfZGV2LT5yZXN1bWUocGRldik7CisKKwlmb3IoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX2RhaTsgaSsrKSB7CisJCWNoYXIqIHN0cmVhbSA9IGNvZGVjLT5kYWlbaV0ucGxheWJhY2suc3RyZWFtX25hbWU7CisJCWlmIChzdHJlYW0gIT0gTlVMTCkKKwkJCXNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQoY29kZWMsIHN0cmVhbSwKKwkJCQlTTkRfU09DX0RBUE1fU1RSRUFNX1JFU1VNRSk7CisJCXN0cmVhbSA9IGNvZGVjLT5kYWlbaV0uY2FwdHVyZS5zdHJlYW1fbmFtZTsKKwkJaWYgKHN0cmVhbSAhPSBOVUxMKQorCQkJc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudChjb2RlYywgc3RyZWFtLAorCQkJCVNORF9TT0NfREFQTV9TVFJFQU1fUkVTVU1FKTsKKwl9CisKKwkvKiB1bm11dGUgYW55IGFjdGl2ZSBEQUMncyAqLworCWZvcihpID0gMDsgaSA8IG1hY2hpbmUtPm51bV9saW5rczsgaSsrKSB7CisJCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqZGFpID0gbWFjaGluZS0+ZGFpX2xpbmtbaV0uY29kZWNfZGFpOworCQlpZiAoZGFpLT5kYWlfb3BzLmRpZ2l0YWxfbXV0ZSAmJiBkYWktPnBsYXliYWNrLmFjdGl2ZSkKKwkJCWRhaS0+ZGFpX29wcy5kaWdpdGFsX211dGUoZGFpLCAwKTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gbWFjaGluZS0+ZGFpX2xpbmtbaV0uY3B1X2RhaTsKKwkJaWYgKGNwdV9kYWktPnJlc3VtZSAmJiBjcHVfZGFpLT50eXBlICE9IFNORF9TT0NfREFJX0FDOTcpCisJCQljcHVfZGFpLT5yZXN1bWUocGRldiwgY3B1X2RhaSk7CisJCWlmIChwbGF0Zm9ybS0+cmVzdW1lKQorCQkJcGxhdGZvcm0tPnJlc3VtZShwZGV2LCBjcHVfZGFpKTsKKwl9CisKKwlpZiAobWFjaGluZS0+cmVzdW1lX3Bvc3QpCisJCW1hY2hpbmUtPnJlc3VtZV9wb3N0KHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIHNvY19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc29jX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworLyogcHJvYmVzIGEgbmV3IHNvY2RldiAqLworc3RhdGljIGludCBzb2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMCwgaTsKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX21hY2hpbmUgKm1hY2hpbmUgPSBzb2NkZXYtPm1hY2hpbmU7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc29jZGV2LT5wbGF0Zm9ybTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kZXZpY2UgKmNvZGVjX2RldiA9IHNvY2Rldi0+Y29kZWNfZGV2OworCisJaWYgKG1hY2hpbmUtPnByb2JlKSB7CisJCXJldCA9IG1hY2hpbmUtPnByb2JlKHBkZXYpOworCQlpZihyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFjaGluZS0+bnVtX2xpbmtzOyBpKyspIHsKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNwdV9kYWk7CisJCWlmIChjcHVfZGFpLT5wcm9iZSkgeworCQkJcmV0ID0gY3B1X2RhaS0+cHJvYmUocGRldik7CisJCQlpZihyZXQgPCAwKQorCQkJCWdvdG8gY3B1X2RhaV9lcnI7CisJCX0KKwl9CisKKwlpZiAoY29kZWNfZGV2LT5wcm9iZSkgeworCQlyZXQgPSBjb2RlY19kZXYtPnByb2JlKHBkZXYpOworCQlpZihyZXQgPCAwKQorCQkJZ290byBjcHVfZGFpX2VycjsKKwl9CisKKwlpZiAocGxhdGZvcm0tPnByb2JlKSB7CisJCXJldCA9IHBsYXRmb3JtLT5wcm9iZShwZGV2KTsKKwkJaWYocmV0IDwgMCkKKwkJCWdvdG8gcGxhdGZvcm1fZXJyOworCX0KKworCS8qIERBUE0gc3RyZWFtIHdvcmsgKi8KKwlJTklUX0RFTEFZRURfV09SSygmc29jZGV2LT5kZWxheWVkX3dvcmssIGNsb3NlX2RlbGF5ZWRfd29yayk7CisJcmV0dXJuIDA7CisKK3BsYXRmb3JtX2VycjoKKwlpZiAoY29kZWNfZGV2LT5yZW1vdmUpCisJCWNvZGVjX2Rldi0+cmVtb3ZlKHBkZXYpOworCitjcHVfZGFpX2VycjoKKwlmb3IgKGktLTsgaSA+PSAwOyBpLS0pIHsKKwkJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSA9IG1hY2hpbmUtPmRhaV9saW5rW2ldLmNwdV9kYWk7CisJCWlmIChjcHVfZGFpLT5yZW1vdmUpCisJCQljcHVfZGFpLT5yZW1vdmUocGRldik7CisJfQorCisJaWYgKG1hY2hpbmUtPnJlbW92ZSkKKwkJbWFjaGluZS0+cmVtb3ZlKHBkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworLyogcmVtb3ZlcyBhIHNvY2RldiAqLworc3RhdGljIGludCBzb2NfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGk7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19tYWNoaW5lICptYWNoaW5lID0gc29jZGV2LT5tYWNoaW5lOworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNvY2Rldi0+cGxhdGZvcm07CisJc3RydWN0IHNuZF9zb2NfY29kZWNfZGV2aWNlICpjb2RlY19kZXYgPSBzb2NkZXYtPmNvZGVjX2RldjsKKworCXJ1bl9kZWxheWVkX3dvcmsoJnNvY2Rldi0+ZGVsYXllZF93b3JrKTsKKworCWlmIChwbGF0Zm9ybS0+cmVtb3ZlKQorCQlwbGF0Zm9ybS0+cmVtb3ZlKHBkZXYpOworCisJaWYgKGNvZGVjX2Rldi0+cmVtb3ZlKQorCQljb2RlY19kZXYtPnJlbW92ZShwZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gbWFjaGluZS0+ZGFpX2xpbmtbaV0uY3B1X2RhaTsKKwkJaWYgKGNwdV9kYWktPnJlbW92ZSkKKwkJCWNwdV9kYWktPnJlbW92ZShwZGV2KTsKKwl9CisKKwlpZiAobWFjaGluZS0+cmVtb3ZlKQorCQltYWNoaW5lLT5yZW1vdmUocGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQVNvQyBwbGF0Zm9ybSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNvY19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJzb2MtYXVkaW8iLAorCX0sCisJLnByb2JlCQk9IHNvY19wcm9iZSwKKwkucmVtb3ZlCQk9IHNvY19yZW1vdmUsCisJLnN1c3BlbmQJPSBzb2Nfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNvY19yZXN1bWUsCit9OworCisvKiBjcmVhdGUgYSBuZXcgcGNtICovCitzdGF0aWMgaW50IHNvY19uZXdfcGNtKHN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2LAorCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluaywgaW50IG51bSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpID0gZGFpX2xpbmstPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpID0gZGFpX2xpbmstPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCWNoYXIgbmV3X25hbWVbNjRdOworCWludCByZXQgPSAwLCBwbGF5YmFjayA9IDAsIGNhcHR1cmUgPSAwOworCisJcnRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocnRkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcnRkLT5kYWkgPSBkYWlfbGluazsKKwlydGQtPnNvY2RldiA9IHNvY2RldjsKKwljb2RlY19kYWktPmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKworCS8qIGNoZWNrIGNsaWVudCBhbmQgaW50ZXJmYWNlIGh3IGNhcGFiaWxpdGllcyAqLworCXNwcmludGYobmV3X25hbWUsICIlcyAlcy0lcy0lZCIsZGFpX2xpbmstPnN0cmVhbV9uYW1lLCBjb2RlY19kYWktPm5hbWUsCisJCWdldF9kYWlfbmFtZShjcHVfZGFpLT50eXBlKSwgbnVtKTsKKworCWlmIChjb2RlY19kYWktPnBsYXliYWNrLmNoYW5uZWxzX21pbikKKwkJcGxheWJhY2sgPSAxOworCWlmIChjb2RlY19kYWktPmNhcHR1cmUuY2hhbm5lbHNfbWluKQorCQljYXB0dXJlID0gMTsKKworCXJldCA9IHNuZF9wY21fbmV3KGNvZGVjLT5jYXJkLCBuZXdfbmFtZSwgY29kZWMtPnBjbV9kZXZzKyssIHBsYXliYWNrLAorCQljYXB0dXJlLCAmcGNtKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNhbid0IGNyZWF0ZSBwY20gZm9yIGNvZGVjICVzXG4iLCBjb2RlYy0+bmFtZSk7CisJCWtmcmVlKHJ0ZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcGNtLT5wcml2YXRlX2RhdGEgPSBydGQ7CisJc29jX3BjbV9vcHMubW1hcCA9IHNvY2Rldi0+cGxhdGZvcm0tPnBjbV9vcHMtPm1tYXA7CisJc29jX3BjbV9vcHMucG9pbnRlciA9IHNvY2Rldi0+cGxhdGZvcm0tPnBjbV9vcHMtPnBvaW50ZXI7CisJc29jX3BjbV9vcHMuaW9jdGwgPSBzb2NkZXYtPnBsYXRmb3JtLT5wY21fb3BzLT5pb2N0bDsKKwlzb2NfcGNtX29wcy5jb3B5ID0gc29jZGV2LT5wbGF0Zm9ybS0+cGNtX29wcy0+Y29weTsKKwlzb2NfcGNtX29wcy5zaWxlbmNlID0gc29jZGV2LT5wbGF0Zm9ybS0+cGNtX29wcy0+c2lsZW5jZTsKKwlzb2NfcGNtX29wcy5hY2sgPSBzb2NkZXYtPnBsYXRmb3JtLT5wY21fb3BzLT5hY2s7CisJc29jX3BjbV9vcHMucGFnZSA9IHNvY2Rldi0+cGxhdGZvcm0tPnBjbV9vcHMtPnBhZ2U7CisKKwlpZiAocGxheWJhY2spCisJCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzb2NfcGNtX29wcyk7CisKKwlpZiAoY2FwdHVyZSkKKwkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc29jX3BjbV9vcHMpOworCisJcmV0ID0gc29jZGV2LT5wbGF0Zm9ybS0+cGNtX25ldyhjb2RlYy0+Y2FyZCwgY29kZWNfZGFpLCBwY20pOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogcGxhdGZvcm0gcGNtIGNvbnN0cnVjdG9yIGZhaWxlZFxuIik7CisJCWtmcmVlKHJ0ZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzb2NkZXYtPnBsYXRmb3JtLT5wY21fZnJlZTsKKwlwcmludGsoS0VSTl9JTkZPICJhc29jOiAlcyA8LT4gJXMgbWFwcGluZyBva1xuIiwgY29kZWNfZGFpLT5uYW1lLAorCQljcHVfZGFpLT5uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBjb2RlYyByZWdpc3RlciBkdW1wICovCitzdGF0aWMgc3NpemVfdCBjb2RlY19yZWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKmRldmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkZXZkYXRhLT5jb2RlYzsKKwlpbnQgaSwgc3RlcCA9IDEsIGNvdW50ID0gMDsKKworCWlmICghY29kZWMtPnJlZ19jYWNoZV9zaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChjb2RlYy0+cmVnX2NhY2hlX3N0ZXApCisJCXN0ZXAgPSBjb2RlYy0+cmVnX2NhY2hlX3N0ZXA7CisKKwljb3VudCArPSBzcHJpbnRmKGJ1ZiwgIiVzIHJlZ2lzdGVyc1xuIiwgY29kZWMtPm5hbWUpOworCWZvcihpID0gMDsgaSA8IGNvZGVjLT5yZWdfY2FjaGVfc2l6ZTsgaSArPSBzdGVwKQorCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJTJ4OiAlNHhcbiIsIGksIGNvZGVjLT5yZWFkKGNvZGVjLCBpKSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY29kZWNfcmVnLCAwNDQ0LCBjb2RlY19yZWdfc2hvdywgTlVMTCk7CisKKy8qKgorICogc25kX3NvY19uZXdfYWM5N19jb2RlYyAtIGluaXRhaWxpc2UgQUM5NyBkZXZpY2UKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqIEBvcHM6IEFDOTcgYnVzIG9wZXJhdGlvbnMKKyAqIEBudW06IEFDOTcgY29kZWMgbnVtYmVyCisgKgorICogSW5pdGlhbGlzZXMgQUM5NyBjb2RlYyByZXNvdXJjZXMgZm9yIHVzZSBieSBhZC1ob2MgZGV2aWNlcyBvbmx5LgorICovCitpbnQgc25kX3NvY19uZXdfYWM5N19jb2RlYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgKm9wcywgaW50IG51bSkKK3sKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJY29kZWMtPmFjOTcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX2FjOTcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29kZWMtPmFjOTcgPT0gTlVMTCkgeworCQltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNvZGVjLT5hYzk3LT5idXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX2FjOTdfYnVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNvZGVjLT5hYzk3LT5idXMgPT0gTlVMTCkgeworCQlrZnJlZShjb2RlYy0+YWM5Nyk7CisJCWNvZGVjLT5hYzk3ID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljb2RlYy0+YWM5Ny0+YnVzLT5vcHMgPSBvcHM7CisJY29kZWMtPmFjOTctPm51bSA9IG51bTsKKwltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX25ld19hYzk3X2NvZGVjKTsKKworLyoqCisgKiBzbmRfc29jX2ZyZWVfYWM5N19jb2RlYyAtIGZyZWUgQUM5NyBjb2RlYyBkZXZpY2UKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqCisgKiBGcmVlcyBBQzk3IGNvZGVjIGRldmljZSByZXNvdXJjZXMuCisgKi8KK3ZvaWQgc25kX3NvY19mcmVlX2FjOTdfY29kZWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CisJa2ZyZWUoY29kZWMtPmFjOTctPmJ1cyk7CisJa2ZyZWUoY29kZWMtPmFjOTcpOworCWNvZGVjLT5hYzk3ID0gTlVMTDsKKwltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2ZyZWVfYWM5N19jb2RlYyk7CisKKy8qKgorICogc25kX3NvY191cGRhdGVfYml0cyAtIHVwZGF0ZSBjb2RlYyByZWdpc3RlciBiaXRzCisgKiBAY29kZWM6IGF1ZGlvIGNvZGVjCisgKiBAcmVnOiBjb2RlYyByZWdpc3RlcgorICogQG1hc2s6IHJlZ2lzdGVyIG1hc2sKKyAqIEB2YWx1ZTogbmV3IHZhbHVlCisgKgorICogV3JpdGVzIG5ldyByZWdpc3RlciB2YWx1ZS4KKyAqCisgKiBSZXR1cm5zIDEgZm9yIGNoYW5nZSBlbHNlIDAuCisgKi8KK2ludCBzbmRfc29jX3VwZGF0ZV9iaXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJCXVuc2lnbmVkIHNob3J0IG1hc2ssIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgc2hvcnQgb2xkLCBuZXc7CisKKwltdXRleF9sb2NrKCZpb19tdXRleCk7CisJb2xkID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcpOworCW5ldyA9IChvbGQgJiB+bWFzaykgfCB2YWx1ZTsKKwljaGFuZ2UgPSBvbGQgIT0gbmV3OworCWlmIChjaGFuZ2UpCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZywgbmV3KTsKKworCW11dGV4X3VubG9jaygmaW9fbXV0ZXgpOworCXJldHVybiBjaGFuZ2U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3VwZGF0ZV9iaXRzKTsKKworLyoqCisgKiBzbmRfc29jX3Rlc3RfYml0cyAtIHRlc3QgcmVnaXN0ZXIgZm9yIGNoYW5nZQorICogQGNvZGVjOiBhdWRpbyBjb2RlYworICogQHJlZzogY29kZWMgcmVnaXN0ZXIKKyAqIEBtYXNrOiByZWdpc3RlciBtYXNrCisgKiBAdmFsdWU6IG5ldyB2YWx1ZQorICoKKyAqIFRlc3RzIGEgcmVnaXN0ZXIgd2l0aCBhIG5ldyB2YWx1ZSBhbmQgY2hlY2tzIGlmIHRoZSBuZXcgdmFsdWUgaXMKKyAqIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgdmFsdWUuCisgKgorICogUmV0dXJucyAxIGZvciBjaGFuZ2UgZWxzZSAwLgorICovCitpbnQgc25kX3NvY190ZXN0X2JpdHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJdW5zaWduZWQgc2hvcnQgbWFzaywgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJaW50IGNoYW5nZTsKKwl1bnNpZ25lZCBzaG9ydCBvbGQsIG5ldzsKKworCW11dGV4X2xvY2soJmlvX211dGV4KTsKKwlvbGQgPSBzbmRfc29jX3JlYWQoY29kZWMsIHJlZyk7CisJbmV3ID0gKG9sZCAmIH5tYXNrKSB8IHZhbHVlOworCWNoYW5nZSA9IG9sZCAhPSBuZXc7CisJbXV0ZXhfdW5sb2NrKCZpb19tdXRleCk7CisKKwlyZXR1cm4gY2hhbmdlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY190ZXN0X2JpdHMpOworCisvKioKKyAqIHNuZF9zb2NfbmV3X3BjbXMgLSBjcmVhdGUgbmV3IHNvdW5kIGNhcmQgYW5kIHBjbXMKKyAqIEBzb2NkZXY6IHRoZSBTb0MgYXVkaW8gZGV2aWNlCisgKgorICogQ3JlYXRlIGEgbmV3IHNvdW5kIGNhcmQgYmFzZWQgdXBvbiB0aGUgY29kZWMgYW5kIGludGVyZmFjZSBwY21zLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSBlcnJvci4KKyAqLworaW50IHNuZF9zb2NfbmV3X3BjbXMoc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYsIGludCBpZHgsIGNvbnN0IGNoYXIgKnhpZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX21hY2hpbmUgKm1hY2hpbmUgPSBzb2NkZXYtPm1hY2hpbmU7CisJaW50IHJldCA9IDAsIGk7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJLyogcmVnaXN0ZXIgYSBzb3VuZCBjYXJkICovCisJY29kZWMtPmNhcmQgPSBzbmRfY2FyZF9uZXcoaWR4LCB4aWQsIGNvZGVjLT5vd25lciwgMCk7CisJaWYgKCFjb2RlYy0+Y2FyZCkgeworCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNhbid0IGNyZWF0ZSBzb3VuZCBjYXJkIGZvciBjb2RlYyAlc1xuIiwKKwkJCWNvZGVjLT5uYW1lKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljb2RlYy0+Y2FyZC0+ZGV2ID0gc29jZGV2LT5kZXY7CisJY29kZWMtPmNhcmQtPnByaXZhdGVfZGF0YSA9IGNvZGVjOworCXN0cm5jcHkoY29kZWMtPmNhcmQtPmRyaXZlciwgY29kZWMtPm5hbWUsIHNpemVvZihjb2RlYy0+Y2FyZC0+ZHJpdmVyKSk7CisKKwkvKiBjcmVhdGUgdGhlIHBjbXMgKi8KKwlmb3IoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlyZXQgPSBzb2NfbmV3X3BjbShzb2NkZXYsICZtYWNoaW5lLT5kYWlfbGlua1tpXSwgaSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGNhbid0IGNyZWF0ZSBwY20gJXNcbiIsCisJCQkJbWFjaGluZS0+ZGFpX2xpbmtbaV0uc3RyZWFtX25hbWUpOworCQkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmY29kZWMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19uZXdfcGNtcyk7CisKKy8qKgorICogc25kX3NvY19yZWdpc3Rlcl9jYXJkIC0gcmVnaXN0ZXIgc291bmQgY2FyZAorICogQHNvY2RldjogdGhlIFNvQyBhdWRpbyBkZXZpY2UKKyAqCisgKiBSZWdpc3RlciBhIFNvQyBzb3VuZCBjYXJkLiBBbHNvIHJlZ2lzdGVycyBhbiBBQzk3IGRldmljZSBpZiB0aGUKKyAqIGNvZGVjIGlzIEFDOTcgZm9yIGFkIGhvYyBkZXZpY2VzLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSBlcnJvci4KKyAqLworaW50IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX21hY2hpbmUgKm1hY2hpbmUgPSBzb2NkZXYtPm1hY2hpbmU7CisJaW50IHJldCA9IDAsIGksIGFjOTcgPSAwLCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmY29kZWMtPm11dGV4KTsKKwlmb3IoaSA9IDA7IGkgPCBtYWNoaW5lLT5udW1fbGlua3M7IGkrKykgeworCQlpZiAoc29jZGV2LT5tYWNoaW5lLT5kYWlfbGlua1tpXS5pbml0KSB7CisJCQllcnIgPSBzb2NkZXYtPm1hY2hpbmUtPmRhaV9saW5rW2ldLmluaXQoY29kZWMpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGZhaWxlZCB0byBpbml0ICVzXG4iLAorCQkJCQlzb2NkZXYtPm1hY2hpbmUtPmRhaV9saW5rW2ldLnN0cmVhbV9uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAoc29jZGV2LT5tYWNoaW5lLT5kYWlfbGlua1tpXS5jcHVfZGFpLT50eXBlID09IFNORF9TT0NfREFJX0FDOTcpCisJCQlhYzk3ID0gMTsKKwl9CisJc25wcmludGYoY29kZWMtPmNhcmQtPnNob3J0bmFtZSwgc2l6ZW9mKGNvZGVjLT5jYXJkLT5zaG9ydG5hbWUpLAorCQkgIiVzIiwgbWFjaGluZS0+bmFtZSk7CisJc25wcmludGYoY29kZWMtPmNhcmQtPmxvbmduYW1lLCBzaXplb2YoY29kZWMtPmNhcmQtPmxvbmduYW1lKSwKKwkJICIlcyAoJXMpIiwgbWFjaGluZS0+bmFtZSwgY29kZWMtPm5hbWUpOworCisJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY29kZWMtPmNhcmQpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogZmFpbGVkIHRvIHJlZ2lzdGVyIHNvdW5kY2FyZCBmb3IgY29kZWMgJXNcbiIsCisJCQkJY29kZWMtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU05EX1NPQ19BQzk3X0JVUworCWlmIChhYzk3KSB7CisJCXJldCA9IHNvY19hYzk3X2Rldl9yZWdpc3Rlcihjb2RlYyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IEFDOTcgZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCQlzbmRfY2FyZF9mcmVlKGNvZGVjLT5jYXJkKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorI2VuZGlmCisKKwllcnIgPSBzbmRfc29jX2RhcG1fc3lzX2FkZChzb2NkZXYtPmRldik7CisJaWYgKGVyciA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFzb2M6IGZhaWxlZCB0byBhZGQgZGFwbSBzeXNmcyBlbnRyaWVzXG4iKTsKKworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShzb2NkZXYtPmRldiwgJmRldl9hdHRyX2NvZGVjX3JlZyk7CisJaWYgKGVyciA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFzb2M6IGZhaWxlZCB0byBhZGQgY29kZWMgc3lzZnMgZW50cmllc1xuIik7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3JlZ2lzdGVyX2NhcmQpOworCisvKioKKyAqIHNuZF9zb2NfZnJlZV9wY21zIC0gZnJlZSBzb3VuZCBjYXJkIGFuZCBwY21zCisgKiBAc29jZGV2OiB0aGUgU29DIGF1ZGlvIGRldmljZQorICoKKyAqIEZyZWVzIHNvdW5kIGNhcmQgYW5kIHBjbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2NkZXYuCisgKiBBbHNvIHVucmVnaXN0ZXIgdGhlIGNvZGVjIGlmIGl0IGlzIGFuIEFDOTcgZGV2aWNlLgorICovCit2b2lkIHNuZF9zb2NfZnJlZV9wY21zKHN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworI2lmZGVmIENPTkZJR19TTkRfU09DX0FDOTdfQlVTCisJaWYgKGNvZGVjLT5hYzk3KQorCQlzb2NfYWM5N19kZXZfdW5yZWdpc3Rlcihjb2RlYyk7CisjZW5kaWYKKworCWlmIChjb2RlYy0+Y2FyZCkKKwkJc25kX2NhcmRfZnJlZShjb2RlYy0+Y2FyZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKHNvY2Rldi0+ZGV2LCAmZGV2X2F0dHJfY29kZWNfcmVnKTsKKwltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2ZyZWVfcGNtcyk7CisKKy8qKgorICogc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyAtIHNldCB0aGUgcnVudGltZSBoYXJkd2FyZSBwYXJhbWV0ZXJzCisgKiBAc3Vic3RyZWFtOiB0aGUgcGNtIHN1YnN0cmVhbQorICogQGh3OiB0aGUgaGFyZHdhcmUgcGFyYW1ldGVycworICoKKyAqIFNldHMgdGhlIHN1YnN0cmVhbSBydW50aW1lIGhhcmR3YXJlIHBhcmFtZXRlcnMuCisgKi8KK2ludCBzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCWNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlICpodykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXJ1bnRpbWUtPmh3LmluZm8gPSBody0+aW5mbzsKKwlydW50aW1lLT5ody5mb3JtYXRzID0gaHctPmZvcm1hdHM7CisJcnVudGltZS0+aHcucGVyaW9kX2J5dGVzX21pbiA9IGh3LT5wZXJpb2RfYnl0ZXNfbWluOworCXJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19tYXggPSBody0+cGVyaW9kX2J5dGVzX21heDsKKwlydW50aW1lLT5ody5wZXJpb2RzX21pbiA9IGh3LT5wZXJpb2RzX21pbjsKKwlydW50aW1lLT5ody5wZXJpb2RzX21heCA9IGh3LT5wZXJpb2RzX21heDsKKwlydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4ID0gaHctPmJ1ZmZlcl9ieXRlc19tYXg7CisJcnVudGltZS0+aHcuZmlmb19zaXplID0gaHctPmZpZm9fc2l6ZTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMpOworCisvKioKKyAqIHNuZF9zb2NfY25ldyAtIGNyZWF0ZSBuZXcgY29udHJvbAorICogQF90ZW1wbGF0ZTogY29udHJvbCB0ZW1wbGF0ZQorICogQGRhdGE6IGNvbnRyb2wgcHJpdmF0ZSBkYXRhCisgKiBAbG5uZ19uYW1lOiBjb250cm9sIGxvbmcgbmFtZQorICoKKyAqIENyZWF0ZSBhIG5ldyBtaXhlciBjb250cm9sIGZyb20gYSB0ZW1wbGF0ZSBjb250cm9sLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSBlcnJvci4KKyAqLworc3RydWN0IHNuZF9rY29udHJvbCAqc25kX3NvY19jbmV3KGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpfdGVtcGxhdGUsCisJdm9pZCAqZGF0YSwgY2hhciAqbG9uZ19uYW1lKQoreworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlbXBsYXRlOworCisJbWVtY3B5KCZ0ZW1wbGF0ZSwgX3RlbXBsYXRlLCBzaXplb2YodGVtcGxhdGUpKTsKKwlpZiAobG9uZ19uYW1lKQorCQl0ZW1wbGF0ZS5uYW1lID0gbG9uZ19uYW1lOworCXRlbXBsYXRlLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEU7CisJdGVtcGxhdGUuaW5kZXggPSAwOworCisJcmV0dXJuIHNuZF9jdGxfbmV3MSgmdGVtcGxhdGUsIGRhdGEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19jbmV3KTsKKworLyoqCisgKiBzbmRfc29jX2luZm9fZW51bV9kb3VibGUgLSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBpbmZvIGNhbGxiYWNrCisgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKKyAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKgorICogQ2FsbGJhY2sgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBhIGRvdWJsZSBlbnVtZXJhdGVkCisgKiBtaXhlciBjb250cm9sLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IGUtPnNoaWZ0X2wgPT0gZS0+c2hpZnRfciA/IDEgOiAyOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gZS0+bWFzazsKKworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gZS0+bWFzayAtIDEpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBlLT5tYXNrIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkJZS0+dGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX2VudW1fZG91YmxlKTsKKworLyoqCisgKiBzbmRfc29jX2dldF9lbnVtX2RvdWJsZSAtIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGdldCBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBkb3VibGUgZW51bWVyYXRlZCBtaXhlci4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2dldF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHZhbCwgYml0bWFzazsKKworCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCQk7CisJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBlLT5yZWcpOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAodmFsID4+IGUtPnNoaWZ0X2wpICYgKGJpdG1hc2sgLSAxKTsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0KKwkJCSh2YWwgPj4gZS0+c2hpZnRfcikgJiAoYml0bWFzayAtIDEpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2dldF9lbnVtX2RvdWJsZSk7CisKKy8qKgorICogc25kX3NvY19wdXRfZW51bV9kb3VibGUgLSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBwdXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIGVudW1lcmF0ZWQgbWl4ZXIuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19wdXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJdW5zaWduZWQgc2hvcnQgbWFzaywgYml0bWFzazsKKworCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCQk7CisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXNrIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCBlLT5zaGlmdF9sOworCW1hc2sgPSAoYml0bWFzayAtIDEpIDw8IGUtPnNoaWZ0X2w7CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1hc2sgLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCB8PSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IGUtPnNoaWZ0X3I7CisJCW1hc2sgfD0gKGJpdG1hc2sgLSAxKSA8PCBlLT5zaGlmdF9yOworCX0KKworCXJldHVybiBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF9lbnVtX2RvdWJsZSk7CisKKy8qKgorICogc25kX3NvY19pbmZvX2VudW1fZXh0IC0gZXh0ZXJuYWwgZW51bWVyYXRlZCBzaW5nbGUgbWl4ZXIgaW5mbyBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXh0ZXJuYWwgZW51bWVyYXRlZAorICogc2luZ2xlIG1peGVyLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfaW5mb19lbnVtX2V4dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBlLT5tYXNrOworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiBlLT5tYXNrIC0gMSkKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IGUtPm1hc2sgLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCQllLT50ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2luZm9fZW51bV9leHQpOworCisvKioKKyAqIHNuZF9zb2NfaW5mb192b2xzd19leHQgLSBleHRlcm5hbCBzaW5nbGUgbWl4ZXIgaW5mbyBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZXh0ZXJuYWwgbWl4ZXIgY29udHJvbC4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2luZm9fdm9sc3dfZXh0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJaW50IG1hc2sgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXVpbmZvLT50eXBlID0KKwkJbWFzayA9PSAxID8gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIDogU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZvbHN3X2V4dCk7CisKKy8qKgorICogc25kX3NvY19pbmZvX2Jvb2xfZXh0IC0gZXh0ZXJuYWwgc2luZ2xlIGJvb2xlYW4gbWl4ZXIgaW5mbyBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgYm9vbGVhbiBleHRlcm5hbCBtaXhlciBjb250cm9sLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfaW5mb19ib29sX2V4dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX2Jvb2xfZXh0KTsKKworLyoqCisgKiBzbmRfc29jX2luZm9fdm9sc3cgLSBzaW5nbGUgbWl4ZXIgaW5mbyBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgbWl4ZXIgY29udHJvbC4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2luZm9fdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlpbnQgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOworCisJdWluZm8tPnR5cGUgPQorCQltYXNrID09IDEgPyBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gOiBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gc2hpZnQgPT0gcnNoaWZ0ID8gMSA6IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZvbHN3KTsKKworLyoqCisgKiBzbmRfc29jX2dldF92b2xzdyAtIHNpbmdsZSBtaXhlciBnZXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIG1peGVyIGNvbnRyb2wuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19nZXRfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKKwlpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4MDE7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKKwlpZiAoc2hpZnQgIT0gcnNoaWZ0KQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9CisJCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcpID4+IHJzaGlmdCkgJiBtYXNrOworCWlmIChpbnZlcnQpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkJbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQlpZiAoc2hpZnQgIT0gcnNoaWZ0KQorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQkJCW1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZ2V0X3ZvbHN3KTsKKworLyoqCisgKiBzbmRfc29jX3B1dF92b2xzdyAtIHNpbmdsZSBtaXhlciBwdXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIG1peGVyIGNvbnRyb2wuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19wdXRfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKKwlpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4MDE7CisJaW50IGVycjsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIHZhbDIsIHZhbF9tYXNrOworCisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CisJaWYgKGludmVydCkKKwkJdmFsID0gbWFzayAtIHZhbDsKKwl2YWxfbWFzayA9IG1hc2sgPDwgc2hpZnQ7CisJdmFsID0gdmFsIDw8IHNoaWZ0OworCWlmIChzaGlmdCAhPSByc2hpZnQpIHsKKwkJdmFsMiA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIG1hc2spOworCQlpZiAoaW52ZXJ0KQorCQkJdmFsMiA9IG1hc2sgLSB2YWwyOworCQl2YWxfbWFzayB8PSBtYXNrIDw8IHJzaGlmdDsKKwkJdmFsIHw9IHZhbDIgPDwgcnNoaWZ0OworCX0KKwllcnIgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsIHZhbF9tYXNrLCB2YWwpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92b2xzdyk7CisKKy8qKgorICogc25kX3NvY19pbmZvX3ZvbHN3XzJyIC0gZG91YmxlIG1peGVyIGluZm8gY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdAorICogc3BhbnMgMiBjb2RlYyByZWdpc3RlcnMuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19pbmZvX3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTIpICYgMHhmZjsKKworCXVpbmZvLT50eXBlID0KKwkJbWFzayA9PSAxID8gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOIDogU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBtYXNrOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZvbHN3XzJyKTsKKworLyoqCisgKiBzbmRfc29jX2dldF92b2xzd18yciAtIGRvdWJsZSBtaXhlciBnZXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdCBzcGFucyAyIHJlZ2lzdGVycy4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2dldF92b2xzd18ycihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmVnMiA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTIpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDIwKSAmIDB4MDE7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9CisJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZzIpID4+IHNoaWZ0KSAmIG1hc2s7CisJaWYgKGludmVydCkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCQltYXNrIC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KKwkJCW1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZ2V0X3ZvbHN3XzJyKTsKKworLyoqCisgKiBzbmRfc29jX3B1dF92b2xzd18yciAtIGRvdWJsZSBtaXhlciBzZXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdCBzcGFucyAyIHJlZ2lzdGVycy4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX3B1dF92b2xzd18ycihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHJlZyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZjsKKwlpbnQgcmVnMiA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTIpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDIwKSAmIDB4MDE7CisJaW50IGVycjsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIHZhbDIsIHZhbF9tYXNrOworCisJdmFsX21hc2sgPSBtYXNrIDw8IHNoaWZ0OworCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2spOworCXZhbDIgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiBtYXNrKTsKKworCWlmIChpbnZlcnQpIHsKKwkJdmFsID0gbWFzayAtIHZhbDsKKwkJdmFsMiA9IG1hc2sgLSB2YWwyOworCX0KKworCXZhbCA9IHZhbCA8PCBzaGlmdDsKKwl2YWwyID0gdmFsMiA8PCBzaGlmdDsKKworCWlmICgoZXJyID0gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCB2YWxfbWFzaywgdmFsKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnMiwgdmFsX21hc2ssIHZhbDIpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92b2xzd18ycik7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9zb2NfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkFTb0MgdmVyc2lvbiAlc1xuIiwgU05EX1NPQ19WRVJTSU9OKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzb2NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgc25kX3NvY19leGl0KHZvaWQpCit7CisgCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzb2NfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc25kX3NvY19pbml0KTsKK21vZHVsZV9leGl0KHNuZF9zb2NfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tLCB3d3cud29sZnNvbm1pY3JvLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBDb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWRhcG0uYyBiL3NvdW5kL3NvYy9zb2MtZGFwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWY4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtMCwwICsxLDEzMjMgQEAKKy8qCisgKiBzb2MtZGFwbS5jICAtLSAgQUxTQSBTb0MgRHluYW1pYyBBdWRpbyBQb3dlciBNYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZAorICogICAgICAgICBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAxMnRoIEF1ZyAyMDA1ICAgSW5pdGlhbCB2ZXJzaW9uLgorICogICAgMjV0aCBPY3QgMjAwNSAgIEltcGxlbWVudGVkIHBhdGggcG93ZXIgZG9tYWluLgorICogICAgMTh0aCBEZWMgMjAwNSAgIEltcGxlbWVudGVkIG1hY2hpbmUgYW5kIHN0cmVhbSBsZXZlbCBwb3dlciBkb21haW4uCisgKgorICogIEZlYXR1cmVzOgorICogICAgbyBDaGFuZ2VzIHBvd2VyIHN0YXR1cyBvZiBpbnRlcm5hbCBjb2RlYyBibG9ja3MgZGVwZW5kaW5nIG9uIHRoZQorICogICAgICBkeW5hbWljIGNvbmZpZ3VyYXRpb24gb2YgY29kZWMgaW50ZXJuYWwgYXVkaW8gcGF0aHMgYW5kIGFjdGl2ZQorICogICAgICBEQUMncy9BREMncy4KKyAqICAgIG8gUGxhdGZvcm0gcG93ZXIgZG9tYWluIC0gY2FuIHN1cHBvcnQgZXh0ZXJuYWwgY29tcG9uZW50cyBpLmUuIGFtcHMgYW5kCisgKiAgICAgIG1pYy9tZWFkcGhvbmUgaW5zZXJ0aW9uIGV2ZW50cy4KKyAqICAgIG8gQXV0b21hdGljIE1pYyBCaWFzIHN1cHBvcnQKKyAqICAgIG8gSmFjayBpbnNlcnRpb24gcG93ZXIgZXZlbnQgaW5pdGlhdGlvbiAtIGUuZy4gaHAgaW5zZXJ0aW9uIHdpbGwgZW5hYmxlCisgKiAgICAgIHNpbmtzLCBkYWNzLCBldGMKKyAqICAgIG8gRGVsYXllZCBwb3dlcmRvd24gb2YgYXVkaW8gc3VzYnN5dGVtIHRvIHJlZHVjZSBwb3BzIGJldHdlZW4gYSBxdWljaworICogICAgICBkZXZpY2UgcmVvcGVuLgorICoKKyAqICBUb2RvOgorICogICAgbyBEQVBNIHBvd2VyIGNoYW5nZSBzZXF1ZW5jaW5nIC0gYWxsb3cgZm9yIGNvbmZpZ3VyYWJsZSBwZXIKKyAqICAgICAgY29kZWMgc2VxdWVuY2VzLgorICogICAgbyBTdXBwb3J0IGZvciBhbmFsb2d1ZSBiaWFzIG9wdGltaXNhdGlvbi4KKyAqICAgIG8gU3VwcG9ydCBmb3IgcmVkdWNlZCBjb2RlYyBvdmVyc2FtcGxpbmcgcmF0ZXMuCisgKiAgICBvIFN1cHBvcnQgZm9yIHJlZHVjZWQgY29kZWMgYmlhcyBjdXJyZW50cy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorCisvKiBkZWJ1ZyAqLworI2RlZmluZSBEQVBNX0RFQlVHIDAKKyNpZiBEQVBNX0RFQlVHCisjZGVmaW5lIGR1bXBfZGFwbShjb2RlYywgYWN0aW9uKSBkYmdfZHVtcF9kYXBtKGNvZGVjLCBhY3Rpb24pCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKGZvcm1hdCwgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgZHVtcF9kYXBtKGNvZGVjLCBhY3Rpb24pCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikKKyNlbmRpZgorCisjZGVmaW5lIFBPUF9ERUJVRyAwCisjaWYgUE9QX0RFQlVHCisjZGVmaW5lIFBPUF9USU1FIDUwMCAvKiA1MDAgbXNlY3MgLSBjaGFuZ2UgaWYgcG9wIGRlYnVnIGlzIHRvbyBmYXN0ICovCisjZGVmaW5lIHBvcF93YWl0KHRpbWUpIHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKHRpbWUpKQorI2RlZmluZSBwb3BfZGJnKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoZm9ybWF0LCAjIyBhcmcpOyBwb3Bfd2FpdChQT1BfVElNRSkKKyNlbHNlCisjZGVmaW5lIHBvcF9kYmcoZm9ybWF0LCBhcmcuLi4pCisjZGVmaW5lIHBvcF93YWl0KHRpbWUpCisjZW5kaWYKKworLyogZGFwbSBwb3dlciBzZXF1ZW5jZXMgLSBtYWtlIHRoaXMgcGVyIGNvZGVjIGluIHRoZSBmdXR1cmUgKi8KK3N0YXRpYyBpbnQgZGFwbV91cF9zZXFbXSA9IHsKKwlzbmRfc29jX2RhcG1fcHJlLCBzbmRfc29jX2RhcG1fbWljYmlhcywgc25kX3NvY19kYXBtX21pYywKKwlzbmRfc29jX2RhcG1fbXV4LCBzbmRfc29jX2RhcG1fZGFjLCBzbmRfc29jX2RhcG1fbWl4ZXIsIHNuZF9zb2NfZGFwbV9wZ2EsCisJc25kX3NvY19kYXBtX2FkYywgc25kX3NvY19kYXBtX2hwLCBzbmRfc29jX2RhcG1fc3BrLCBzbmRfc29jX2RhcG1fcG9zdAorfTsKK3N0YXRpYyBpbnQgZGFwbV9kb3duX3NlcVtdID0geworCXNuZF9zb2NfZGFwbV9wcmUsIHNuZF9zb2NfZGFwbV9hZGMsIHNuZF9zb2NfZGFwbV9ocCwgc25kX3NvY19kYXBtX3NwaywKKwlzbmRfc29jX2RhcG1fcGdhLCBzbmRfc29jX2RhcG1fbWl4ZXIsIHNuZF9zb2NfZGFwbV9kYWMsIHNuZF9zb2NfZGFwbV9taWMsCisJc25kX3NvY19kYXBtX21pY2JpYXMsIHNuZF9zb2NfZGFwbV9tdXgsIHNuZF9zb2NfZGFwbV9wb3N0Cit9OworCitzdGF0aWMgaW50IGRhcG1fc3RhdHVzID0gMTsKK21vZHVsZV9wYXJhbShkYXBtX3N0YXR1cywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGFwbV9zdGF0dXMsICJlbmFibGUgRFBNIHN5c2ZzIGVudHJpZXMiKTsKKworLyogY3JlYXRlIGEgbmV3IGRhcG0gd2lkZ2V0ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkYXBtX2NuZXdfd2lkZ2V0KAorCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpfd2lkZ2V0KQoreworCXJldHVybiBrbWVtZHVwKF93aWRnZXQsIHNpemVvZigqX3dpZGdldCksIEdGUF9LRVJORUwpOworfQorCisvKiBzZXQgdXAgaW5pdGlhbCBjb2RlYyBwYXRocyAqLworc3RhdGljIHZvaWQgZGFwbV9zZXRfcGF0aF9zdGF0dXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwLCBpbnQgaSkKK3sKKwlzd2l0Y2ggKHctPmlkKSB7CisJY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgorCWNhc2Ugc25kX3NvY19kYXBtX21peGVyOiB7CisJCWludCB2YWw7CisJCWludCByZWcgPSB3LT5rY29udHJvbHNbaV0ucHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJCWludCBzaGlmdCA9ICh3LT5rY29udHJvbHNbaV0ucHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJCWludCBtYXNrID0gKHctPmtjb250cm9sc1tpXS5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJCWludCBpbnZlcnQgPSAody0+a2NvbnRyb2xzW2ldLnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHgwMTsKKworCQl2YWwgPSBzbmRfc29jX3JlYWQody0+Y29kZWMsIHJlZyk7CisJCXZhbCA9ICh2YWwgPj4gc2hpZnQpICYgbWFzazsKKworCQlpZiAoKGludmVydCAmJiAhdmFsKSB8fCAoIWludmVydCAmJiB2YWwpKQorCQkJcC0+Y29ubmVjdCA9IDE7CisJCWVsc2UKKwkJCXAtPmNvbm5lY3QgPSAwOworCX0KKwlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9tdXg6IHsKKwkJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKXctPmtjb250cm9sc1tpXS5wcml2YXRlX3ZhbHVlOworCQlpbnQgdmFsLCBpdGVtLCBiaXRtYXNrOworCisJCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCQk7CisJCXZhbCA9IHNuZF9zb2NfcmVhZCh3LT5jb2RlYywgZS0+cmVnKTsKKwkJaXRlbSA9ICh2YWwgPj4gZS0+c2hpZnRfbCkgJiAoYml0bWFzayAtIDEpOworCisJCXAtPmNvbm5lY3QgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgZS0+bWFzazsgaSsrKSB7CisJCQlpZiAoIShzdHJjbXAocC0+bmFtZSwgZS0+dGV4dHNbaV0pKSAmJiBpdGVtID09IGkpCisJCQkJcC0+Y29ubmVjdCA9IDE7CisJCX0KKwl9CisJYnJlYWs7CisJLyogZG9lcyBub3QgZWZmZWN0IHJvdXRpbmcgLSBhbHdheXMgY29ubmVjdGVkICovCisJY2FzZSBzbmRfc29jX2RhcG1fcGdhOgorCWNhc2Ugc25kX3NvY19kYXBtX291dHB1dDoKKwljYXNlIHNuZF9zb2NfZGFwbV9hZGM6CisJY2FzZSBzbmRfc29jX2RhcG1faW5wdXQ6CisJY2FzZSBzbmRfc29jX2RhcG1fZGFjOgorCWNhc2Ugc25kX3NvY19kYXBtX21pY2JpYXM6CisJY2FzZSBzbmRfc29jX2RhcG1fdm1pZDoKKwkJcC0+Y29ubmVjdCA9IDE7CisJYnJlYWs7CisJLyogZG9lcyBlZmZlY3Qgcm91dGluZyAtIGR5bmFtaWNhbGx5IGNvbm5lY3RlZCAqLworCWNhc2Ugc25kX3NvY19kYXBtX2hwOgorCWNhc2Ugc25kX3NvY19kYXBtX21pYzoKKwljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJY2FzZSBzbmRfc29jX2RhcG1fbGluZToKKwljYXNlIHNuZF9zb2NfZGFwbV9wcmU6CisJY2FzZSBzbmRfc29jX2RhcG1fcG9zdDoKKwkJcC0+Y29ubmVjdCA9IDA7CisJYnJlYWs7CisJfQorfQorCisvKiBjb25uZWN0IG11eCB3aWRnZXQgdG8gaXQncyBpbnRlcmNvbm5lY3RpbmcgYXVkaW8gcGF0aHMgKi8KK3N0YXRpYyBpbnQgZGFwbV9jb25uZWN0X211eChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNyYywgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRlc3QsCisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoLCBjb25zdCBjaGFyICpjb250cm9sX25hbWUsCisJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjb250cm9sKQoreworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBlLT5tYXNrOyBpKyspIHsKKwkJaWYgKCEoc3RyY21wKGNvbnRyb2xfbmFtZSwgZS0+dGV4dHNbaV0pKSkgeworCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZjb2RlYy0+ZGFwbV9wYXRocyk7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmZGVzdC0+c291cmNlcyk7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zb3VyY2UsICZzcmMtPnNpbmtzKTsKKwkJCXBhdGgtPm5hbWUgPSAoY2hhciopZS0+dGV4dHNbaV07CisJCQlkYXBtX3NldF9wYXRoX3N0YXR1cyhkZXN0LCBwYXRoLCAwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIGNvbm5lY3QgbWl4ZXIgd2lkZ2V0IHRvIGl0J3MgaW50ZXJjb25uZWN0aW5nIGF1ZGlvIHBhdGhzICovCitzdGF0aWMgaW50IGRhcG1fY29ubmVjdF9taXhlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNyYywgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRlc3QsCisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoLCBjb25zdCBjaGFyICpjb250cm9sX25hbWUpCit7CisJaW50IGk7CisKKwkvKiBzZWFyY2ggZm9yIG1peGVyIGtjb250cm9sICovCisJZm9yIChpID0gMDsgaSA8IGRlc3QtPm51bV9rY29udHJvbHM7IGkrKykgeworCQlpZiAoIXN0cmNtcChjb250cm9sX25hbWUsIGRlc3QtPmtjb250cm9sc1tpXS5uYW1lKSkgeworCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZjb2RlYy0+ZGFwbV9wYXRocyk7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmZGVzdC0+c291cmNlcyk7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zb3VyY2UsICZzcmMtPnNpbmtzKTsKKwkJCXBhdGgtPm5hbWUgPSBkZXN0LT5rY29udHJvbHNbaV0ubmFtZTsKKwkJCWRhcG1fc2V0X3BhdGhfc3RhdHVzKGRlc3QsIHBhdGgsIGkpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIHVwZGF0ZSBkYXBtIGNvZGVjIHJlZ2lzdGVyIGJpdHMgKi8KK3N0YXRpYyBpbnQgZGFwbV91cGRhdGVfYml0cyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0KQoreworCWludCBjaGFuZ2UsIHBvd2VyOworCXVuc2lnbmVkIHNob3J0IG9sZCwgbmV3OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdpZGdldC0+Y29kZWM7CisKKwkvKiBjaGVjayBmb3IgdmFsaWQgd2lkZ2V0cyAqLworCWlmICh3aWRnZXQtPnJlZyA8IDAgfHwgd2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1faW5wdXQgfHwKKwkJd2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1fb3V0cHV0IHx8CisJCXdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2hwIHx8CisJCXdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX21pYyB8fAorCQl3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9saW5lIHx8CisJCXdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3NwaykKKwkJcmV0dXJuIDA7CisKKwlwb3dlciA9IHdpZGdldC0+cG93ZXI7CisJaWYgKHdpZGdldC0+aW52ZXJ0KQorCQlwb3dlciA9IChwb3dlciA/IDA6MSk7CisKKwlvbGQgPSBzbmRfc29jX3JlYWQoY29kZWMsIHdpZGdldC0+cmVnKTsKKwluZXcgPSAob2xkICYgfigweDEgPDwgd2lkZ2V0LT5zaGlmdCkpIHwgKHBvd2VyIDw8IHdpZGdldC0+c2hpZnQpOworCisJY2hhbmdlID0gb2xkICE9IG5ldzsKKwlpZiAoY2hhbmdlKSB7CisJCXBvcF9kYmcoInBvcCB0ZXN0ICVzIDogJXMgaW4gJWQgbXNcbiIsIHdpZGdldC0+bmFtZSwKKwkJCXdpZGdldC0+cG93ZXIgPyAib24iIDogIm9mZiIsIFBPUF9USU1FKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgd2lkZ2V0LT5yZWcsIG5ldyk7CisJCXBvcF93YWl0KFBPUF9USU1FKTsKKwl9CisJZGJnKCJyZWcgb2xkICV4IG5ldyAleCBjaGFuZ2UgJWRcbiIsIG9sZCwgbmV3LCBjaGFuZ2UpOworCXJldHVybiBjaGFuZ2U7Cit9CisKKy8qIHJhbXBzIHRoZSB2b2x1bWUgdXAgb3IgZG93biB0byBtaW5pbWlzZSBwb3BzIGJlZm9yZSBvciBhZnRlciBhCisgKiBEQVBNIHBvd2VyIGV2ZW50ICovCitzdGF0aWMgaW50IGRhcG1fc2V0X3BnYShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0LCBpbnQgcG93ZXIpCit7CisJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmsgPSB3aWRnZXQtPmtjb250cm9sczsKKworCWlmICh3aWRnZXQtPm11dGVkICYmICFwb3dlcikKKwkJcmV0dXJuIDA7CisJaWYgKCF3aWRnZXQtPm11dGVkICYmIHBvd2VyKQorCQlyZXR1cm4gMDsKKworCWlmICh3aWRnZXQtPm51bV9rY29udHJvbHMgJiYgaykgeworCQlpbnQgcmVnID0gay0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJCWludCBzaGlmdCA9IChrLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKKwkJaW50IG1hc2sgPSAoay0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOworCQlpbnQgaW52ZXJ0ID0gKGstPnByaXZhdGVfdmFsdWUgPj4gMjQpICYgMHgwMTsKKworCQlpZiAocG93ZXIpIHsKKwkJCWludCBpOworCQkJLyogcG93ZXIgdXAgaGFzIGhhcHBlbmRlZCwgaW5jcmVhc2Ugdm9sdW1lIHRvIGxhc3QgbGV2ZWwgKi8KKwkJCWlmIChpbnZlcnQpIHsKKwkJCQlmb3IgKGkgPSBtYXNrOyBpID4gd2lkZ2V0LT5zYXZlZF92YWx1ZTsgaS0tKQorCQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKHdpZGdldC0+Y29kZWMsIHJlZywgbWFzaywgaSk7CisJCQl9IGVsc2UgeworCQkJCWZvciAoaSA9IDA7IGkgPCB3aWRnZXQtPnNhdmVkX3ZhbHVlOyBpKyspCisJCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMod2lkZ2V0LT5jb2RlYywgcmVnLCBtYXNrLCBpKTsKKwkJCX0KKwkJCXdpZGdldC0+bXV0ZWQgPSAwOworCQl9IGVsc2UgeworCQkJLyogcG93ZXIgZG93biBpcyBhYm91dCB0byBvY2N1ciwgZGVjcmVhc2Ugdm9sdW1lIHRvIG11dGUgKi8KKwkJCWludCB2YWwgPSBzbmRfc29jX3JlYWQod2lkZ2V0LT5jb2RlYywgcmVnKTsKKwkJCWludCBpID0gd2lkZ2V0LT5zYXZlZF92YWx1ZSA9ICh2YWwgPj4gc2hpZnQpICYgbWFzazsKKwkJCWlmIChpbnZlcnQpIHsKKwkJCQlmb3IgKDsgaSA8IG1hc2s7IGkrKykKKwkJCQkJc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCByZWcsIG1hc2ssIGkpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKDsgaSA+IDA7IGktLSkKKwkJCQkJc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCByZWcsIG1hc2ssIGkpOworCQkJfQorCQkJd2lkZ2V0LT5tdXRlZCA9IDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGNyZWF0ZSBuZXcgZGFwbSBtaXhlciBjb250cm9sICovCitzdGF0aWMgaW50IGRhcG1fbmV3X21peGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwljaGFyIG5hbWVbMzJdOworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKKworCS8qIGFkZCBrY29udHJvbCAqLworCWZvciAoaSA9IDA7IGkgPCB3LT5udW1fa2NvbnRyb2xzOyBpKyspIHsKKworCQkvKiBtYXRjaCBuYW1lICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJnctPnNvdXJjZXMsIGxpc3Rfc2luaykgeworCisJCQkvKiBtaXhlci9tdXggcGF0aHMgbmFtZSBtdXN0IG1hdGNoIGNvbnRyb2wgbmFtZSAqLworCQkJaWYgKHBhdGgtPm5hbWUgIT0gKGNoYXIqKXctPmtjb250cm9sc1tpXS5uYW1lKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBhZGQgZGFwbSBjb250cm9sIHdpdGggbG9uZyBuYW1lICovCisJCQlzbnByaW50ZihuYW1lLCAzMiwgIiVzICVzIiwgdy0+bmFtZSwgdy0+a2NvbnRyb2xzW2ldLm5hbWUpOworCQkJcGF0aC0+bG9uZ19uYW1lID0ga3N0cmR1cCAobmFtZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAocGF0aC0+bG9uZ19uYW1lID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCXBhdGgtPmtjb250cm9sID0gc25kX3NvY19jbmV3KCZ3LT5rY29udHJvbHNbaV0sIHcsCisJCQkJcGF0aC0+bG9uZ19uYW1lKTsKKwkJCXJldCA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLCBwYXRoLT5rY29udHJvbCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogZmFpbGVkIHRvIGFkZCBkYXBtIGtjb250cm9sICVzXG4iLAorCQkJCQkJcGF0aC0+bG9uZ19uYW1lKTsKKwkJCQlrZnJlZShwYXRoLT5sb25nX25hbWUpOworCQkJCXBhdGgtPmxvbmdfbmFtZSA9IE5VTEw7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBjcmVhdGUgbmV3IGRhcG0gbXV4IGNvbnRyb2wgKi8KK3N0YXRpYyBpbnQgZGFwbV9uZXdfbXV4KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGggPSBOVUxMOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sOworCWludCByZXQgPSAwOworCisJaWYgKCF3LT5udW1fa2NvbnRyb2xzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogbXV4ICVzIGhhcyBubyBjb250cm9sc1xuIiwgdy0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWtjb250cm9sID0gc25kX3NvY19jbmV3KCZ3LT5rY29udHJvbHNbMF0sIHcsIHctPm5hbWUpOworCXJldCA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLCBrY29udHJvbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmdy0+c291cmNlcywgbGlzdF9zaW5rKQorCQlwYXRoLT5rY29udHJvbCA9IGtjb250cm9sOworCisJcmV0dXJuIHJldDsKKworZXJyOgorCXByaW50ayhLRVJOX0VSUiAiYXNvYzogZmFpbGVkIHRvIGFkZCBrY29udHJvbCAlc1xuIiwgdy0+bmFtZSk7CisJcmV0dXJuIHJldDsKK30KKworLyogY3JlYXRlIG5ldyBkYXBtIHZvbHVtZSBjb250cm9sICovCitzdGF0aWMgaW50IGRhcG1fbmV3X3BnYShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCit7CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2w7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXctPm51bV9rY29udHJvbHMpCisJCXJldHVybiAtRUlOVkFMOworCisJa2NvbnRyb2wgPSBzbmRfc29jX2NuZXcoJnctPmtjb250cm9sc1swXSwgdywgdy0+bmFtZSk7CisJcmV0ID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsIGtjb250cm9sKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGZhaWxlZCB0byBhZGQga2NvbnRyb2wgJXNcbiIsIHctPm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIHJlc2V0ICd3YWxrZWQnIGJpdCBmb3IgZWFjaCBkYXBtIHBhdGggKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkYXBtX2NsZWFyX3dhbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNvZGVjLT5kYXBtX3BhdGhzLCBsaXN0KQorCQlwLT53YWxrZWQgPSAwOworfQorCisvKgorICogUmVjdXJzaXZlbHkgY2hlY2sgZm9yIGEgY29tcGxldGVkIHBhdGggdG8gYW4gYWN0aXZlIG9yIHBoeXNpY2FsbHkgY29ubmVjdGVkCisgKiBvdXRwdXQgd2lkZ2V0LiBSZXR1cm5zIG51bWJlciBvZiBjb21wbGV0ZSBwYXRocy4KKyAqLworc3RhdGljIGludCBpc19jb25uZWN0ZWRfb3V0cHV0X2VwKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOworCWludCBjb24gPSAwOworCisJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2FkYyAmJiB3aWRnZXQtPmFjdGl2ZSkKKwkJcmV0dXJuIDE7CisKKwlpZiAod2lkZ2V0LT5jb25uZWN0ZWQpIHsKKwkJLyogY29ubmVjdGVkIHBpbiA/ICovCisJCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9vdXRwdXQgJiYgIXdpZGdldC0+ZXh0KQorCQkJcmV0dXJuIDE7CisKKwkJLyogY29ubmVjdGVkIGphY2sgb3Igc3BrID8gKi8KKwkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2hwIHx8IHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3NwayB8fAorCQkJd2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1fbGluZSkKKwkJCXJldHVybiAxOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+c2lua3MsIGxpc3Rfc291cmNlKSB7CisJCWlmIChwYXRoLT53YWxrZWQpCisJCQljb250aW51ZTsKKworCQlpZiAocGF0aC0+c2luayAmJiBwYXRoLT5jb25uZWN0KSB7CisJCQlwYXRoLT53YWxrZWQgPSAxOworCQkJY29uICs9IGlzX2Nvbm5lY3RlZF9vdXRwdXRfZXAocGF0aC0+c2luayk7CisJCX0KKwl9CisKKwlyZXR1cm4gY29uOworfQorCisvKgorICogUmVjdXJzaXZlbHkgY2hlY2sgZm9yIGEgY29tcGxldGVkIHBhdGggdG8gYW4gYWN0aXZlIG9yIHBoeXNpY2FsbHkgY29ubmVjdGVkCisgKiBpbnB1dCB3aWRnZXQuIFJldHVybnMgbnVtYmVyIG9mIGNvbXBsZXRlIHBhdGhzLgorICovCitzdGF0aWMgaW50IGlzX2Nvbm5lY3RlZF9pbnB1dF9lcChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKKwlpbnQgY29uID0gMDsKKworCS8qIGFjdGl2ZSBzdHJlYW0gPyAqLworCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9kYWMgJiYgd2lkZ2V0LT5hY3RpdmUpCisJCXJldHVybiAxOworCisJaWYgKHdpZGdldC0+Y29ubmVjdGVkKSB7CisJCS8qIGNvbm5lY3RlZCBwaW4gPyAqLworCQlpZiAod2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1faW5wdXQgJiYgIXdpZGdldC0+ZXh0KQorCQkJcmV0dXJuIDE7CisKKwkJLyogY29ubmVjdGVkIFZNSUQvQmlhcyBmb3IgbG93ZXIgcG9wcyAqLworCQlpZiAod2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1fdm1pZCkKKwkJCXJldHVybiAxOworCisJCS8qIGNvbm5lY3RlZCBqYWNrID8gKi8KKwkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX21pYyB8fCB3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9saW5lKQorCQkJcmV0dXJuIDE7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmd2lkZ2V0LT5zb3VyY2VzLCBsaXN0X3NpbmspIHsKKwkJaWYgKHBhdGgtPndhbGtlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwYXRoLT5zb3VyY2UgJiYgcGF0aC0+Y29ubmVjdCkgeworCQkJcGF0aC0+d2Fsa2VkID0gMTsKKwkJCWNvbiArPSBpc19jb25uZWN0ZWRfaW5wdXRfZXAocGF0aC0+c291cmNlKTsKKwkJfQorCX0KKworCXJldHVybiBjb247Cit9CisKKy8qCisgKiBTY2FuIGVhY2ggZGFwbSB3aWRnZXQgZm9yIGNvbXBsZXRlIGF1ZGlvIHBhdGguCisgKiBBIGNvbXBsZXRlIHBhdGggaXMgYSByb3V0ZSB0aGF0IGhhcyB2YWxpZCBlbmRwb2ludHMgaS5lLjotCisgKgorICogIG8gREFDIHRvIG91dHB1dCBwaW4uCisgKiAgbyBJbnB1dCBQaW4gdG8gQURDLgorICogIG8gSW5wdXQgcGluIHRvIE91dHB1dCBwaW4gKGJ5cGFzcywgc2lkZXRvbmUpCisgKiAgbyBEQUMgdG8gQURDIChsb29wYmFjaykuCisgKi8KK3N0YXRpYyBpbnQgZGFwbV9wb3dlcl93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3OworCWludCBpbiwgb3V0LCBpLCBjID0gMSwgKnNlcSA9IE5VTEwsIHJldCA9IDAsIHBvd2VyX2NoYW5nZSwgcG93ZXI7CisKKwkvKiBkbyB3ZSBoYXZlIGEgc2VxdWVuY2VkIHN0cmVhbSBldmVudCAqLworCWlmIChldmVudCA9PSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUKSB7CisJCWMgPSBBUlJBWV9TSVpFKGRhcG1fdXBfc2VxKTsKKwkJc2VxID0gZGFwbV91cF9zZXE7CisJfSBlbHNlIGlmIChldmVudCA9PSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUT1ApIHsKKwkJYyA9IEFSUkFZX1NJWkUoZGFwbV9kb3duX3NlcSk7CisJCXNlcSA9IGRhcG1fZG93bl9zZXE7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgYzsgaSsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5kYXBtX3dpZGdldHMsIGxpc3QpIHsKKworCQkJLyogaXMgd2lkZ2V0IGluIHN0cmVhbSBvcmRlciAqLworCQkJaWYgKHNlcSAmJiBzZXFbaV0gJiYgdy0+aWQgIT0gc2VxW2ldKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiB2bWlkIC0gbm8gYWN0aW9uICovCisJCQlpZiAody0+aWQgPT0gc25kX3NvY19kYXBtX3ZtaWQpCisJCQkJY29udGludWU7CisKKwkJCS8qIGFjdGl2ZSBBREMgKi8KKwkJCWlmICh3LT5pZCA9PSBzbmRfc29jX2RhcG1fYWRjICYmIHctPmFjdGl2ZSkgeworCQkJCWluID0gaXNfY29ubmVjdGVkX2lucHV0X2VwKHcpOworCQkJCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJCQkJdy0+cG93ZXIgPSAoaW4gIT0gMCkgPyAxIDogMDsKKwkJCQlkYXBtX3VwZGF0ZV9iaXRzKHcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBhY3RpdmUgREFDICovCisJCQlpZiAody0+aWQgPT0gc25kX3NvY19kYXBtX2RhYyAmJiB3LT5hY3RpdmUpIHsKKwkJCQlvdXQgPSBpc19jb25uZWN0ZWRfb3V0cHV0X2VwKHcpOworCQkJCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJCQkJdy0+cG93ZXIgPSAob3V0ICE9IDApID8gMSA6IDA7CisJCQkJZGFwbV91cGRhdGVfYml0cyh3KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogcHJvZ3JhbW1hYmxlIGdhaW4vYXR0ZW51YXRpb24gKi8KKwkJCWlmICh3LT5pZCA9PSBzbmRfc29jX2RhcG1fcGdhKSB7CisJCQkJaW50IG9uOworCQkJCWluID0gaXNfY29ubmVjdGVkX2lucHV0X2VwKHcpOworCQkJCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJCQkJb3V0ID0gaXNfY29ubmVjdGVkX291dHB1dF9lcCh3KTsKKwkJCQlkYXBtX2NsZWFyX3dhbGsody0+Y29kZWMpOworCQkJCXctPnBvd2VyID0gb24gPSAob3V0ICE9IDAgJiYgaW4gIT0gMCkgPyAxIDogMDsKKworCQkJCWlmICghb24pCisJCQkJCWRhcG1fc2V0X3BnYSh3LCBvbik7IC8qIGxvd2VyIHZvbHVtZSB0byByZWR1Y2UgcG9wcyAqLworCQkJCWRhcG1fdXBkYXRlX2JpdHModyk7CisJCQkJaWYgKG9uKQorCQkJCQlkYXBtX3NldF9wZ2Eodywgb24pOyAvKiByZXN0b3JlIHZvbHVtZSBmcm9tIHplcm8gKi8KKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBwcmUgYW5kIHBvc3QgZXZlbnQgd2lkZ2V0cyAqLworCQkJaWYgKHctPmlkID09IHNuZF9zb2NfZGFwbV9wcmUpIHsKKwkJCQlpZiAoIXctPmV2ZW50KQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChldmVudCA9PSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUKSB7CisJCQkJCXJldCA9IHctPmV2ZW50KHcsIFNORF9TT0NfREFQTV9QUkVfUE1VKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCX0gZWxzZSBpZiAoZXZlbnQgPT0gU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QKSB7CisJCQkJCXJldCA9IHctPmV2ZW50KHcsIFNORF9TT0NfREFQTV9QUkVfUE1EKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICh3LT5pZCA9PSBzbmRfc29jX2RhcG1fcG9zdCkgeworCQkJCWlmICghdy0+ZXZlbnQpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKGV2ZW50ID09IFNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQpIHsKKwkJCQkJcmV0ID0gdy0+ZXZlbnQodywgU05EX1NPQ19EQVBNX1BPU1RfUE1VKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCX0gZWxzZSBpZiAoZXZlbnQgPT0gU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QKSB7CisJCQkJCXJldCA9IHctPmV2ZW50KHcsIFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CisJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIGFsbCBvdGhlciB3aWRnZXRzICovCisJCQlpbiA9IGlzX2Nvbm5lY3RlZF9pbnB1dF9lcCh3KTsKKwkJCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJCQlvdXQgPSBpc19jb25uZWN0ZWRfb3V0cHV0X2VwKHcpOworCQkJZGFwbV9jbGVhcl93YWxrKHctPmNvZGVjKTsKKwkJCXBvd2VyID0gKG91dCAhPSAwICYmIGluICE9IDApID8gMSA6IDA7CisJCQlwb3dlcl9jaGFuZ2UgPSAody0+cG93ZXIgPT0gcG93ZXIpID8gMDogMTsKKwkJCXctPnBvd2VyID0gcG93ZXI7CisKKwkJCS8qIGNhbGwgYW55IHBvd2VyIGNoYW5nZSBldmVudCBoYW5kbGVycyAqLworCQkJaWYgKHBvd2VyX2NoYW5nZSkgeworCQkJCWlmICh3LT5ldmVudCkgeworCQkJCQlkYmcoInBvd2VyICVzIGV2ZW50IGZvciAlcyBmbGFncyAleFxuIiwKKwkJCQkJCXctPnBvd2VyID8gIm9uIiA6ICJvZmYiLCB3LT5uYW1lLCB3LT5ldmVudF9mbGFncyk7CisJCQkJCWlmIChwb3dlcikgeworCQkJCQkJLyogcG93ZXIgdXAgZXZlbnQgKi8KKwkJCQkJCWlmICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QUkVfUE1VKSB7CisJCQkJCQkJcmV0ID0gdy0+ZXZlbnQodywgU05EX1NPQ19EQVBNX1BSRV9QTVUpOworCQkJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQkJfQorCQkJCQkJZGFwbV91cGRhdGVfYml0cyh3KTsKKwkJCQkJCWlmICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QT1NUX1BNVSl7CisJCQkJCQkJcmV0ID0gdy0+ZXZlbnQodywgU05EX1NPQ19EQVBNX1BPU1RfUE1VKTsKKwkJCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIHBvd2VyIGRvd24gZXZlbnQgKi8KKwkJCQkJCWlmICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QUkVfUE1EKSB7CisJCQkJCQkJcmV0ID0gdy0+ZXZlbnQodywgU05EX1NPQ19EQVBNX1BSRV9QTUQpOworCQkJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQkJfQorCQkJCQkJZGFwbV91cGRhdGVfYml0cyh3KTsKKwkJCQkJCWlmICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QT1NUX1BNRCkgeworCQkJCQkJCXJldCA9IHctPmV2ZW50KHcsIFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CisJCQkJCQkJaWYgKHJldCA8IDApCisJCQkJCQkJCXJldHVybiByZXQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UKKwkJCQkJLyogbm8gZXZlbnQgaGFuZGxlciAqLworCQkJCQlkYXBtX3VwZGF0ZV9iaXRzKHcpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmIERBUE1fREVCVUcKK3N0YXRpYyB2b2lkIGRiZ19kdW1wX2RhcG0oc3RydWN0IHNuZF9zb2NfY29kZWMqIGNvZGVjLCBjb25zdCBjaGFyICphY3Rpb24pCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwID0gTlVMTDsKKwlpbnQgaW4sIG91dDsKKworCXByaW50aygiREFQTSAlcyAlc1xuIiwgY29kZWMtPm5hbWUsIGFjdGlvbik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZjb2RlYy0+ZGFwbV93aWRnZXRzLCBsaXN0KSB7CisKKwkJLyogb25seSBkaXNwbGF5IHdpZGdldHMgdGhhdCBlZmZlY3Qgcm91dGluZyAqLworCQlzd2l0Y2ggKHctPmlkKSB7CisJCWNhc2Ugc25kX3NvY19kYXBtX3ByZToKKwkJY2FzZSBzbmRfc29jX2RhcG1fcG9zdDoKKwkJY2FzZSBzbmRfc29jX2RhcG1fdm1pZDoKKwkJCWNvbnRpbnVlOworCQljYXNlIHNuZF9zb2NfZGFwbV9tdXg6CisJCWNhc2Ugc25kX3NvY19kYXBtX291dHB1dDoKKwkJY2FzZSBzbmRfc29jX2RhcG1faW5wdXQ6CisJCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKKwkJY2FzZSBzbmRfc29jX2RhcG1faHA6CisJCWNhc2Ugc25kX3NvY19kYXBtX21pYzoKKwkJY2FzZSBzbmRfc29jX2RhcG1fc3BrOgorCQljYXNlIHNuZF9zb2NfZGFwbV9saW5lOgorCQljYXNlIHNuZF9zb2NfZGFwbV9taWNiaWFzOgorCQljYXNlIHNuZF9zb2NfZGFwbV9kYWM6CisJCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKKwkJY2FzZSBzbmRfc29jX2RhcG1fcGdhOgorCQljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKKwkJCWlmICh3LT5uYW1lKSB7CisJCQkJaW4gPSBpc19jb25uZWN0ZWRfaW5wdXRfZXAodyk7CisJCQkJZGFwbV9jbGVhcl93YWxrKHctPmNvZGVjKTsKKwkJCQlvdXQgPSBpc19jb25uZWN0ZWRfb3V0cHV0X2VwKHcpOworCQkJCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJCQkJcHJpbnRrKCIlczogJXMgIGluICVkIG91dCAlZFxuIiwgdy0+bmFtZSwKKwkJCQkJdy0+cG93ZXIgPyAiT24iOiJPZmYiLGluLCBvdXQpOworCisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmdy0+c291cmNlcywgbGlzdF9zaW5rKSB7CisJCQkJCWlmIChwLT5jb25uZWN0KQorCQkJCQkJcHJpbnRrKCIgaW4gICVzICVzXG4iLCBwLT5uYW1lID8gcC0+bmFtZSA6ICJzdGF0aWMiLAorCQkJCQkJCXAtPnNvdXJjZS0+bmFtZSk7CisJCQkJfQorCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnctPnNpbmtzLCBsaXN0X3NvdXJjZSkgeworCQkJCQlpZiAocC0+Y29ubmVjdCkKKwkJCQkJCXByaW50aygiIG91dCAlcyAlc1xuIiwgcC0+bmFtZSA/IHAtPm5hbWUgOiAic3RhdGljIiwKKwkJCQkJCQlwLT5zaW5rLT5uYW1lKTsKKwkJCQl9CisJCQl9CisJCWJyZWFrOworCQl9CisJfQorfQorI2VuZGlmCisKKy8qIHRlc3QgYW5kIHVwZGF0ZSB0aGUgcG93ZXIgc3RhdHVzIG9mIGEgbXV4IHdpZGdldCAqLworc3RhdGljIGludCBkYXBtX211eF91cGRhdGVfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCwKKwkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBtYXNrLAorCQkJCSBpbnQgdmFsLCBzdHJ1Y3Qgc29jX2VudW0qIGUpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOworCWludCBmb3VuZCA9IDA7CisKKwlpZiAod2lkZ2V0LT5pZCAhPSBzbmRfc29jX2RhcG1fbXV4KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghc25kX3NvY190ZXN0X2JpdHMod2lkZ2V0LT5jb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpKQorCQlyZXR1cm4gMDsKKworCS8qIGZpbmQgZGFwbSB3aWRnZXQgcGF0aCBhc3NvYyB3aXRoIGtjb250cm9sICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmd2lkZ2V0LT5jb2RlYy0+ZGFwbV9wYXRocywgbGlzdCkgeworCQlpZiAocGF0aC0+a2NvbnRyb2wgIT0ga2NvbnRyb2wpCisJCQljb250aW51ZTsKKworCQlpZiAoIXBhdGgtPm5hbWUgfHwgISBlLT50ZXh0c1t2YWxdKQorCQkJY29udGludWU7CisKKwkJZm91bmQgPSAxOworCQkvKiB3ZSBub3cgbmVlZCB0byBtYXRjaCB0aGUgc3RyaW5nIGluIHRoZSBlbnVtIHRvIHRoZSBwYXRoICovCisJCWlmICghKHN0cmNtcChwYXRoLT5uYW1lLCBlLT50ZXh0c1t2YWxdKSkpCisJCQlwYXRoLT5jb25uZWN0ID0gMTsgLyogbmV3IGNvbm5lY3Rpb24gKi8KKwkJZWxzZQorCQkJcGF0aC0+Y29ubmVjdCA9IDA7IC8qIG9sZCBjb25uZWN0aW9uIG11c3QgYmUgcG93ZXJlZCBkb3duICovCisJfQorCisJaWYgKGZvdW5kKQorCQlkYXBtX3Bvd2VyX3dpZGdldHMod2lkZ2V0LT5jb2RlYywgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1ApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHRlc3QgYW5kIHVwZGF0ZSB0aGUgcG93ZXIgc3RhdHVzIG9mIGEgbWl4ZXIgd2lkZ2V0ICovCitzdGF0aWMgaW50IGRhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQsCisJCQkJICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCByZWcsCisJCQkJICAgaW50IHZhbF9tYXNrLCBpbnQgdmFsLCBpbnQgaW52ZXJ0KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKKwlpbnQgZm91bmQgPSAwOworCisJaWYgKHdpZGdldC0+aWQgIT0gc25kX3NvY19kYXBtX21peGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghc25kX3NvY190ZXN0X2JpdHMod2lkZ2V0LT5jb2RlYywgcmVnLCB2YWxfbWFzaywgdmFsKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBmaW5kIGRhcG0gd2lkZ2V0IHBhdGggYXNzb2Mgd2l0aCBrY29udHJvbCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+Y29kZWMtPmRhcG1fcGF0aHMsIGxpc3QpIHsKKwkJaWYgKHBhdGgtPmtjb250cm9sICE9IGtjb250cm9sKQorCQkJY29udGludWU7CisKKwkJLyogZm91bmQsIG5vdyBjaGVjayB0eXBlICovCisJCWZvdW5kID0gMTsKKwkJaWYgKHZhbCkKKwkJCS8qIG5ldyBjb25uZWN0aW9uICovCisJCQlwYXRoLT5jb25uZWN0ID0gaW52ZXJ0ID8gMDoxOworCQllbHNlCisJCQkvKiBvbGQgY29ubmVjdGlvbiBtdXN0IGJlIHBvd2VyZWQgZG93biAqLworCQkJcGF0aC0+Y29ubmVjdCA9IGludmVydCA/IDE6MDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGZvdW5kKQorCQlkYXBtX3Bvd2VyX3dpZGdldHMod2lkZ2V0LT5jb2RlYywgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1ApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNob3cgZGFwbSB3aWRnZXQgc3RhdHVzIGluIHN5cyBmcyAqLworc3RhdGljIHNzaXplX3QgZGFwbV93aWRnZXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKmRldmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkZXZkYXRhLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKKwlpbnQgY291bnQgPSAwOworCWNoYXIgKnN0YXRlID0gIm5vdCBzZXQiOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY29kZWMtPmRhcG1fd2lkZ2V0cywgbGlzdCkgeworCisJCS8qIG9ubHkgZGlzcGxheSB3aWRnZXRzIHRoYXQgYnVybm0gcG93ZXIgKi8KKwkJc3dpdGNoICh3LT5pZCkgeworCQljYXNlIHNuZF9zb2NfZGFwbV9ocDoKKwkJY2FzZSBzbmRfc29jX2RhcG1fbWljOgorCQljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJCWNhc2Ugc25kX3NvY19kYXBtX2xpbmU6CisJCWNhc2Ugc25kX3NvY19kYXBtX21pY2JpYXM6CisJCWNhc2Ugc25kX3NvY19kYXBtX2RhYzoKKwkJY2FzZSBzbmRfc29jX2RhcG1fYWRjOgorCQljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CisJCWNhc2Ugc25kX3NvY19kYXBtX21peGVyOgorCQkJaWYgKHctPm5hbWUpCisJCQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIiVzOiAlc1xuIiwKKwkJCQkJdy0+bmFtZSwgdy0+cG93ZXIgPyAiT24iOiJPZmYiKTsKKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWJyZWFrOworCQl9CisJfQorCisJc3dpdGNoKGNvZGVjLT5kYXBtX3N0YXRlKXsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMDoKKwkJc3RhdGUgPSAiRDAiOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMToKKwkJc3RhdGUgPSAiRDEiOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMjoKKwkJc3RhdGUgPSAiRDIiOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2hvdDoKKwkJc3RhdGUgPSAiRDNob3QiOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQ6CisJCXN0YXRlID0gIkQzY29sZCI7CisJCWJyZWFrOworCX0KKwljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiUE0gU3RhdGU6ICVzXG4iLCBzdGF0ZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihkYXBtX3dpZGdldCwgMDQ0NCwgZGFwbV93aWRnZXRfc2hvdywgTlVMTCk7CisKK2ludCBzbmRfc29jX2RhcG1fc3lzX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGFwbV9zdGF0dXMpCisJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kYXBtX3dpZGdldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzbmRfc29jX2RhcG1fc3lzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGRhcG1fc3RhdHVzKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGFwbV93aWRnZXQpOworfQorCisvKiBmcmVlIGFsbCBkYXBtIHdpZGdldHMgYW5kIHJlc291cmNlcyAqLworc3RhdGljIHZvaWQgZGFwbV9mcmVlX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCAqbmV4dF93OworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcCwgKm5leHRfcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3LCBuZXh0X3csICZjb2RlYy0+ZGFwbV93aWRnZXRzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZ3LT5saXN0KTsKKwkJa2ZyZWUodyk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG5leHRfcCwgJmNvZGVjLT5kYXBtX3BhdGhzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZwLT5saXN0KTsKKwkJa2ZyZWUocC0+bG9uZ19uYW1lKTsKKwkJa2ZyZWUocCk7CisJfQorfQorCisvKioKKyAqIHNuZF9zb2NfZGFwbV9zeW5jX2VuZHBvaW50cyAtIHNjYW4gYW5kIHBvd2VyIGRhcG0gcGF0aHMKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqCisgKiBXYWxrcyBhbGwgZGFwbSBhdWRpbyBwYXRocyBhbmQgcG93ZXJzIHdpZGdldHMgYWNjb3JkaW5nIHRvIHRoZWlyCisgKiBzdHJlYW0gb3IgcGF0aCB1c2FnZS4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fc3luY19lbmRwb2ludHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBkYXBtX3Bvd2VyX3dpZGdldHMoY29kZWMsIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9zeW5jX2VuZHBvaW50cyk7CisKKy8qKgorICogc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQgLSBjb25uZWN0IGRhcG0gd2lkZ2V0cworICogQGNvZGVjOiBhdWRpbyBjb2RlYworICogQHNpbms6IG5hbWUgb2YgdGFyZ2V0IHdpZGdldAorICogQGNvbnRyb2w6IG1peGVyIGNvbnRyb2wgbmFtZQorICogQHNvdXJjZTogbmFtZSBvZiBzb3VyY2UgbmFtZQorICoKKyAqIENvbm5lY3RzIDIgZGFwbSB3aWRnZXRzIHRvZ2V0aGVyIHZpYSBhIG5hbWVkIGF1ZGlvIHBhdGguIFRoZSBzaW5rIGlzCisgKiB0aGUgd2lkZ2V0IHJlY2VpdmluZyB0aGUgYXVkaW8gc2lnbmFsLCB3aGlsc3QgdGhlIHNvdXJjZSBpcyB0aGUgc2VuZGVyCisgKiBvZiB0aGUgYXVkaW8gc2lnbmFsLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBlbHNlIGVycm9yLgorICovCitpbnQgc25kX3NvY19kYXBtX2Nvbm5lY3RfaW5wdXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpzaW5rLAorCWNvbnN0IGNoYXIgKiBjb250cm9sLCBjb25zdCBjaGFyICpzb3VyY2UpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3c291cmNlID0gTlVMTCwgKndzaW5rID0gTlVMTCwgKnc7CisJaW50IHJldCA9IDA7CisKKwkvKiBmaW5kIHNyYyBhbmQgZGVzdCB3aWRnZXRzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY29kZWMtPmRhcG1fd2lkZ2V0cywgbGlzdCkgeworCisJCWlmICghd3NpbmsgJiYgIShzdHJjbXAody0+bmFtZSwgc2luaykpKSB7CisJCQl3c2luayA9IHc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXdzb3VyY2UgJiYgIShzdHJjbXAody0+bmFtZSwgc291cmNlKSkpIHsKKwkJCXdzb3VyY2UgPSB3OworCQl9CisJfQorCisJaWYgKHdzb3VyY2UgPT0gTlVMTCB8fCB3c2luayA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBhdGggPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJcGF0aC0+c291cmNlID0gd3NvdXJjZTsKKwlwYXRoLT5zaW5rID0gd3Npbms7CisJSU5JVF9MSVNUX0hFQUQoJnBhdGgtPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZwYXRoLT5saXN0X3NvdXJjZSk7CisJSU5JVF9MSVNUX0hFQUQoJnBhdGgtPmxpc3Rfc2luayk7CisKKwkvKiBjaGVjayBmb3IgZXh0ZXJuYWwgd2lkZ2V0cyAqLworCWlmICh3c2luay0+aWQgPT0gc25kX3NvY19kYXBtX2lucHV0KSB7CisJCWlmICh3c291cmNlLT5pZCA9PSBzbmRfc29jX2RhcG1fbWljYmlhcyB8fAorCQkJd3NvdXJjZS0+aWQgPT0gc25kX3NvY19kYXBtX21pYyB8fAorCQkJd3NpbmstPmlkID09IHNuZF9zb2NfZGFwbV9saW5lKQorCQkJd3NpbmstPmV4dCA9IDE7CisJfQorCWlmICh3c291cmNlLT5pZCA9PSBzbmRfc29jX2RhcG1fb3V0cHV0KSB7CisJCWlmICh3c2luay0+aWQgPT0gc25kX3NvY19kYXBtX3NwayB8fAorCQkJd3NpbmstPmlkID09IHNuZF9zb2NfZGFwbV9ocCB8fAorCQkJd3NpbmstPmlkID09IHNuZF9zb2NfZGFwbV9saW5lKQorCQkJd3NvdXJjZS0+ZXh0ID0gMTsKKwl9CisKKwkvKiBjb25uZWN0IHN0YXRpYyBwYXRocyAqLworCWlmIChjb250cm9sID09IE5VTEwpIHsKKwkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZjb2RlYy0+ZGFwbV9wYXRocyk7CisJCWxpc3RfYWRkKCZwYXRoLT5saXN0X3NpbmssICZ3c2luay0+c291cmNlcyk7CisJCWxpc3RfYWRkKCZwYXRoLT5saXN0X3NvdXJjZSwgJndzb3VyY2UtPnNpbmtzKTsKKwkJcGF0aC0+Y29ubmVjdCA9IDE7CisJCXJldHVybiAwOworCX0KKworCS8qIGNvbm5lY3QgZHluYW1pYyBwYXRocyAqLworCXN3aXRjaCh3c2luay0+aWQpIHsKKwljYXNlIHNuZF9zb2NfZGFwbV9hZGM6CisJY2FzZSBzbmRfc29jX2RhcG1fZGFjOgorCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKKwljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKKwljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CisJY2FzZSBzbmRfc29jX2RhcG1fbWljYmlhczoKKwljYXNlIHNuZF9zb2NfZGFwbV92bWlkOgorCWNhc2Ugc25kX3NvY19kYXBtX3ByZToKKwljYXNlIHNuZF9zb2NfZGFwbV9wb3N0OgorCQlsaXN0X2FkZCgmcGF0aC0+bGlzdCwgJmNvZGVjLT5kYXBtX3BhdGhzKTsKKwkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJndzaW5rLT5zb3VyY2VzKTsKKwkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmd3NvdXJjZS0+c2lua3MpOworCQlwYXRoLT5jb25uZWN0ID0gMTsKKwkJcmV0dXJuIDA7CisJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCQlyZXQgPSBkYXBtX2Nvbm5lY3RfbXV4KGNvZGVjLCB3c291cmNlLCB3c2luaywgcGF0aCwgY29udHJvbCwKKwkJCSZ3c2luay0+a2NvbnRyb2xzWzBdKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBlcnI7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKKwljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKKwkJcmV0ID0gZGFwbV9jb25uZWN0X21peGVyKGNvZGVjLCB3c291cmNlLCB3c2luaywgcGF0aCwgY29udHJvbCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gZXJyOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9ocDoKKwljYXNlIHNuZF9zb2NfZGFwbV9taWM6CisJY2FzZSBzbmRfc29jX2RhcG1fbGluZToKKwljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJCWxpc3RfYWRkKCZwYXRoLT5saXN0LCAmY29kZWMtPmRhcG1fcGF0aHMpOworCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmd3NpbmstPnNvdXJjZXMpOworCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zb3VyY2UsICZ3c291cmNlLT5zaW5rcyk7CisJCXBhdGgtPmNvbm5lY3QgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7CisKK2VycjoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhc29jOiBubyBkYXBtIG1hdGNoIGZvciAlcyAtLT4gJXMgLS0+ICVzXG4iLCBzb3VyY2UsCisJCWNvbnRyb2wsIHNpbmspOworCWtmcmVlKHBhdGgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fY29ubmVjdF9pbnB1dCk7CisKKy8qKgorICogc25kX3NvY19kYXBtX25ld193aWRnZXRzIC0gYWRkIG5ldyBkYXBtIHdpZGdldHMKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqCisgKiBDaGVja3MgdGhlIGNvZGVjIGZvciBhbnkgbmV3IGRhcG0gd2lkZ2V0cyBhbmQgY3JlYXRlcyB0aGVtIGlmIGZvdW5kLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5kYXBtX3dpZGdldHMsIGxpc3QpCisJeworCQlpZiAody0+bmV3KQorCQkJY29udGludWU7CisKKwkJc3dpdGNoKHctPmlkKSB7CisJCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKKwkJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6CisJCQlkYXBtX25ld19taXhlcihjb2RlYywgdyk7CisJCQlicmVhazsKKwkJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCQkJZGFwbV9uZXdfbXV4KGNvZGVjLCB3KTsKKwkJCWJyZWFrOworCQljYXNlIHNuZF9zb2NfZGFwbV9hZGM6CisJCWNhc2Ugc25kX3NvY19kYXBtX2RhYzoKKwkJY2FzZSBzbmRfc29jX2RhcG1fcGdhOgorCQkJZGFwbV9uZXdfcGdhKGNvZGVjLCB3KTsKKwkJCWJyZWFrOworCQljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKKwkJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgorCQljYXNlIHNuZF9zb2NfZGFwbV9taWNiaWFzOgorCQljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJCWNhc2Ugc25kX3NvY19kYXBtX2hwOgorCQljYXNlIHNuZF9zb2NfZGFwbV9taWM6CisJCWNhc2Ugc25kX3NvY19kYXBtX2xpbmU6CisJCWNhc2Ugc25kX3NvY19kYXBtX3ZtaWQ6CisJCWNhc2Ugc25kX3NvY19kYXBtX3ByZToKKwkJY2FzZSBzbmRfc29jX2RhcG1fcG9zdDoKKwkJCWJyZWFrOworCQl9CisJCXctPm5ldyA9IDE7CisJfQorCisJZGFwbV9wb3dlcl93aWRnZXRzKGNvZGVjLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX25ld193aWRnZXRzKTsKKworLyoqCisgKiBzbmRfc29jX2RhcG1fZ2V0X3ZvbHN3IC0gZGFwbSBtaXhlciBnZXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZGFwbSBtaXhlciBjb250cm9sLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfZGFwbV9nZXRfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOworCWludCBzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiA4KSAmIDB4MGY7CisJaW50IHJzaGlmdCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweDBmOworCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CisJaW50IGludmVydCA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDAxOworCisJLyogcmV0dXJuIHRoZSBzYXZlZCB2YWx1ZSBpZiB3ZSBhcmUgcG93ZXJlZCBkb3duICovCisJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3BnYSAmJiAhd2lkZ2V0LT5wb3dlcikgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHdpZGdldC0+c2F2ZWRfdmFsdWU7CisJCXJldHVybiAwOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJKHNuZF9zb2NfcmVhZCh3aWRnZXQtPmNvZGVjLCByZWcpID4+IHNoaWZ0KSAmIG1hc2s7CisJaWYgKHNoaWZ0ICE9IHJzaGlmdCkKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQkJKHNuZF9zb2NfcmVhZCh3aWRnZXQtPmNvZGVjLCByZWcpID4+IHJzaGlmdCkgJiBtYXNrOworCWlmIChpbnZlcnQpIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkJbWFzayAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQlpZiAoc2hpZnQgIT0gcnNoaWZ0KQorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQkJCW1hc2sgLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9nZXRfdm9sc3cpOworCisvKioKKyAqIHNuZF9zb2NfZGFwbV9wdXRfdm9sc3cgLSBkYXBtIG1peGVyIHNldCBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkYXBtIG1peGVyIGNvbnRyb2wuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19kYXBtX3B1dF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CisJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKKwlpbnQgcnNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDEyKSAmIDB4MGY7CisJaW50IG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKKwlpbnQgaW52ZXJ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDI0KSAmIDB4MDE7CisJdW5zaWduZWQgc2hvcnQgdmFsLCB2YWwyLCB2YWxfbWFzazsKKwlpbnQgcmV0OworCisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7CisKKwlpZiAoaW52ZXJ0KQorCQl2YWwgPSBtYXNrIC0gdmFsOworCXZhbF9tYXNrID0gbWFzayA8PCBzaGlmdDsKKwl2YWwgPSB2YWwgPDwgc2hpZnQ7CisJaWYgKHNoaWZ0ICE9IHJzaGlmdCkgeworCQl2YWwyID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgbWFzayk7CisJCWlmIChpbnZlcnQpCisJCQl2YWwyID0gbWFzayAtIHZhbDI7CisJCXZhbF9tYXNrIHw9IG1hc2sgPDwgcnNoaWZ0OworCQl2YWwgfD0gdmFsMiA8PCByc2hpZnQ7CisJfQorCisJbXV0ZXhfbG9jaygmd2lkZ2V0LT5jb2RlYy0+bXV0ZXgpOworCXdpZGdldC0+dmFsdWUgPSB2YWw7CisKKwkvKiBzYXZlIHZvbHVtZSB2YWx1ZSBpZiB0aGUgd2lkZ2V0IGlzIHBvd2VyZWQgZG93biAqLworCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9wZ2EgJiYgIXdpZGdldC0+cG93ZXIpIHsKKwkJd2lkZ2V0LT5zYXZlZF92YWx1ZSA9IHZhbDsKKwkJbXV0ZXhfdW5sb2NrKCZ3aWRnZXQtPmNvZGVjLT5tdXRleCk7CisJCXJldHVybiAxOworCX0KKworCWRhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldCwga2NvbnRyb2wsIHJlZywgdmFsX21hc2ssIHZhbCwgaW52ZXJ0KTsKKwlpZiAod2lkZ2V0LT5ldmVudCkgeworCQlpZiAod2lkZ2V0LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QUkVfUkVHKSB7CisJCQlyZXQgPSB3aWRnZXQtPmV2ZW50KHdpZGdldCwgU05EX1NPQ19EQVBNX1BSRV9SRUcpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCByZWcsIHZhbF9tYXNrLCB2YWwpOworCQlpZiAod2lkZ2V0LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QT1NUX1JFRykKKwkJCXJldCA9IHdpZGdldC0+ZXZlbnQod2lkZ2V0LCBTTkRfU09DX0RBUE1fUE9TVF9SRUcpOworCX0gZWxzZQorCQlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKHdpZGdldC0+Y29kZWMsIHJlZywgdmFsX21hc2ssIHZhbCk7CisKK291dDoKKwltdXRleF91bmxvY2soJndpZGdldC0+Y29kZWMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3B1dF92b2xzdyk7CisKKy8qKgorICogc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSAtIGRhcG0gZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgZ2V0IGNhbGxiYWNrCisgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKKyAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKgorICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRhcG0gZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgY29udHJvbC4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHZhbCwgYml0bWFzazsKKworCWZvciAoYml0bWFzayA9IDE7IGJpdG1hc2sgPCBlLT5tYXNrOyBiaXRtYXNrIDw8PSAxKQorCQk7CisJdmFsID0gc25kX3NvY19yZWFkKHdpZGdldC0+Y29kZWMsIGUtPnJlZyk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgPj4gZS0+c2hpZnRfbCkgJiAoYml0bWFzayAtIDEpOworCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpCisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPQorCQkJKHZhbCA+PiBlLT5zaGlmdF9yKSAmIChiaXRtYXNrIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUpOworCisvKioKKyAqIHNuZF9zb2NfZGFwbV9wdXRfZW51bV9kb3VibGUgLSBkYXBtIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIHNldCBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkYXBtIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGNvbnRyb2wuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCB2YWwsIG11eDsKKwl1bnNpZ25lZCBzaG9ydCBtYXNrLCBiaXRtYXNrOworCWludCByZXQgPSAwOworCisJZm9yIChiaXRtYXNrID0gMTsgYml0bWFzayA8IGUtPm1hc2s7IGJpdG1hc2sgPDw9IDEpCisJCTsKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPm1hc2sgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCXZhbCA9IG11eCA8PCBlLT5zaGlmdF9sOworCW1hc2sgPSAoYml0bWFzayAtIDEpIDw8IGUtPnNoaWZ0X2w7CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1hc2sgLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCB8PSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IGUtPnNoaWZ0X3I7CisJCW1hc2sgfD0gKGJpdG1hc2sgLSAxKSA8PCBlLT5zaGlmdF9yOworCX0KKworCW11dGV4X2xvY2soJndpZGdldC0+Y29kZWMtPm11dGV4KTsKKwl3aWRnZXQtPnZhbHVlID0gdmFsOworCWRhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQsIGtjb250cm9sLCBtYXNrLCBtdXgsIGUpOworCWlmICh3aWRnZXQtPmV2ZW50KSB7CisJCWlmICh3aWRnZXQtPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BSRV9SRUcpIHsKKwkJCXJldCA9IHdpZGdldC0+ZXZlbnQod2lkZ2V0LCBTTkRfU09DX0RBUE1fUFJFX1JFRyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKHdpZGdldC0+Y29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKKwkJaWYgKHdpZGdldC0+ZXZlbnRfZmxhZ3MgJiBTTkRfU09DX0RBUE1fUE9TVF9SRUcpCisJCQlyZXQgPSB3aWRnZXQtPmV2ZW50KHdpZGdldCwgU05EX1NPQ19EQVBNX1BPU1RfUkVHKTsKKwl9IGVsc2UKKwkJcmV0ID0gc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7CisKK291dDoKKwltdXRleF91bmxvY2soJndpZGdldC0+Y29kZWMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZSk7CisKKy8qKgorICogc25kX3NvY19kYXBtX25ld19jb250cm9sIC0gY3JlYXRlIG5ldyBkYXBtIGNvbnRyb2wKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqIEB3aWRnZXQ6IHdpZGdldCB0ZW1wbGF0ZQorICoKKyAqIENyZWF0ZXMgYSBuZXcgZGFwbSBjb250cm9sIGJhc2VkIHVwb24gdGhlIHRlbXBsYXRlLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBlbHNlIGVycm9yLgorICovCitpbnQgc25kX3NvY19kYXBtX25ld19jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3OworCisJaWYgKCh3ID0gZGFwbV9jbmV3X3dpZGdldCh3aWRnZXQpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXctPmNvZGVjID0gY29kZWM7CisJSU5JVF9MSVNUX0hFQUQoJnctPnNvdXJjZXMpOworCUlOSVRfTElTVF9IRUFEKCZ3LT5zaW5rcyk7CisJSU5JVF9MSVNUX0hFQUQoJnctPmxpc3QpOworCWxpc3RfYWRkKCZ3LT5saXN0LCAmY29kZWMtPmRhcG1fd2lkZ2V0cyk7CisKKwkvKiBtYWNoaW5lIGxheWVyIHNldCB1cHMgdW5jb25uZWN0ZWQgcGlucyBhbmQgaW5zZXJ0aW9ucyAqLworCXctPmNvbm5lY3RlZCA9IDE7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2wpOworCisvKioKKyAqIHNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQgLSBzZW5kIGEgc3RyZWFtIGV2ZW50IHRvIHRoZSBkYXBtIGNvcmUKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqIEBzdHJlYW06IHN0cmVhbSBuYW1lCisgKiBAZXZlbnQ6IHN0cmVhbSBldmVudAorICoKKyAqIFNlbmRzIGEgc3RyZWFtIGV2ZW50IHRvIHRoZSBkYXBtIGNvcmUuIFRoZSBjb3JlIHRoZW4gbWFrZXMgYW55CisgKiBuZWNlc3Nhcnkgd2lkZ2V0IHBvd2VyIGNoYW5nZXMuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGVsc2UgZXJyb3IuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwljaGFyICpzdHJlYW0sIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKKworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5kYXBtX3dpZGdldHMsIGxpc3QpCisJeworCQlpZiAoIXctPnNuYW1lKQorCQkJY29udGludWU7CisJCWRiZygid2lkZ2V0ICVzXG4gJXMgc3RyZWFtICVzIGV2ZW50ICVkXG4iLCB3LT5uYW1lLCB3LT5zbmFtZSwKKwkJCXN0cmVhbSwgZXZlbnQpOworCQlpZiAoc3Ryc3RyKHctPnNuYW1lLCBzdHJlYW0pKSB7CisJCQlzd2l0Y2goZXZlbnQpIHsKKwkJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9TVEFSVDoKKwkJCQl3LT5hY3RpdmUgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUT1A6CisJCQkJdy0+YWN0aXZlID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9TVVNQRU5EOgorCQkJCWlmICh3LT5hY3RpdmUpCisJCQkJCXctPnN1c3BlbmQgPSAxOworCQkJCXctPmFjdGl2ZSA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFNORF9TT0NfREFQTV9TVFJFQU1fUkVTVU1FOgorCQkJCWlmICh3LT5zdXNwZW5kKSB7CisJCQkJCXctPmFjdGl2ZSA9IDE7CisJCQkJCXctPnN1c3BlbmQgPSAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9QQVVTRV9QVVNIOgorCQkJCWJyZWFrOworCQkJY2FzZSBTTkRfU09DX0RBUE1fU1RSRUFNX1BBVVNFX1JFTEVBU0U6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJZGFwbV9wb3dlcl93aWRnZXRzKGNvZGVjLCBldmVudCk7CisJZHVtcF9kYXBtKGNvZGVjLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX3N0cmVhbV9ldmVudCk7CisKKy8qKgorICogc25kX3NvY19kYXBtX3NldF9lbmRwb2ludCAtIHNldCBhdWRpbyBlbmRwb2ludCBzdGF0dXMKKyAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqIEBlbmRwb2ludDogYXVkaW8gc2lnbmFsIGVuZHBvaW50IChvciBzdGFydCBwb2ludCkKKyAqIEBzdGF0dXM6IHBvaW50IHN0YXR1cworICoKKyAqIFNldCBhdWRpbyBlbmRwb2ludCBzdGF0dXMgLSBjb25uZWN0ZWQgb3IgZGlzY29ubmVjdGVkLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBlbHNlIGVycm9yLgorICovCitpbnQgc25kX3NvY19kYXBtX3NldF9lbmRwb2ludChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJY2hhciAqZW5kcG9pbnQsIGludCBzdGF0dXMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZjb2RlYy0+ZGFwbV93aWRnZXRzLCBsaXN0KSB7CisJCWlmICghc3RyY21wKHctPm5hbWUsIGVuZHBvaW50KSkgeworCQkJdy0+Y29ubmVjdGVkID0gc3RhdHVzOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fc2V0X2VuZHBvaW50KTsKKworLyoqCisgKiBzbmRfc29jX2RhcG1fZnJlZSAtIGZyZWUgZGFwbSByZXNvdXJjZXMKKyAqIEBzb2NkZXY6IFNvQyBkZXZpY2UKKyAqCisgKiBGcmVlIGFsbCBkYXBtIHdpZGdldHMgYW5kIHJlc291cmNlcy4KKyAqLwordm9pZCBzbmRfc29jX2RhcG1fZnJlZShzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCisJc25kX3NvY19kYXBtX3N5c19yZW1vdmUoc29jZGV2LT5kZXYpOworCWRhcG1fZnJlZV93aWRnZXRzKGNvZGVjKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9mcmVlKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJMaWFtIEdpcmR3b29kLCBsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20sIHd3dy53b2xmc29ubWljcm8uY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkR5bmFtaWMgQXVkaW8gUG93ZXIgTWFuYWdlbWVudCBjb3JlIGZvciBBTFNBIFNvQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvZGJyaS5jIGIvc291bmQvc3BhcmMvZGJyaS5jCmluZGV4IDRjZWIwOWQuLjI1YTJhNzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2RicmkuYworKysgYi9zb3VuZC9zcGFyYy9kYnJpLmMKQEAgLTY3OCw3ICs2NzgsNyBAQAogICogVGhlIEpVTVAgY21kIHBvaW50cyB0byB0aGUgbmV3IGNtZCBzdHJpbmcuCiAgKiBJdCBhbHNvIHJlbGVhc2VzIHRoZSBjbWRsb2NrIHNwaW5sb2NrLgogICoKLSAqIExvY2sgbXVzdCBub3QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzLgorICogTG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KICAqLwogc3RhdGljIHZvaWQgZGJyaV9jbWRzZW5kKHN0cnVjdCBzbmRfZGJyaSAqIGRicmksIHMzMiAqIGNtZCxpbnQgbGVuKQogewpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmMgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwppbmRleCAxOWJkY2M3Li40ZGZiOTFkIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uYworKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwpAQCAtMTg2LDYgKzE4Niw3IEBACiAJdTY0IGZvcm1hdHM7CQkJLyogZm9ybWF0IGJpdG1hc2tzIChhbGwgb3InZWQpICovCiAJdW5zaWduZWQgaW50IG51bV9mb3JtYXRzOwkJLyogbnVtYmVyIG9mIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzIChsaXN0KSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZm10X2xpc3Q7CS8qIGZvcm1hdCBsaXN0ICovCisJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IHJhdGVfbGlzdDsJLyogbGltaXRlZCByYXRlcyAqLwogCXNwaW5sb2NrX3QgbG9jazsKIAogCXN0cnVjdCBzbmRfdXJiX29wcyBvcHM7CQkvKiBjYWxsYmFja3MgKG11c3QgYmUgZmlsbGVkIGF0IGluaXQpICovCkBAIC0yNTMsNyArMjU0LDcgQEAKIAkJCQkgICAgc3RydWN0IHVyYiAqdXJiKQogewogCXVuc2lnbmVkIGNoYXIgKmNwID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSAoc3RydWN0IHNuZF91cmJfY3R4ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwogCiAJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KIAl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IDM7CkBAIC0yNzUsNyArMjc2LDcgQEAKIAkJCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQogewogCXVuc2lnbmVkIGNoYXIgKmNwID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSAoc3RydWN0IHNuZF91cmJfY3R4ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwogCiAJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KIAl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IDQ7CkBAIC0zMTMsNyArMzE0LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJaW50IGksIG9mZnM7Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSAoc3RydWN0IHNuZF91cmJfY3R4ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwogCiAJb2ZmcyA9IDA7CiAJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KQEAgLTM5MSw2ICszOTIsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFByb2Nlc3MgYWZ0ZXIgY2FwdHVyZSBjb21wbGV0ZSB3aGVuIHBhdXNlZC4gIE5vdGhpbmcgdG8gZG8uCisgKi8KK3N0YXRpYyBpbnQgcmV0aXJlX3BhdXNlZF9jYXB0dXJlX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAorCQkJCSAgICAgc3RydWN0IHVyYiAqdXJiKQoreworCXJldHVybiAwOworfQorCiAKIC8qCiAgKiBwcmVwYXJlIHVyYiBmb3IgZnVsbCBzcGVlZCBwbGF5YmFjayBzeW5jIHBpcGUKQEAgLTQwMiw3ICs0MTMsNyBAQAogCQkJCSAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKIAkJCQkgICAgIHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IChzdHJ1Y3Qgc25kX3VyYl9jdHggKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7CiAKIAl1cmItPmRldiA9IGN0eC0+c3Vicy0+ZGV2OyAvKiB3ZSBuZWVkIHRvIHNldCB0aGlzIGF0IGVhY2ggdGltZSAqLwogCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ubGVuZ3RoID0gMzsKQEAgLTQyMCw3ICs0MzEsNyBAQAogCQkJCQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAogCQkJCQlzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSAoc3RydWN0IHNuZF91cmJfY3R4ICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwogCiAJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KIAl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IDQ7CkBAIC00OTMsMTMgKzUwNCwxMyBAQAogfQogCiAvKgotICogUHJlcGFyZSB1cmIgZm9yIHN0cmVhbWluZyBiZWZvcmUgcGxheWJhY2sgc3RhcnRzLgorICogUHJlcGFyZSB1cmIgZm9yIHN0cmVhbWluZyBiZWZvcmUgcGxheWJhY2sgc3RhcnRzIG9yIHdoZW4gcGF1c2VkLgogICoKLSAqIFdlIGRvbid0IHlldCBoYXZlIGRhdGEsIHNvIHdlIHNlbmQgYSBmcmFtZSBvZiBzaWxlbmNlLgorICogV2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSwgc28gd2Ugc2VuZCBhIGZyYW1lIG9mIHNpbGVuY2UuCiAgKi8KLXN0YXRpYyBpbnQgcHJlcGFyZV9zdGFydHVwX3BsYXliYWNrX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkJCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCi0JCQkJCXN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBpbnQgcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKKwkJCQkgICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKKwkJCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQogewogCXVuc2lnbmVkIGludCBpLCBvZmZzLCBjb3VudHM7CiAJc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7CkBAIC01MzcsNyArNTQ4LDcgQEAKIAl1bnNpZ25lZCBpbnQgY291bnRzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHBlcmlvZF9lbGFwc2VkID0gMDsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IChzdHJ1Y3Qgc25kX3VyYl9jdHggKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7CiAKIAlzdHJpZGUgPSBydW50aW1lLT5mcmFtZV9iaXRzID4+IDM7CiAKQEAgLTYyMiw3ICs2MzMsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IHNuZF91cmJfb3BzIGF1ZGlvX3VyYl9vcHNbMl0gPSB7CiAJewotCQkucHJlcGFyZSA9CXByZXBhcmVfc3RhcnR1cF9wbGF5YmFja191cmIsCisJCS5wcmVwYXJlID0JcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiLAogCQkucmV0aXJlID0JcmV0aXJlX3BsYXliYWNrX3VyYiwKIAkJLnByZXBhcmVfc3luYyA9CXByZXBhcmVfcGxheWJhY2tfc3luY191cmIsCiAJCS5yZXRpcmVfc3luYyA9CXJldGlyZV9wbGF5YmFja19zeW5jX3VyYiwKQEAgLTYzNyw3ICs2NDgsNyBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF91cmJfb3BzIGF1ZGlvX3VyYl9vcHNfaGlnaF9zcGVlZFsyXSA9IHsKIAl7Ci0JCS5wcmVwYXJlID0JcHJlcGFyZV9zdGFydHVwX3BsYXliYWNrX3VyYiwKKwkJLnByZXBhcmUgPQlwcmVwYXJlX25vZGF0YV9wbGF5YmFja191cmIsCiAJCS5yZXRpcmUgPQlyZXRpcmVfcGxheWJhY2tfdXJiLAogCQkucHJlcGFyZV9zeW5jID0JcHJlcGFyZV9wbGF5YmFja19zeW5jX3VyYl9ocywKIAkJLnJldGlyZV9zeW5jID0JcmV0aXJlX3BsYXliYWNrX3N5bmNfdXJiX2hzLApAQCAtNjU1LDcgKzY2Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNuZF9jb21wbGV0ZV91cmIoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gKHN0cnVjdCBzbmRfdXJiX2N0eCAqKXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMgPSBjdHgtPnN1YnM7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBjdHgtPnN1YnMtPnBjbV9zdWJzdHJlYW07CiAJaW50IGVyciA9IDA7CkBAIC02NzgsNyArNjg5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgc25kX2NvbXBsZXRlX3N5bmNfdXJiKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IChzdHJ1Y3Qgc25kX3VyYl9jdHggKil1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzID0gY3R4LT5zdWJzOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gY3R4LT5zdWJzLT5wY21fc3Vic3RyZWFtOwogCWludCBlcnIgPSAwOwpAQCAtOTI1LDEwICs5MzYsMTQgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CiAJCXN1YnMtPm9wcy5wcmVwYXJlID0gcHJlcGFyZV9wbGF5YmFja191cmI7CiAJCXJldHVybiAwOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAkJcmV0dXJuIGRlYWN0aXZhdGVfdXJicyhzdWJzLCAwLCAwKTsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXN1YnMtPm9wcy5wcmVwYXJlID0gcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiOworCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05NDQsOSArOTU5LDE2IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCXN1YnMtPm9wcy5yZXRpcmUgPSByZXRpcmVfY2FwdHVyZV91cmI7CiAJCXJldHVybiBzdGFydF91cmJzKHN1YnMsIHN1YnN0cmVhbS0+cnVudGltZSk7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCQlyZXR1cm4gZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDApOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJc3Vicy0+b3BzLnJldGlyZSA9IHJldGlyZV9wYXVzZWRfY2FwdHVyZV91cmI7CisJCXJldHVybiAwOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJc3Vicy0+b3BzLnJldGlyZSA9IHJldGlyZV9jYXB0dXJlX3VyYjsKKwkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTQwOCw3ICsxNDMwLDcgQEAKIHN0YXRpYyBpbnQgc25kX3VzYl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogewotCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IChzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZtdDsKIAl1bnNpZ25lZCBpbnQgY2hhbm5lbHMsIHJhdGUsIGZvcm1hdDsKIAlpbnQgcmV0LCBjaGFuZ2VkOwpAQCAtMTQ2NCw3ICsxNDg2LDcgQEAKICAqLwogc3RhdGljIGludCBzbmRfdXNiX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0Jc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzID0gKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqKXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCiAJc3Vicy0+Y3VyX2F1ZGlvZm10ID0gTlVMTDsKIAlzdWJzLT5jdXJfcmF0ZSA9IDA7CkBAIC0xNTA1LDMzICsxNTI3LDIwIEBACiAJLyogZm9yIHBsYXliYWNrLCBzdWJtaXQgdGhlIFVSQnMgbm93OyBvdGhlcndpc2UsIHRoZSBmaXJzdCBod3B0cl9kb25lCiAJICogdXBkYXRlcyBmb3IgYWxsIFVSQnMgd291bGQgaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBzdGFydGluZyAqLwogCWlmIChzdWJzLT5kaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlzdWJzLT5vcHMucHJlcGFyZSA9IHByZXBhcmVfc3RhcnR1cF9wbGF5YmFja191cmI7CisJCXN1YnMtPm9wcy5wcmVwYXJlID0gcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiOwogCQlyZXR1cm4gc3RhcnRfdXJicyhzdWJzLCBydW50aW1lKTsKIAl9IGVsc2UKIAkJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfdXNiX3BsYXliYWNrID0KK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfdXNiX2hhcmR3YXJlID0KIHsKIAkuaW5mbyA9CQkJU05EUlZfUENNX0lORk9fTU1BUCB8CiAJCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CiAJCQkJU05EUlZfUENNX0lORk9fQkFUQ0ggfAogCQkJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiwKLQkuYnVmZmVyX2J5dGVzX21heCA9CTEwMjQgKiAxMDI0LAotCS5wZXJpb2RfYnl0ZXNfbWluID0JNjQsCi0JLnBlcmlvZF9ieXRlc19tYXggPQk1MTIgKiAxMDI0LAotCS5wZXJpb2RzX21pbiA9CQkyLAotCS5wZXJpb2RzX21heCA9CQkxMDI0LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF91c2JfY2FwdHVyZSA9Ci17Ci0JLmluZm8gPQkJCVNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCVNORFJWX1BDTV9JTkZPX0JBVENIIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIsCisJCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFLAogCS5idWZmZXJfYnl0ZXNfbWF4ID0JMTAyNCAqIDEwMjQsCiAJLnBlcmlvZF9ieXRlc19taW4gPQk2NCwKIAkucGVyaW9kX2J5dGVzX21heCA9CTUxMiAqIDEwMjQsCkBAIC0xODEwLDI4ICsxODE5LDMzIEBACiBzdGF0aWMgaW50IHNuZF91c2JfcGNtX2NoZWNrX2tub3Qoc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKIAkJCQkgIHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCXN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c19yYXRlczsKKwlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwOworCWludCBjb3VudCA9IDAsIG5lZWRzX2tub3QgPSAwOwogCWludCBlcnI7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZzdWJzLT5mbXRfbGlzdCkgewotCQlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwOwotCQlmcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGF1ZGlvZm9ybWF0LCBsaXN0KTsKLQotCQlpZiAoIWZwLT5uZWVkc19rbm90KQotCQkJY29udGludWU7Ci0KLQkJY29uc3RyYWludHNfcmF0ZXMuY291bnQgPSBmcC0+bnJfcmF0ZXM7Ci0JCWNvbnN0cmFpbnRzX3JhdGVzLmxpc3QgPSBmcC0+cmF0ZV90YWJsZTsKLQkJY29uc3RyYWludHNfcmF0ZXMubWFzayA9IDA7Ci0KLQkJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKLQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAotCQkJJmNvbnN0cmFpbnRzX3JhdGVzKTsKLQotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmcCwgJnN1YnMtPmZtdF9saXN0LCBsaXN0KSB7CisJCWlmIChmcC0+cmF0ZXMgJiBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTKQorCQkJcmV0dXJuIDA7CisJCWNvdW50ICs9IGZwLT5ucl9yYXRlczsKKwkJaWYgKGZwLT5uZWVkc19rbm90KQorCQkJbmVlZHNfa25vdCA9IDE7CiAJfQorCWlmICghbmVlZHNfa25vdCkKKwkJcmV0dXJuIDA7CisKKwlzdWJzLT5yYXRlX2xpc3QuY291bnQgPSBjb3VudDsKKwlzdWJzLT5yYXRlX2xpc3QubGlzdCA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiBjb3VudCwgR0ZQX0tFUk5FTCk7CisJc3Vicy0+cmF0ZV9saXN0Lm1hc2sgPSAwOworCWNvdW50ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZwLCAmc3Vicy0+Zm10X2xpc3QsIGxpc3QpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBmcC0+bnJfcmF0ZXM7IGkrKykKKwkJCXN1YnMtPnJhdGVfbGlzdC5saXN0W2NvdW50KytdID0gZnAtPnJhdGVfdGFibGVbaV07CisJfQorCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCQkgJnN1YnMtPnJhdGVfbGlzdCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MDQsOCArMTkxOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX3VzYl9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGRpcmVjdGlvbiwKLQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSAqaHcpCitzdGF0aWMgaW50IHNuZF91c2JfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBkaXJlY3Rpb24pCiB7CiAJc3RydWN0IHNuZF91c2Jfc3RyZWFtICphcyA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwpAQCAtMTkxMyw3ICsxOTI2LDcgQEAKIAogCXN1YnMtPmludGVyZmFjZSA9IC0xOwogCXN1YnMtPmZvcm1hdCA9IDA7Ci0JcnVudGltZS0+aHcgPSAqaHc7CisJcnVudGltZS0+aHcgPSBzbmRfdXNiX2hhcmR3YXJlOwogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHN1YnM7CiAJc3Vicy0+cGNtX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlyZXR1cm4gc2V0dXBfaHdfaW5mbyhydW50aW1lLCBzdWJzKTsKQEAgLTE5MzQsNyArMTk0Nyw3IEBACiAKIHN0YXRpYyBpbnQgc25kX3VzYl9wbGF5YmFja19vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCXJldHVybiBzbmRfdXNiX3BjbV9vcGVuKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF91c2JfcGxheWJhY2spOworCXJldHVybiBzbmRfdXNiX3BjbV9vcGVuKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3VzYl9wbGF5YmFja19jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTE5NDQsNyArMTk1Nyw3IEBACiAKIHN0YXRpYyBpbnQgc25kX3VzYl9jYXB0dXJlX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0JcmV0dXJuIHNuZF91c2JfcGNtX29wZW4oc3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfdXNiX2NhcHR1cmUpOworCXJldHVybiBzbmRfdXNiX3BjbV9vcGVuKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKIH0KIAogc3RhdGljIGludCBzbmRfdXNiX2NhcHR1cmVfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC0yMjMxLDYgKzIyNDQsNyBAQAogCQlrZnJlZShmcC0+cmF0ZV90YWJsZSk7CiAJCWtmcmVlKGZwKTsKIAl9CisJa2ZyZWUoc3Vicy0+cmF0ZV9saXN0Lmxpc3QpOwogfQogCiAKQEAgLTI0NTYsNiArMjQ3MCw3IEBACiAJCSAqIGJ1aWxkIHRoZSByYXRlIHRhYmxlIGFuZCBiaXRtYXAgZmxhZ3MKIAkJICovCiAJCWludCByLCBpZHgsIGM7CisJCXVuc2lnbmVkIGludCBub256ZXJvX3JhdGVzID0gMDsKIAkJLyogdGhpcyB0YWJsZSBjb3JyZXNwb25kcyB0byB0aGUgU05EUlZfUENNX1JBVEVfWFhYIGJpdCAqLwogCQlzdGF0aWMgdW5zaWduZWQgaW50IGNvbnZfcmF0ZXNbXSA9IHsKIAkJCTU1MTIsIDgwMDAsIDExMDI1LCAxNjAwMCwgMjIwNTAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsCkBAIC0yNDc4LDYgKzI0OTMsNyBAQAogCQkJICAgIGZwLT5hbHRzZXR0aW5nID09IDUgJiYgZnAtPm1heHBhY2tzaXplID09IDM5MikKIAkJCQlyYXRlID0gOTYwMDA7CiAJCQlmcC0+cmF0ZV90YWJsZVtyXSA9IHJhdGU7CisJCQlub256ZXJvX3JhdGVzIHw9IHJhdGU7CiAJCQlpZiAocmF0ZSA8IGZwLT5yYXRlX21pbikKIAkJCQlmcC0+cmF0ZV9taW4gPSByYXRlOwogCQkJZWxzZSBpZiAocmF0ZSA+IGZwLT5yYXRlX21heCkKQEAgLTI0OTMsNiArMjUwOSwxMCBAQAogCQkJaWYgKCFmb3VuZCkKIAkJCQlmcC0+bmVlZHNfa25vdCA9IDE7CiAJCX0KKwkJaWYgKCFub256ZXJvX3JhdGVzKSB7CisJCQlod2NfZGVidWcoIkFsbCByYXRlcyB3ZXJlIHplcm8uIFNraXBwaW5nIGZvcm1hdCFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CiAJCWlmIChmcC0+bmVlZHNfa25vdCkKIAkJCWZwLT5yYXRlcyB8PSBTTkRSVl9QQ01fUkFURV9LTk9UOwogCX0gZWxzZSB7CkBAIC0zMDU3LDYgKzMwNzcsNTggQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIENyZWF0ZSBhIHN0cmVhbSBmb3IgYW4gRWRpcm9sIFVBLTEwMSBpbnRlcmZhY2UuCisgKiBDb3B5LCBwYXN0ZSBhbmQgbW9kaWZ5IGZyb20gRWRpcm9sIFVBLTEwMDAKKyAqLworc3RhdGljIGludCBjcmVhdGVfdWExMDFfcXVpcmsoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsCisJCQkgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrICpxdWlyaykKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF1ZGlvZm9ybWF0IHVhMTAxX2Zvcm1hdCA9IHsKKwkJLmZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFLAorCQkuZm10X3R5cGUgPSBVU0JfRk9STUFUX1RZUEVfSSwKKwkJLmFsdHNldHRpbmcgPSAxLAorCQkuYWx0c2V0X2lkeCA9IDEsCisJCS5hdHRyaWJ1dGVzID0gMCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUywKKwl9OworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdHM7CisJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqYWx0c2Q7CisJc3RydWN0IGF1ZGlvZm9ybWF0ICpmcDsKKwlpbnQgc3RyZWFtLCBlcnI7CisKKwlpZiAoaWZhY2UtPm51bV9hbHRzZXR0aW5nICE9IDIpCisJCXJldHVybiAtRU5YSU87CisJYWx0cyA9ICZpZmFjZS0+YWx0c2V0dGluZ1sxXTsKKwlhbHRzZCA9IGdldF9pZmFjZV9kZXNjKGFsdHMpOworCWlmIChhbHRzLT5leHRyYWxlbiAhPSAxOCB8fCBhbHRzLT5leHRyYVsxXSAhPSBVU0JfRFRfQ1NfSU5URVJGQUNFIHx8CisJICAgIGFsdHNkLT5iTnVtRW5kcG9pbnRzICE9IDEpCisJCXJldHVybiAtRU5YSU87CisKKwlmcCA9IGttZW1kdXAoJnVhMTAxX2Zvcm1hdCwgc2l6ZW9mKCpmcCksIEdGUF9LRVJORUwpOworCWlmICghZnApCisJCXJldHVybiAtRU5PTUVNOworCisJZnAtPmNoYW5uZWxzID0gYWx0cy0+ZXh0cmFbMTFdOworCWZwLT5pZmFjZSA9IGFsdHNkLT5iSW50ZXJmYWNlTnVtYmVyOworCWZwLT5lbmRwb2ludCA9IGdldF9lbmRwb2ludChhbHRzLCAwKS0+YkVuZHBvaW50QWRkcmVzczsKKwlmcC0+ZXBfYXR0ciA9IGdldF9lbmRwb2ludChhbHRzLCAwKS0+Ym1BdHRyaWJ1dGVzOworCWZwLT5tYXhwYWNrc2l6ZSA9IGxlMTZfdG9fY3B1KGdldF9lbmRwb2ludChhbHRzLCAwKS0+d01heFBhY2tldFNpemUpOworCWZwLT5yYXRlX21heCA9IGZwLT5yYXRlX21pbiA9IGNvbWJpbmVfdHJpcGxlKCZhbHRzLT5leHRyYVsxNV0pOworCisJc3RyZWFtID0gKGZwLT5lbmRwb2ludCAmIFVTQl9ESVJfSU4pCisJCT8gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFIDogU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKwllcnIgPSBhZGRfYXVkaW9fZW5kcG9pbnQoY2hpcCwgc3RyZWFtLCBmcCk7CisJaWYgKGVyciA8IDApIHsKKwkJa2ZyZWUoZnApOworCQlyZXR1cm4gZXJyOworCX0KKwkvKiBGSVhNRTogcGxheWJhY2sgbXVzdCBiZSBzeW5jaHJvbml6ZWQgdG8gY2FwdHVyZSAqLworCXVzYl9zZXRfaW50ZXJmYWNlKGNoaXAtPmRldiwgZnAtPmlmYWNlLCAwKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzbmRfdXNiX2NyZWF0ZV9xdWlyayhzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwKIAkJCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsCiAJCQkJY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmsgKnF1aXJrKTsKQEAgLTMyMzgsNiArMzMxMCw3IEBACiAJCVtRVUlSS19BVURJT19GSVhFRF9FTkRQT0lOVF0gPSBjcmVhdGVfZml4ZWRfc3RyZWFtX3F1aXJrLAogCQlbUVVJUktfQVVESU9fRURJUk9MX1VBNzAwX1VBMjVdID0gY3JlYXRlX3VhNzAwX3VhMjVfcXVpcmssCiAJCVtRVUlSS19BVURJT19FRElST0xfVUExMDAwXSA9IGNyZWF0ZV91YTEwMDBfcXVpcmssCisJCVtRVUlSS19BVURJT19FRElST0xfVUExMDFdID0gY3JlYXRlX3VhMTAxX3F1aXJrLAogCX07CiAKIAlpZiAocXVpcmstPnR5cGUgPCBRVUlSS19UWVBFX0NPVU5UKSB7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNiYXVkaW8uaCBiL3NvdW5kL3VzYi91c2JhdWRpby5oCmluZGV4IDBmNGIyYjguLjIyNzJmNDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JhdWRpby5oCisrKyBiL3NvdW5kL3VzYi91c2JhdWRpby5oCkBAIC0xNTksNiArMTU5LDcgQEAKIAlRVUlSS19BVURJT19GSVhFRF9FTkRQT0lOVCwKIAlRVUlSS19BVURJT19FRElST0xfVUE3MDBfVUEyNSwKIAlRVUlSS19BVURJT19FRElST0xfVUExMDAwLAorCVFVSVJLX0FVRElPX0VESVJPTF9VQTEwMSwKIAogCVFVSVJLX1RZUEVfQ09VTlQKIH07CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNicXVpcmtzLmggYi9zb3VuZC91c2IvdXNicXVpcmtzLmgKaW5kZXggYTdlOTU2My4uMjViNGFiNCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYnF1aXJrcy5oCisrKyBiL3NvdW5kL3VzYi91c2JxdWlya3MuaApAQCAtMTA5OCw3ICsxMDk4LDM3IEBACiAJCX0KIAl9CiB9LAotCS8qIFRPRE86IGFkZCBFZGlyb2wgVUEtMTAxIHN1cHBvcnQgKi8KKy8qIFJvbGFuZCBVQS0xMDEgaW4gSGlnaC1TcGVlZCBNb2RlIG9ubHkgKi8KK3sKKwlVU0JfREVWSUNFKDB4MDU4MiwgMHgwMDdkKSwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJiAoY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmspIHsKKwkJLnZlbmRvcl9uYW1lID0gIlJvbGFuZCIsCisJCS5wcm9kdWN0X25hbWUgPSAiVUEtMTAxIiwKKwkJLmlmbnVtID0gUVVJUktfQU5ZX0lOVEVSRkFDRSwKKwkJLnR5cGUgPSBRVUlSS19DT01QT1NJVEUsCisJCS5kYXRhID0gKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrW10pIHsKKwkJCXsKKwkJCQkuaWZudW0gPSAwLAorCQkJCS50eXBlID0gUVVJUktfQVVESU9fRURJUk9MX1VBMTAxCisJCQl9LAorCQkJeworCQkJCS5pZm51bSA9IDEsCisJCQkJLnR5cGUgPSBRVUlSS19BVURJT19FRElST0xfVUExMDEKKwkJCX0sCisJCQl7CisJCQkJLmlmbnVtID0gMiwKKwkJCQkudHlwZSA9IFFVSVJLX01JRElfRklYRURfRU5EUE9JTlQsCisJCQkJLmRhdGEgPSAmIChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9taWRpX2VuZHBvaW50X2luZm8pIHsKKwkJCQkJLm91dF9jYWJsZXMgPSAweDAwMDEsCisJCQkJCS5pbl9jYWJsZXMgID0gMHgwMDAxCisJCQkJfQorCQkJfSwKKwkJCXsKKwkJCQkuaWZudW0gPSAtMQorCQkJfQorCQl9CisJfQorfSwKIHsKIAkvKiBoYXMgSUQgMHgwMDgxIHdoZW4gbm90IGluICJBZHZhbmNlZCBEcml2ZXIiIG1vZGUgKi8KIAlVU0JfREVWSUNFKDB4MDU4MiwgMHgwMDgwKSwK